TcpClient / TcpListener-远程主机强行关闭了现有连接

时间:2019-10-08 17:44:09

标签: c# tcpclient tcplistener

我正在做一些与tcp相关的应用程序,我发现对我来说很奇怪的行为。 TcpClient正在通过流向TcpListener发送4字节数组,此侦听器应对此进行处理。但是,如果nwStream.Read(bytesToRead, 0, 4)之类的流上没有任何读取操作,则TcpClient有时会显示

  

无法从传输连接中读取数据:现有连接由于远程主机错误而被强制关闭。

并非每次都会发生此错误,并且通常可以毫无问题地传递数据。还有另一种方法可以使应用程序“正确”地工作,在这种情况下,TcpClient还将总是获取正确的数据-在将数据发送回客户端之前,向TcpListener添加Console.WriteLine()语句。似乎减慢了stream.Write()应用程序中TcpListener的执行速度,从而使通信无法正常工作。

下面提供的代码应显示错误。 TcpListener有两段代码已注释。从其中任何一个中删除注释都可以解决该错误。我试图简化代码,因此大多数值都是固定的。

TcpClient:

while (true)
{
    try
    {
        TcpClient client = new TcpClient("127.0.0.1", 5556);
        NetworkStream nwStream = client.GetStream();
        byte[] message = new byte[4] { 11, 22, 33, 44 };

        nwStream.Write(message, 0, message.Length);

        byte[] bytesToRead = new byte[4];
        int bytesRead = nwStream.Read(bytesToRead, 0, 4);

        for (int i = 0; i < bytesRead; i++)
        {
            Console.WriteLine(bytesToRead[i].ToString());
        }
        client.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    Thread.Sleep(1);
}

TcpListener

TcpListener listener = new TcpListener(IPAddress.Any, 5556);
listener.Start();
while (true)
{
    TcpClient client = listener.AcceptTcpClient();
    NetworkStream nwStream = client.GetStream();

    //1
    //byte[] bytesToRead = new byte[4];
    //int bytesRead = nwStream.Read(bytesToRead, 0, 4);

    //2
    //Console.WriteLine();
    //Console.WriteLine();

    byte[] arr = new byte[4] { 1, 2, 3, 4 };
    nwStream.Write(arr, 0, 4);
    client.Close();
}

总结一下:您知道为什么从流中读取所有数据或添加ConsoleWriteLine()会导致正确的数据流吗?还有其他方法来确保不会关闭连接并且不会发生此错误吗?

0 个答案:

没有答案