socket io 广播、房间和确认功能

Posted

技术标签:

【中文标题】socket io 广播、房间和确认功能【英文标题】:socket io broadcast, rooms and acknowledgement function 【发布时间】:2017-08-28 10:30:51 【问题描述】:

我们正在研究用于聊天应用程序的套接字 io 实现。 寻找确认支持以在广播时处理丢失的消息,我们正在研究确认支持。 根据文档,socket io 不支持广播/房间中的回调。

例如在“房间 1”中,我们向该房间内的所有套接字发送广播消息。我们如何在不回调的情况下检查某些用户/套接字是否错过了消息。以及我们将如何在系统中处理它。

下面的代码不起作用。

io.sockets.in(data.room).emit('message', data, function(responseData)
            console.log(responseData);
        );

根据以下问题 https://github.com/socketio/socket.io-redis/issues/30 广播时不支持回调。

处理这种情况的其他方法是什么。

【问题讨论】:

【参考方案1】:

为了解决您的问题,房间的消息需要保存在某个地方,然后根据需要重新发送给各个客户。

最明显的存储消息的地方是服务器端的数据存储(例如 Redis)。将每个对话有效地存储为事件列表,并在新事件发生时附加它们。

一个简单的方案如下:

每条广播消息都附有一个 UUID。当服务器处理一条新消息时,它会将消息附加到该“房间”的列表中。 当客户端连接/重新连接时,它会发送一条消息(例如“LAST_MESSAGE_RECEIVED”),指示它收到的最后一条消息的 UUID。 当服务器收到这些“LAST_MESSAGE_RECEIVED”消息之一时,它会检查这是否是房间的最新消息,如果不是,它会向该单独的套接字发出一条消息,其中包含一组丢失的消息。客户端现在已恢复到最新状态。

替代方案:如果您不需要在对话结束后保留​​历史记录,您可以聪明地利用其他客户端已经存储消息的事实,并要求客户端重新- 以点对点的方式发送消息。这样可以避免您需要拥有自己的服务器端数据存储。

【讨论】:

以上是关于socket io 广播、房间和确认功能的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 只向房间 A 和 B 中的用户广播

Socket.io 广播到房间不工作

Socket.io广播到房间不工作

带有 Socket.io 和 Node 的动态房间

如何使用 Flask 和 Socket.io 加入和离开房间的简明示例?

socket.io 入门篇