C#套接字消息是混合的

时间:2017-12-02 02:31:10

标签: c# sockets

当我从客户端向服务器发送许多消息时,我会收到第一个数据包中第二个数据包的一半。

例如,我发送

JOHN 1000

MARK 2000

我收到JOHN 1000 MARK

2000

这是我的读者:

private void ReceiveData()
{
    int numberOfBytesRead = 0;
    while (isConnected && _stream.CanRead)
    {
        try
        {
            numberOfBytesRead = _stream.Read(_buffer, 0, _buffer.Length);
            receiveMsg = Encoding.ASCII.GetString(_buffer, 0, numberOfBytesRead);
            _stream.Flush();

            if(receiveMsg == "")
                return ;

            Debug.Log("[Recv] " + receiveMsg);
            receiveMsg = "";
        }
        catch (Exception e)
        {
            CloseConnection();
            Debug.Log(e.ToString());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

TCP连接是字节流。当您将一条消息(作为字节数组)写入流,然后将另一条消息写入另一条消息时,接收方无法知道一条消息的结束位置以及下一条消息的开始位置。

您需要为客户端添加一些方法来了解它何时收到完整的消息 - 一种常见的方法是选择一个字节,并使用它来表示消息的结尾(分隔符)。 C#有StreamReaderStreamWriter,可用于此目的。致电ReadLine()WriteLine(),邮件末尾将标有换行符。