我有一个websocket服务器和客户端。我能够建立连接并在两个方向上传输消息(数据)。但是,当在Web浏览器中运行的客户端快速调用socket.send()时,服务器不会收到某些消息。如果我减慢客户端对socket.send()的调用,则服务器会收到所有消息。为什么调用socket.send()的时间与间歇性丢弃消息有关?
这是多年来我第一次无法通过stackoverflow等网站在网上进行研究来解决问题。我用Google搜索了这个问题,直到我的手指麻木。因此,我最终在这里创建了一个帐户并发布了一个问题请帮忙!
答案 0 :(得分:2)
问题出在服务器上,而不是客户端。 Node.js在单个回调中传递多个消息。我的代码假设每ws消息回调一次。在消息以高速传递之前,这不是问题。修改服务器代码以解析各个消息后,问题就会消失。快乐的日子!
答案 1 :(得分:0)
具体原因是Nagle's Algorithm(维基百科链接)。
具体来说,如果在很短的时间内发送了几条消息,TCP可能会将一些消息组合到同一个TCP帧中。
这将导致同一IP数据包中的多个WebSocket(WS)帧。一个表现良好的WS服务器只会读入TCP帧,只要WS帧的头部表示有数据即可。理解Nagle算法的表现良好的WS服务器将检查另一个要解码的WS帧。
我在开发基于PHP的WS服务器时遇到的一个问题是,一旦服务器读取到第一条消息的末尾,如果有剩余数据,网络堆栈会在我发出大声抱怨的时候尝试检查新数据包。
表现不佳的WS服务器可能会读取WS框架表示数据结束的位置,并且要么在第一个消息的数据中包含第二个消息的WS帧,要么以奇怪和不寻常的方式失败。
如果您绝对必须进行实时通信,则TCP_NODELAY标志可用。然而,为了大多数人的网络,通常认为让Nagle的算法排队和合并消息是很好的方式。
这通常只是服务器方面的问题,因为绝大多数WS客户端都是Web浏览器,它们已经知道Nagle的算法。