c# - 排队 ConcurrentQueue 时如何修复命令串联在unity3d c#中?
问题描述
再会。编写了 2 个通过 TCP 相互通信的应用程序。一个是服务器(平板电脑),第二个是客户端(windows)。为了同步多线程,我使用了标准的 ConcurrentQueue 队列类。但是,我在发送消息时注意到了奇怪的行为。当添加到队列中时,命令被连接起来,尽管命令是依次发送的。它看起来很精简,一次执行两个命令(2 个字符串),然后连接,然后将 2 个队列排入队列。看起来像这样:
解决方案
TCP 不处理消息。TCP做流。问题不在于并发队列 - 而是您读取字符串的方式。
一次发送可能会导致另一侧的多次接收。多次发送可能导致一次接收。这就是 TCP 的工作原理。
要通过 TCP 发送消息,您必须使用消息帧 - 有一种将字节流划分为单个消息的方法。
有两种非常简单(和愚蠢)的消息框架方法:
- 使用特殊的终止符值终止每条消息。这通常用于基于文本的 TCP 协议中,终止符通常类似于
\n
- 在每条消息前面加上它的长度。然后读取成为“读取消息长度,然后读取字节长度”的循环。
但归根结底,TCP 是复杂的。如果可以,请使用现成的网络库,而不是尝试直接处理 TCP,例如 Lidgren。这些允许您使用更高级的方法来处理网络代码 - 例如,有消息,一些可靠的,一些不可靠的等。
推荐阅读
- python - 当我尝试从表中抓取数据时没有数据出现
- eloquent - 雄辩的具有挑战性的嵌套查询
- python - 使用请求时如何打印发布数据?
- amazon-web-services - 使用 for 循环从 s3 复制 Redshift
- node.js - 使用 Node.Js Express 连接两个表
- c - 可能最终在共享库中的所有内容是否总是需要使用 -fPIC 进行编译?
- python - 具有多种输出形状的 TensorFlow 子类 keras
- amazon-s3 - 如何在 AWS amplify 中向无服务器容器授予额外权限?
- html - 添加卡片时,部分内容超出页面
- linux - Linux 高可用性和 DRBD、心跳