在 C#(一个 Unity 脚本)中,我有一个使用 TcpClient 发送和接收数据的客户端。客户端将每“帧”发送一个固定的数据字符串到服务器。服务器只是回显相同的字符串。这是测试和模拟的目的。
我使用异步方法 BeginWrite 和 BeginReceive。客户端通过以下方式发送数据:
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(EndTCPSend), null);
我使用以下调用来接收数据:
TCPClient.GetStream().BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
现在,问题是在很短的时间(1秒左右)之后,客户端停止向服务器发送数据,即使调用发送方法的代码仍在被调用(通过日志输出和Wireshark验证) . 没有数据被发送出去,因此服务器不再接收数据。
以下代码用于初始化 TcpClient:
TCPClient = new TcpClient();
TCPClient.NoDelay = true;
TCPClient.Connect(remoteEndPoint);
if (TCPClient.GetStream().CanRead)
{
TCPClient.GetStream().BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
}
每一帧,以下代码用于开始发送字符串:
NetworkStream stream = TCPClient.GetStream();
if (stream.CanWrite)
{
byte[] data = Encoding.UTF8.GetBytes(msg);
stream.BeginWrite(data, 0, data.Length, new AsyncCallback(EndTCPSend), null);
}
并使用以下方法关闭异步发送:
private void EndTCPSend(IAsyncResult result)
{
TCPClient.GetStream().EndWrite(result);
}
为了接收数据,我使用以下方法作为回调:
private void OnMessageTCP(IAsyncResult result)
{
NetworkStream stream = TCPClient.GetStream();
int read = stream.EndRead(result);
if (read == 0)
{
return;
}
string message = Encoding.UTF8.GetString(TCPBuffer, 0, read);
TCPMessageBuffer += message; // <-- This line seems to cause the problem.
stream.BeginRead(TCPBuffer, 0, 1024, new AsyncCallback(OnMessageTCP), null);
}
有人知道我在这里做错了什么吗?客户端停止发送的任何原因?我可以像这样异步发送和接收数据吗?
提前致谢!