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 广播、房间和确认功能的主要内容,如果未能解决你的问题,请参考以下文章