其他人已经在其他答案和评论中暗示了这一点,但是根本问题是Socket.IO只是一种传递机制,您 不能
仅依靠它来可靠地传递。唯一确定知道消息已成功发送给客户的人 就是客户本身 。对于这种系统,我建议做出以下断言:
- 邮件不会直接发送给客户;相反,它们被发送到服务器并存储在某种数据存储中。
- 客户端负责在重新连接时询问“我错过了什么”,并将查询数据存储中存储的消息以更新其状态。
- 如果在 连接接收方客户端时将 消息发送到服务器 ,则 该消息将实时发送到客户端。
当然,根据您的应用程序的需求,您可以对此进行调整-例如,您可以使用Redis列表或消息的排序集,并在知道客户启动的情况下将其清除。至今。
以下是几个示例:
幸福的道路 :
- U1和U2均已连接到系统。
- U2向U1应该接收的服务器发送一条消息。
- 服务器将消息存储在某种持久性存储中,并使用某种时间戳或顺序ID将其标记为U1。
- 服务器通过Socket.IO将消息发送到U1。
- U1的客户端确认(也许通过Socket.IO回调)它已收到消息。
- 服务器从数据存储中删除保留的消息。
离线路径 :
- U1断开互联网连接。
- U2向U1应该接收的服务器发送一条消息。
- 服务器将消息存储在某种持久性存储中,并使用某种时间戳或顺序ID将其标记为U1。
- 服务器通过Socket.IO将消息发送到U1。
- U1的客户端处于脱机状态,因此 无法 确认收货。
- 也许U2向U1发送了一些消息;它们都以相同的方式存储在数据存储中。
- 当U1重新连接时,它询问服务器“我看到的最后一条消息是X /我的状态为X,我错过了什么”。
- 服务器根据U1的请求向U1发送从数据存储中丢失的所有消息
- U1的客户端确认收到,服务器将这些消息从数据存储中删除。
如果您绝对希望有保证的交付,那么以这样一种方式设计系统就很重要,即连接实际上并不重要,并且实时交付仅仅是一个 奖励
;这几乎总是涉及某种数据存储。正如user568109在评论中提到的那样,有些消息传递系统可以抽象化所述消息的存储和传递,因此值得研究这种预构建的解决方案。(您可能仍然需要自己编写Socket.IO集成。)
如果您对将消息存储在数据库中不感兴趣,则可以将消息存储在本地数组中。服务器会尝试向U1发送消息,并将其存储在“待处理消息”列表中,直到U1的客户端确认它已收到为止。如果客户端处于脱机状态,则当客户端返回时,它可以告诉服务器“嘿,我已断开连接,请将任何我错过的信息发送给我”,然后服务器可以遍历这些消息。
幸运的是,Socket.IO提供了一种机制,该机制允许客户端“响应”看起来像本机JS回调的消息。这是一些伪代码:
// serverpendingMessagesForSocket = [];function sendMessage(message) { pendingMessagesForSocket.push(message); socket.emit('message', message, function() { pendingMessagesForSocket.remove(message); }};socket.on('reconnection', function(lastKnownMessage) { // you may want to make sure you resend them in order, or one at a time, etc. for (message in pendingMessagesForSocket since lastKnownMessage) { socket.emit('message', message, function() { pendingMessagesForSocket.remove(message); } }});// clientsocket.on('connection', function() { if (previouslyConnected) { socket.emit('reconnection', lastKnownMessage); } else { // first connection; any further connections means we disconnected previouslyConnected = true; }});socket.on('message', function(data, callback) { // Do something with `data` lastKnownMessage = data; callback(); // confirm we received the message});
这与上一个建议非常相似,只是没有持久性数据存储。
您可能还对事件源的概念感兴趣。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)