TCP/IP 陷害,穿插留言

TCP/IP framing, interspersed messages

我刚刚开始研究 .NET 中的一些 TCP/IP 套接字编程,我开始了解如何使用消息框架来区分 TCP/IP 数据中的 "messages"流,例如使用消息开始和结束定界符。

但是,如果消息字节相互穿插发送,我无法理解会发生什么。考虑以下情况(我什至不确定这种情况是否有意义,所以如果我误解了什么请告诉我):

规则 1:Web 服务在收到新的 HTTP 请求时必须向特定客户端发送 TCP/IP 消息。

规则 2:Web 服务将通过 TCP/IP 发送给客户端的消息将采用 ASCII 格式,消息将是“+MESSAGE_TEXT|”,并带有一个加号符号作为消息开始定界符,管道符号作为消息结束定界符。

规则 3:在客户端中,每个字节在收到时都会被检查,当它收到一个消息 'start' 定界符时,它会开始使用 ASCII 编码的消息填充一个新的字符串。当收到一个消息'end'定界符时,它就会知道这个消息是完整的并进行处理。

场景:Web 服务同时接收到两个 HTTP 请求,这导致两条消息通过 TCP/IP 发送到客户端,当接收到字节并重新组合时,它们看起来像这样(ASCII 编码): "+ME+MESSSSAGE_AGESTART|_START|".

我意识到实际上 "simultaneous" 的 HTTP 请求相对较少,但由于每个 HTTP 请求基本上都在其自己的线程中,所以这是可能的。这是可能的情况吗?如果是这样,您如何知道哪些字节与哪些消息相关?还是我只是对整件事感到困惑?

谢谢!

向客户端发送数据的代码必须规范在套接字上发送的数据。

如果您有多个线程都使用同一个连接,请在套接字流上使用锁并保持锁直到消息已完全发送,这将防止其他线程导致混合消息。

另一种方法是有一个专用线程从消息队列中读取消息并将它们发送出去,然后每条消息都被放入队列并在处理时发送。