我正在做一些与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()
会导致正确的数据流吗?还有其他方法来确保不会关闭连接并且不会发生此错误吗?