C# TCP 侦听器崩溃
C# TCP Listener crashing
多次(随机)发送消息时,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)
这是我的 TCP 侦听器代码(标记了抛出异常的错误行):
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();
}
.NET API 通过您在此处遇到的异常公开关闭或失败的连接。您需要处理异常(关闭流、清理事物等)并继续处理下一个客户端。
顺便说一句:
stream.Read(bytes, 0, bytes.Length)
不会准确读取 bytes.Length
字节,而是 1 到 bytes.Length
字节之间的任何内容。如果您恰好需要那么多字节,则需要在循环中调用它。
如果 serverStatus
不完全是 bytes.Length
字节,协议也会丢失一些帧信息,因为客户端可能不知道在尝试将数据解码为留言。
多次(随机)发送消息时,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)
这是我的 TCP 侦听器代码(标记了抛出异常的错误行):
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();
}
.NET API 通过您在此处遇到的异常公开关闭或失败的连接。您需要处理异常(关闭流、清理事物等)并继续处理下一个客户端。
顺便说一句:
stream.Read(bytes, 0, bytes.Length)
不会准确读取 bytes.Length
字节,而是 1 到 bytes.Length
字节之间的任何内容。如果您恰好需要那么多字节,则需要在循环中调用它。
如果 serverStatus
不完全是 bytes.Length
字节,协议也会丢失一些帧信息,因为客户端可能不知道在尝试将数据解码为留言。