将ConcurrentQueue <string>放入unity3d C#中时如何解决命令串联?

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

将ConcurrentQueue <string>放入unity3d C#中时如何解决命令串联?

yxm407949656 回答:将ConcurrentQueue <string>放入unity3d C#中时如何解决命令串联?

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

一个发送可以导致另一侧的多个接收。多次发送可能导致一次接收。这就是TCP的工作方式。

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

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

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

但是最后,TCP很复杂。如果可以,请使用现成的网络库,而不要尝试直接处理TCP(例如Lidgren)。这些使您可以更高级地使用网络代码-例如有消息,一些可靠的消息,一些不可靠的消息等等。

,
    string[] arr = clientMessage.Split('\n');
    foreach (string item in arr)
    {
         if(!string.IsNullOrEmpty(item))
             recievedCommands.Enqueue(item);
     }

非常感谢!

本文链接:https://www.f2er.com/3119425.html

大家都在问