首页 > 解决方案 > 排队 ConcurrentQueue 时如何修复命令串联在unity3d c#中?

问题描述

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

标签: c#multithreadingunity3dtcp

解决方案


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

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

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

有两种非常简单(和愚蠢)的消息框架方法:

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

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


推荐阅读