Socket.io 是不是保证按客户端顺序接收广播事件?
Posted
技术标签:
【中文标题】Socket.io 是不是保证按客户端顺序接收广播事件?【英文标题】:Does Socket.io garantee that broadcasted events are received in order client side?Socket.io 是否保证按客户端顺序接收广播事件? 【发布时间】:2013-03-02 20:39:30 【问题描述】:Socket.IO 中是否有某种排序机制可以保证客户端按顺序接收事件?
例如:如果服务器向客户端 A 发送事件Evt1
,并且服务器向所有客户端广播Evt2
。
因此,客户端 A 收到 Evt1
然后是 Evt2
并且仅按此顺序。
我的猜测是否定的,如果是这样,您将如何实现它,或者是否有现有的解决方案?
【问题讨论】:
【参考方案1】:由于之前的答案可能具有误导性,我认为澄清一件事很重要:
将 Socket.io 与 WebSockets 一起使用时,可以保证保持数据包顺序。
这是一篇旧文章,但值得注意的是,WebSockets 实际上 上的 Socket.io 可以保证事件顺序得到维护。这是因为 TCP 本身,它是 WebSockets 和 HTTP 的底层技术,可以保证数据包的顺序得到维护。不过 Socket.io 也支持其他几个不保证顺序的协议。
已经发布了几个关于这个问题的问题,支持这一事实:
https://github.com/josephg/ShareJS/issues/375 Can websocket messages arrive out-of-order?【讨论】:
【参考方案2】:不,如果需要,您必须在应用程序级别执行此操作。互联网不保证两个不同的数据包将采用相同的路由,因此时间可能会有所不同。也许为每条消息添加一个时间戳,以便您可以按该时间戳排序以保持事情井井有条。
【讨论】:
谢谢!你知道是否有某种 npm 模块使用 socket.io 来同步发出和广播的消息?因为这似乎是一个多余的问题,例如一个聊天应用程序,以确保您以正确的顺序接收来自不同人的所有消息...... 只需添加一个日期字段。我不知道任何图书馆,我也认为没有必要 嗨@Max,这是必要的,因为您可能会按时间戳比较两条消息 A @mPrinC 您可以选择递增的 id 而不是时间戳。当您收到一条消息时,确定该 id 是否比前一个高一个。如果更多,那么更多的数据包正在进行中。所以保持电流,并在所有数据包到达时处理它。 我不确定,但我认为你错了.. socket io 依赖于 websockets 而 websockets 依赖于 tcp,它保证数据包将按照发送的 samr 顺序接收。以上是关于Socket.io 是不是保证按客户端顺序接收广播事件?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 socket.io 挂载到 fastapi 应用程序并向所有连接的客户端发送广播