Socket.io是否保证客户端按顺序接收广播事件?

20

在 Socket.IO 中是否有某种排序机制可以保证客户端按顺序接收事件?

例如:如果服务器向客户端A发送事件 Evt1,然后向所有客户端广播 Evt2。那么客户端A只能按照 Evt1 然后 Evt2 的顺序接收。

我的猜测是没有这样的机制,如果是这种情况,你会如何实现它或者是否已经存在解决方案?

2个回答

48

由于之前的答案可能会具有潜在误导性,我认为有必要澄清一件事:

使用Socket.io和WebSockets时,数据包顺序是有保障的。

虽然这是一篇旧文,但值得注意的是:使用WebSockets方式的Socket.io确实保证事件顺序被保持。这是因为TCP本身就是WebSockets和HTTP底层技术,它保证了数据包顺序的传输。然而,Socket.io还支持其他几个不保证顺序的协议。

关于这个问题已经发表了几个帖子,证明了这一事实:


-2
不,如果需要这样做,您必须在应用程序级别进行。因为互联网不能保证两个不同的数据包将采取相同的路线,所以时间可能会有所变化。也许可以给每个消息添加一个时间戳,这样就可以按照时间戳排序来保持顺序。

谢谢!你知道是否有一种npm模块使用socket.io来同步发出和广播的消息吗?因为这似乎是一个冗余的问题,例如聊天应用程序需要确保您从不同的人那里接收到所有消息并按正确顺序排列... - patrickmesana
只需添加一个日期字段。我不知道任何库,也不认为需要使用库。 - Max
嗨@Max,这是必要的,因为您可能会通过时间戳比较两条消息A < B,但您不确定是否有第三个中间消息C(A < B < C)在传递B消息之前应该等待。然而,我很难想象如果A、B、C消息来自同一个客户端,任何其他客户端将按不同顺序接收它们,考虑到socket.io使用TCP。 - mPrinC
1
@mPrinC,你可以选择使用递增的ID代替时间戳。当你收到一条消息时,判断该ID是否比上一个ID高1。如果更高,则说明有更多的数据包正在传输中。因此,请保留当前的ID,并在所有数据包到达后进行处理。 - Matthijn
5
我不确定,但我认为你错了。Socket IO 依赖于 WebSockets,而 WebSockets 依赖于 TCP 协议,该协议保证数据包按发送顺序接收。 - Playdome.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接