【问题标题】:C# Socket message are mixed [duplicate]C# Socket 消息混杂[重复]
【发布时间】:2017-12-02 02:31:10
【问题描述】:

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

例如,我发送

约翰 1000

马克 2000

我收到约翰 1000 马克

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

【问题讨论】:

  • 你的_buffer有多大?
  • 私有字节[] _buffer = 新字节[1024];

标签: c# sockets


【解决方案1】:

TCP 连接是一个字节流。当您将一条消息(作为字节数组)写入流,然后再写入另一条时,接收方无法知道一条消息在哪里结束,下一条消息从哪里开始。

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

【讨论】:

  • 谢谢,有没有办法避免从特定的套接字误读?
  • 我会用case switch来分析每一个数据包,我会给每个数据包一些参数,例如:MOVE#X#Y\r\n
  • 嗨亚历山德罗,你能更具体地说明从特定套接字的误读吗?你是什​​么意思?此外,关于 case switch,这种方法会起作用,但是随着时间的推移,随着您添加越来越多类型的数据包,维护起来会变得更加困难。我建议您查看command design pattern 作为替代方案。维基百科的文章相当激烈,但“四人帮”很好地解释了它:blackwasp.co.uk/command.aspx
猜你喜欢
  • 2013-12-13
  • 2016-12-22
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多