【问题标题】:How to fix commands concatenation when enqueuing ConcurrentQueue<string> in unity3d c#?在unity3d c#中排队ConcurrentQueue<string>时如何修复命令连接?
【发布时间】:2020-03-07 20:32:31
【问题描述】:

美好的一天。 编写了 2 个通过 TCP 相互通信的应用程序。一个是服务器(平板电脑),第二个是客户端(windows)。 为了同步多线程,我使用了标准的 ConcurrentQueue 队列类。 但是,我在发送消息时注意到了奇怪的行为。当添加到队列中时,命令被连接起来,尽管命令是依次发送的。 它看起来很精简,一次执行两个命令(2 个字符串),然后连接,然后将 2 个队列排入队列。 看起来像这样:

【问题讨论】:

  • 你能显示你的代码吗?没有它就很难说出发生了什么......

标签: c# multithreading unity3d tcp


【解决方案1】:

TCP 不发送消息。 TCP做流。问题不在于并发队列 - 而是您读取字符串的方式。

一次发送可能导致另一侧多次接收。多次发送可能导致一次接收。这就是 TCP 的工作原理。

要通过 TCP 发送消息,您必须使用消息帧 - 有一种方法可以将字节流分成单独的消息。

有两种极其简单(且愚蠢)的消息框架方法:

  • 使用特殊的终止符值终止每条消息。这通常用于基于文本的 TCP 协议中,终止符通常类似于\n
  • 为每条消息加上长度前缀。然后读取变成了“读取消息长度,然后读取长度字节”的循环。

但归根结底,TCP 是复杂的。如果可以,请使用现成的网络库,而不是尝试直接处理 TCP,例如 Lidgren。这些允许您使用更高级的方法来处理网络代码 - 例如有消息,有些可靠,有些不可靠等。

【讨论】:

    【解决方案2】:
        string[] arr = clientMessage.Split('\n');
        foreach (string item in arr)
        {
             if(!string.IsNullOrEmpty(item))
                 recievedCommands.Enqueue(item);
         }
    

    非常感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2021-11-17
      • 2015-06-30
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2021-04-17
      相关资源
      最近更新 更多