node.js - 如果我在 socket.io 中失去连接,则不会收到消息

标签 node.js socket.io

我正在构建聊天应用程序。我的服务器代码:

socket.on('sendMessage',function(data){
   var to=data.To;
   var from=data.From;
   var message=data.Message;

   var sendData={
            to:to,
            from:from,
            message:message,
            messageId:randomId
   }
   io.to(to).emit("processmessage",sendData);

});

当接收器在线时它运行良好。但是当我拔掉以太网线并且有人向我发送消息时,在我重新连接后消息不会出现。 (我将在 10 秒内重新连接。)

Ps:重新连接后,新消息没有任何问题。我重新连接时丢失了消息。

我该如何解决这个问题?

最佳答案

您可以实现一个重试系统,使用每个消息的唯一 ID 和时间戳来检查它是否已到达另一端。

您会要求接收方发回一条确认消息,表明它已收到特定 ID 的消息。

设置超时 (T),如果消息尚未得到确认,您将在 (T) 秒后重试消息。

您可以保留发送的消息的缓冲区,然后对于您确认已收到的每条消息(通过接收者的确认),您可以将其从缓冲区中删除。收到确认后,您还可以检查缓冲区中最旧的消息,看看它是否早于 (T)。如果是,您可以重试该消息并重置时间戳。继续检查下一个最旧的,直到找到不早于 (T) 的一个。然后继续发送下一条消息。

此过程将帮助您的系统恢复在网络停机期间可能未到达接收者的消息。

关于node.js - 如果我在 socket.io 中失去连接,则不会收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507965/

相关文章:

php - Laravel 5.1 Session 和 Socket.IO + Redis - 向登录(已知)用户和用户组发送通知

javascript - 这个 if/else Javascript 函数有什么问题?

javascript - Express >4.0 版本的 Socket.io 和 Node.js

node.js - Socket.io 多个响应而不是一个

javascript - 如何使用NodeJS + ExpressJS传递一个数组给Jade显示?

express - Socket.io: net::ERR_CONNECTION_CLOSED

node.js - forEach 中的 Puppeteer 测试

node.js - 停止目录中除我刚刚开始的 Node 进程之外的所有 Node 进程

node.js - 生成的 NodeJS Express 应用程序没有 "listen"?

javascript - 为什么 return 在创建项目之前执行并且 console.log 等待并显示正确的 id?