【问题标题】:TCP/IP framing, interspersed messagesTCP/IP 成帧,散布消息
【发布时间】:2015-03-28 23:17:44
【问题描述】:

我只是深入研究 .NET 中的一些 TCP/IP 套接字编程,我开始了解如何使用消息框架来区分 TCP/IP 数据流中的“消息”,例如使用消息开始和结束分隔符。

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

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

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

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

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

我意识到实际上“同时”的 HTTP 请求相对较少,但由于每个 HTTP 请求本质上都在其自己的线程中,因此这是一种可能性。这是一个可能的情况吗?如果是这样,您怎么知道哪个字节与哪个消息一起使用?还是我只是对整件事感到困惑?

谢谢!

【问题讨论】:

  • 除非您使用一些完全脑死的 TCP 实现,否则消息将通过不同的连接到达。在实践中,您永远不必担心这一点
  • HTTP 服务器与 TCP 套接字是分开的,对吧?所以一个到达的 HTTP 请求会为 TCP 套接字排队一个消息,而后者与 HTTP 响应没有任何关系?
  • CodeCaster:正确。 Web 服务调用基本上只是将消息发送给客户端。在这种情况下,HTTP 响应并不重要。
  • @pm100:感谢您的澄清。没有意识到每个新流都是 TCP/IP 中的新连接...我认为来自同一服务器的相同端口将意味着相同的连接。听起来那是我的困惑。无论如何,我添加了一个锁,只是为了确定。 :)

标签: c# asp.net .net tcp


【解决方案1】:

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

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

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

【讨论】:

  • 我没有考虑使用锁。好主意。
猜你喜欢
  • 1970-01-01
  • 2012-10-09
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多