websocket中发生数据丢失_node.js – Websocket传输可靠性(重新连接期间Socket.io数据丢失)...

其他人在其他答案和评论暗示了这一点,但根本问题是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从数据存储中丢失的所有消息

> U1的客户端确认收到,服务器从数据存储中删除这些邮件。

如果你绝对需要保证交付,那么重要的是设计你的系统,连接的方式不重要,实时交付只是一个奖金;这几乎总是涉及某种数据存储。如在注释中提及的用户568109,存在抽象出所述消息的存储和传送的消息传递系统,并且可能值得研究这种预建的解决方案。 (你可能仍然需要自己编写Socket.IO集成)。

如果您不想将消息存储在数据库中,可以将它们存储在本地数组中;服务器尝试向U1发送消息,并将其存储在“待处理消息”列表中,直到U1的客户端确认接收到该消息。如果客户端离线,那么当它返回时,它可以告诉服务器“嘿我断开了,请给我任何我错过的”,服务器可以迭代这些消息。

幸运的是,Socket.IO提供了一种机制,允许客户端“响应”看起来像本机JS回调的消息。这里是一些伪代码:

// server

pendingMessagesForSocket = [];

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);

}

}

});

// client

socket.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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Node.js使用WebSocket可以实现实时的双向通信。在Node.js,可以使用原生的WebSocket模块或者使用第三方库socket.io来实现WebSocket功能。引用\[2\]给出了使用原生WebSocket模块的示例代码,其通过创建WebSocket服务器并监听连接事件,可以实现与客户端的通信。引用\[1\]给出了使用socket.io库的示例代码,通过创建socket.io服务器和客户端,可以实现实时的双向通信。socket.io是在WebSocket之上进行了进一步的封装,提供了更多的功能和兼容性。它可以在WebSocket不可用的情况下自动降级为其他传输方式,如轮询。因此,socket.io更加灵活和可靠。引用\[3\]提到了socket.io是进化了的WebSocket API。总之,Node.js可以使用原生的WebSocket模块或者socket.io库来实现WebSocket功能,具体选择取决于需求和使用场景。 #### 引用[.reference_title] - *1* [nodejs--websocket](https://blog.csdn.net/qq_36344077/article/details/117338445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [Node.js实现WebSocket](https://blog.csdn.net/m0_37911706/article/details/128057137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [借助Nodejs探究WebSocket](https://blog.csdn.net/weixin_30384031/article/details/97687728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值