其他人在其他答案和评论中暗示了这一点,但根本问题是Socket.IO只是一种传递机制,你不能单独依靠它来实现可靠的交付 . 唯一确定消息已成功传递给客户端的人 is the client itself . 对于这种系统,我建议做出以下断言:

消息不会直接发送给客户端;相反,它们被发送到服务器并存储在某种数据存储中 .

客户端负责在重新连接时询问"what did I miss",并将查询数据存储中存储的消息以更新其状态 .

如果在连接收件人客户端时将消息发送到服务器,则该消息将实时发送到客户端 .

当然,根据您的应用程序的需要,您可以调整其中的一部分 - 例如,您可以使用Redis列表或消息的排序集,如果您知道客户端已启用,请将其清除至今 .

以下是几个例子:

Happy path :

U1和U2都连接到系统 .

U2向服务器发送U1应该接收的消息 .

服务器将消息存储在某种持久性存储中,使用某种时间戳或顺序ID将其标记为U1 .

服务器通过Socket.IO将消息发送到U1 .

U1的客户端确认(可能是通过Socket.IO回调)它收到了消息 .

服务器从数据存储中删除持久消息 .

Offline path :

U1失去了互联网连接 .

U2向服务器发送U1应该接收的消息 .

服务器将消息存储在某种持久性存储中,使用某种时间戳或顺序ID将其标记为U1 .

服务器通过Socket.IO将消息发送到U1 .

U1的客户 does not 确认收货,因为它们处于离线状态 .

也许U2向U1发送了一些消息;它们都以相同的方式存储在数据存储中 .

当U1重新连接时,它会询问服务器"The last message I saw was X / I have state X, what did I miss."

服务器根据U1的请求向U1发送它从数据存储中丢失的所有消息

U1的客户端确认收到,服务器从数据存储中删除这些消息 .

如果你绝对想要保证交付,那么它真的很重要,而实时交付只是一个 bonus ;这几乎总是涉及某种数据存储 . 正如评论中提到的user568109,有消息传递系统抽象出所述消息的存储和传递,并且可能值得研究这样的预构建解决方案 . (您可能仍需要自己编写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

});

这与上一个建议非常相似,只是没有持久数据存储 .

websocket中发生数据丢失_Websocket传输可靠性(重新连接时Socket.io数据丢失)相关推荐

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

    其他人在其他答案和评论暗示了这一点,但根本问题是Socket.IO只是一个交付机制,你不能依靠它单独的可靠交付.唯一知道消息已成功传递给客户端的人是客户端本身.对于这种系统,我建议做以下断言: > ...

  2. websocket中发生数据丢失_什么是WebSocket,它与HTTP有何不同?

    今天翻译一篇关于HTTP和WebSocket的文章.HTTP和WebSocket都是客户端-服务器通信中使用的通信协议.文章用几个例子解释了两者的不同以及分别适用在什么应用场景.有些容易混淆的概念(比 ...

  3. websocket中发生数据丢失_为什么事实上却发生了数据丢失,只有少部 分数据可以加载进来...

    为了提高自身业务性能,优化资源使用,该公司决定使用分钟表,即每五分 钟区间内,从 kafka-A 集群新消费过来的数据为一个批次,生成一个带有账期和 批次拼接的文件以 Load Data 的方式写入到 ...

  4. websocket中发生数据丢失_tcp协议;websocket协议;同源策略和跨域

    tcp协议 为什么连接的时候是三次握手,关闭的时候却是四次握手? 答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文.其中ACK报文是用来应答的,SYN报 ...

  5. websocket中发生数据丢失_获取使用关闭代码1006关闭websocket的原因

    关闭代码1006是一种特殊的代码,它表示浏览器实现异常(本地)关闭了连接. 如果您的浏览器客户端报告关闭代码1006,那么您应该在websocket.onerror(evt)事件中查看详细信息. 但是 ...

  6. java中图片文件的传输及显示(Socket以及ServerSocket演示)

    //客户端部分 package testSix;import java.awt.Graphics; import java.io.IOException; import java.io.InputSt ...

  7. websocket和socket.io

    websocket 三次握手 ws协议和http协议的区别 http HTTP是单向的,客户端发送请求,服务器发送响应.每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭.每个 ...

  8. 《 Socket.IO》 解决 WebSocket 通信

    大家好呀,我是小菜~ 本文主要介绍 Socket.IO 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 在介绍 Socket.IO 之前, 我们先考虑一个问题, 如果这个时候有个需求, 类似实 ...

  9. 突袭HTML5之WebSocket入门3 - 通信模型socket.io

    为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程 ...

最新文章

  1. PHP分页代码实例教程
  2. UI组件之TextView及其子类(五)计时器Chronometer
  3. MySQL函数和操作符(超详细,备着查找)
  4. centos php5.2安装教程,CentOS 5.2 x86 64(AMD)编译安装PHP小记
  5. Django基本概念、安装、配置到实现框架,Xmind学习笔记
  6. 删文97篇!前UCLA教授竟是民科?不看好量子通信被禁言
  7. 互联网晚报 | 3月22日 星期二 |​ ​工作人员标注mu5735残骸并展开调查;万门大学疑似解散VIP群跑路...
  8. 还没搞完的排序(后期更新)
  9. 虚拟化—用新的视角看IT
  10. Q120:PBRT-V3,“直接光照”积分器(14.3章节)
  11. KVM 001 -- 简介及安装
  12. SVN和Git 介绍,区别,优缺点,适用范围总结
  13. 2009年具有中国特色的脑筋急转弯
  14. Linux系统war包解压目录,linux系统下解压war包
  15. 进qq空间显示服务器失败,QQ空间找不到服务器-进空间找不到服务器的解决办法...
  16. 面试必须学会的八大技巧——让你在面试官面前游刃有余(面试注意事项等)
  17. android 获取粗略位置_从Android上的GPS提供商处获取*粗略*位置
  18. 使用 DBCA 命令 删除 Oracle 数据库
  19. 常用集合转JSON字符串公共类
  20. 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测

热门文章

  1. 墨者学院 PHP代码分析溯源(第4题) 详解
  2. 多维(三维四维)矩阵向量运算-超强可视化
  3. TPS73601DBVR线性稳压器
  4. jpcsp java_【图片】【求助】安装java出现问题,运行jpcsp出现同样问题(看过置顶)【psp模拟器吧】_百度贴吧...
  5. 关于补丁程序的分类和安装优先级
  6. VirtualBox 错误代码0x80004005解决办法
  7. 阿修罗无法登录服务器未响应您可能遇到了,北通手柄连接电脑没反应 怎么解决...
  8. Oracle报错ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展
  9. JReport中formular的使用
  10. PHP获取东方头条接口的新闻,新闻API接口_免费数据接口 - 极速数据