"无法从传输连接中读取数据" - C#

Jam*_*ing 5 .net c# networking

我开始在网络编程领域沾沾自喜,我最近在讲师教程中遇到了一个相当古老的样本(或者我告诉过).

我们在大学的计算机上试过它,但它不起作用,所以讲师认为它是由Windows 7或大学计算机系统设置的安全设置.

渴望找到原因我决定在家里自己的电脑上运行相同的代码,毫不奇怪它没有用.

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

应用程序工作,直到服务器确认它已连接到客户端,但它会引发一个异常(捕获和处理)与文本:

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

现在,我刚刚开始使用C#进行网络编程,我不确定在哪里看,我的讲师说他会在下周的讲座中找到解决问题的原因和解决方案,但我想采取一些措施并找出自己.

我已经添加了Client.cs和Server.cs类以防它们有用,调试器建议原因在于Server.cs中的第27行,对streamReader.Readline()的调用;

注意:这绝不是家庭作业,我只是好奇为什么它不起作用.称之为学习经历=]

Client.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Server.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()) ;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 2

尝试这个服务器代码:

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();
Run Code Online (Sandbox Code Playgroud)

它侦听端口 1234,接受一个客户端,创建一个 StreamReader 并输出客户端发送的所有行,直到客户端关闭连接。然后它停止监听并退出。

using正如您所看到的,只创建了一个 StreamReader(不是为每一行重复创建),并且在完成后,TcpClient 和 StreamReader 都由该语句释放。


您的客户端代码应该可以工作。不过,将这些对象也放置在这里也是一个好主意:

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();
}
Run Code Online (Sandbox Code Playgroud)