C#TCP侦听器崩溃

C#TCP侦听器崩溃,c#,tcp,tcpclient,tcplistener,C#,Tcp,Tcpclient,Tcplistener,TCP侦听器在多次(随机)发送消息时崩溃,并引发此异常,有任何解决方案可以修复它吗 例外情况如下: System.IO.IOException: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. --- > System.Net.Sockets.SocketException: An e

TCP侦听器在多次(随机)发送消息时崩溃,并引发此异常,有任何解决方案可以修复它吗

例外情况如下:

System.IO.IOException: Unable to read data from the transport connection: An 
established connection was aborted by the software in your host machine. ---
> System.Net.Sockets.SocketException: An established connection was aborted 
by the software in your host machine

at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 
size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 
size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 
size)
static string serverstatus = "0";

try
{

server.Start();

Byte[] bytes = new Byte[256];
String data = null;

while (true)
{
    TcpClient client = server.AcceptTcpClient();

    data = null;

    NetworkStream stream = client.GetStream();

    int i;

    //THROW THE ERROR
    while ((i = stream.Read(bytes, 0, bytes.Length)) > 0)
    {
        data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
        if (data != "0" && data != serverstatus)
        {
             serverstatus = data;
             Console.WriteLine("Current Status is: " + serverstatus);
        }

data = serverstatus.ToUpper();

byte[] msg = System.Text.Encoding.ASCII.GetBytes(serverstatus);

stream.Write(msg, 0, msg.Length);
Console.WriteLine("Server Sending Back: {0}", serverstatus);
         }
    }
}
catch (Exception _ex)
{
     Console.WriteLine(_ex.ToString());
     Console.ReadKey();
}
这是我的TCP侦听器代码(标记了引发异常的错误行):


NET API通过一个异常公开一个关闭的或失败的连接,您在这里遇到了这个异常。您需要处理异常(关闭流、清理东西等),然后继续处理下一个客户机

顺便说一下:

stream.Read(bytes,0,bytes.Length)
不会准确读取
bytes.Length
bytes,而是读取介于1和
bytes.Length之间的任何内容。如果您需要的字节数正好是这个数量,则需要在循环中调用它


如果
serverStatus
不完全是
bytes.Length
bytes,协议也会丢失一些帧信息,因为客户端在尝试将数据解码为消息之前可能不知道实际读取数据需要多长时间。

您看了这个问题吗?