1

在 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);
}

有人知道我在这里做错了什么吗?客户端停止发送的任何原因?我可以像这样异步发送和接收数据吗?

提前致谢!

4

0 回答 0