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

时间:2017-04-03 13:58:47

标签: socket.io

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

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

下面的代码不起作用。

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

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

处理此方案的其他方法是什么。

1 个答案:

答案 0 :(得分:2)

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

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

一个简单的方案如下:

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

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