C#TCP客户端:发送意外停止

C#TCP客户端:发送意外停止,c#,tcpclient,beginread,C#,Tcpclient,Beginread,在C#(统一脚本)中,我有一个客户机,它使用TcpClient发送和接收数据。客户端将在每个“帧”向服务器发送一个固定的数据字符串。服务器只是回显相同的字符串。这是测试和模拟的目的 我使用异步方法BeginWrite和BeginReceive。客户机通过以下方式发送数据: stream.BeginWrite(data, 0, data.Length, new AsyncCallback(EndTCPSend), null); 我使用以下调用来接收数据: TCPClient.GetStream(

在C#(统一脚本)中,我有一个客户机,它使用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);
}
消息Cp上的私有void(IAsyncResult结果) { NetworkStream=TCPClient.GetStream(); int read=stream.EndRead(结果); 如果(读==0) { 返回; } string message=Encoding.UTF8.GetString(TCPBuffer,0,read);
TCPMessageBuffer+=message;//您在哪里调用EndSend?我添加了用于结束数据发送的代码。这已经存在于我的代码中,我在问题中忘记了提及。感谢您指出。您是否尝试同时发送到消息?这可能会导致异常。您可能还希望在callbac中捕获异常ks作为未处理的异常将使您的应用程序崩溃。为什么调用CanRead/CanWrite?我每帧只发送一条消息,因此我认为不会同时发送任何消息,但我不确定是否会发生这样的情况:一条消息已完全发送,而下一条消息已准备好发送。我将在放置try-Catch时查看一下然后报告。我还将尝试使用信号量读取和写入套接字,看看这是否有区别。我稍后会报告。感谢您与我一起查看。使用更高级别的格式,如protobuf或webservices。如果您坚持自己做任何事,请使用BinaryReader/Writer甚至BinaryFormatter。