【发布时间】:2020-09-04 22:24:30
【问题描述】:
我想创建一个监听传入消息的 .NET Core TCP 服务器。我创建了一个小类用于测试目的:
internal class TCPServer
{
private readonly TcpListener tcpListener;
public TCPServer()
{
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1234);
}
public async Task Start()
{
tcpListener.Start();
while (true)
{
TcpClient tcpClient = await tcpListener.AcceptTcpClientAsync();
NetworkStream networkStream = tcpClient.GetStream();
byte[] messageBuffer = new byte[tcpClient.ReceiveBufferSize];
int bytesRead = networkStream.Read(messageBuffer, 0, tcpClient.ReceiveBufferSize);
string dataReceived = Encoding.ASCII.GetString(messageBuffer, 0, bytesRead);
Console.WriteLine("Message from tcp client: " + dataReceived);
}
}
}
当向该侦听器发送消息时,客户端本身会超时。如您所见
我试图通过添加这一行来解决它
tcpClient.Close();
然后我得到这个错误
我怎样才能在不出错的情况下向该服务器发送消息?
【问题讨论】:
-
TCP 是健壮的,因为每条消息都会收到一个 ACK,并且当没有收到 ACK 时,会根据设置自动重新发送最多 3 到 5 次消息。超时表示未收到 ACK。您在 30 秒后超时,可能您每 5 秒重试 5 次,然后在 30 秒后连接关闭。
-
看起来客户端发送消息然后在服务器收到消息之前关闭。客户端不应关闭。
-
所以你觉得代码没问题,客户端工具不应该关闭客户端?
-
我认为如果客户端在发送数据后立即关闭,可能会出现竞争情况。服务器可能无法获取所有数据,然后由于 TCP 进行重试而超时。
标签: c# .net-core tcplistener