代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

“无法从传输连接读取数据”-C#

  •  5
  • Jamie Keeling  · 技术社区  · 14 年前

    我开始涉足网络编程领域,最近我遇到了一个相当老的例子,来自讲师教程(或者我听说是这样)。

    急于找到原因,我决定在家里自己的电脑上运行相同的代码,毫不奇怪,它不起作用。

    解决方案中有两个项目,一个作为客户机,另一个作为服务器。一旦服务器和客户机都彼此连接,客户机就会向服务器发送一个简单的字符串,并将其打印到控制台。在此之后,相应的连接关闭,应用程序正常退出。

    应用程序工作到服务器确认它已连接到客户机,但它抛出一个异常(捕获并处理),文本如下:

    无法从传输连接读取数据:远程主机已强制关闭现有连接。- (System.IO.IOException异常)

    现在我刚开始用C语言进行网络编程,我不太清楚该去哪里找,我的讲师说他会在下周的讲座中找出问题的原因和解决方法,但我想采取一些主动行动,找出我自己。

    我添加了客户端.cs以及服务器.cs类,以防它们有帮助,调试器建议原因位于中的第27行服务器.cs,呼叫streamReader.Readline文件();

    :这根本不是家庭作业,我只是好奇为什么它不起作用。称之为学习体验=]

    客户端.cs

    using System;
    using System.Net.Sockets;
    using System.IO;
    
    namespace NetworkProgrammingTutorial1Client
    {
        class Client
        {
            static void Main(string[] args)
            {
                TcpClient myclient;
    
                try
                {
                    // Create a TcpClient to talk to the local host.
                    myclient = new TcpClient("localhost", 1234);
                }
                catch
                {
                    Console.WriteLine("Failed to connect to the server.");
                    return;
                }
    
                // get a Network stream from the server
                NetworkStream networkStream = myclient.GetStream();
                StreamWriter streamWriter = new StreamWriter(networkStream);
    
                streamWriter.WriteLine("Have a message.");
                streamWriter.Flush();
            }
        }
    }
    

    服务器.cs

    using System;
    using System.Net.Sockets;
    using System.Net;
    using System.IO;
    
    namespace NetworkProgrammingTutorial1Server
    {
        class Server
        {
            static void Main(string[] args)
            {
                // TcpListener is listening on the given port...                                                 {
                TcpListener tcpListener = new TcpListener(1234);
                tcpListener.Start();     
                Console.WriteLine("Server Started") ;                  
                // Accepts a new connection...
                Socket socketForClient = tcpListener.AcceptSocket();                   
                try
                {
                    if (socketForClient.Connected)
                    {
                        while (true)
                        {
                            Console.WriteLine("Client connected");
                            NetworkStream networkStream = new NetworkStream(socketForClient);
                            StreamReader streamReader = new StreamReader(networkStream);
                            string line = streamReader.ReadLine();
                            if (line == null)
                                break;
                            Console.WriteLine(line);
                        }
                    }
    
                    socketForClient.Close();               
                    Console.WriteLine("Exiting...");
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.ToString()) ;
                }
            }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   dtb    14 年前

    尝试此服务器代码:

    TcpListener listener = new TcpListener(IPAddress.Any, 1234);
    listener.Start();     
    
    using (TcpClient client = listener.AcceptTcpClient())
    using (StreamReader reader = new StreamReader(client.GetStream()))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }
    
    listener.Stop();
    

    如您所见,只创建了一个StreamReader(不是每行重复创建),TcpClient和StreamReader都由 using 完成后的声明。


    using (TcpClient client = new TcpClient("localhost", 1234))
    using (StreamWriter writer = new StreamWriter(client.GetStream()))
    {
        writer.WriteLine("Have a message.");
        writer.Flush();
    
        writer.WriteLine("Have another message.");
        writer.Flush();
    }