websocket中发生数据丢失_Websocket传输可靠性(重新连接时Socket.io数据丢失)
其他人在其他答案和评论中暗示了这一点,但根本问题是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数据丢失)相关推荐
- websocket中发生数据丢失_node.js – Websocket传输可靠性(重新连接期间Socket.io数据丢失)...
其他人在其他答案和评论暗示了这一点,但根本问题是Socket.IO只是一个交付机制,你不能依靠它单独的可靠交付.唯一知道消息已成功传递给客户端的人是客户端本身.对于这种系统,我建议做以下断言: > ...
- websocket中发生数据丢失_什么是WebSocket,它与HTTP有何不同?
今天翻译一篇关于HTTP和WebSocket的文章.HTTP和WebSocket都是客户端-服务器通信中使用的通信协议.文章用几个例子解释了两者的不同以及分别适用在什么应用场景.有些容易混淆的概念(比 ...
- websocket中发生数据丢失_为什么事实上却发生了数据丢失,只有少部 分数据可以加载进来...
为了提高自身业务性能,优化资源使用,该公司决定使用分钟表,即每五分 钟区间内,从 kafka-A 集群新消费过来的数据为一个批次,生成一个带有账期和 批次拼接的文件以 Load Data 的方式写入到 ...
- websocket中发生数据丢失_tcp协议;websocket协议;同源策略和跨域
tcp协议 为什么连接的时候是三次握手,关闭的时候却是四次握手? 答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文.其中ACK报文是用来应答的,SYN报 ...
- websocket中发生数据丢失_获取使用关闭代码1006关闭websocket的原因
关闭代码1006是一种特殊的代码,它表示浏览器实现异常(本地)关闭了连接. 如果您的浏览器客户端报告关闭代码1006,那么您应该在websocket.onerror(evt)事件中查看详细信息. 但是 ...
- java中图片文件的传输及显示(Socket以及ServerSocket演示)
//客户端部分 package testSix;import java.awt.Graphics; import java.io.IOException; import java.io.InputSt ...
- websocket和socket.io
websocket 三次握手 ws协议和http协议的区别 http HTTP是单向的,客户端发送请求,服务器发送响应.每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭.每个 ...
- 《 Socket.IO》 解决 WebSocket 通信
大家好呀,我是小菜~ 本文主要介绍 Socket.IO 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 在介绍 Socket.IO 之前, 我们先考虑一个问题, 如果这个时候有个需求, 类似实 ...
- 突袭HTML5之WebSocket入门3 - 通信模型socket.io
为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程 ...
最新文章
- PHP分页代码实例教程
- UI组件之TextView及其子类(五)计时器Chronometer
- MySQL函数和操作符(超详细,备着查找)
- centos php5.2安装教程,CentOS 5.2 x86 64(AMD)编译安装PHP小记
- Django基本概念、安装、配置到实现框架,Xmind学习笔记
- 删文97篇!前UCLA教授竟是民科?不看好量子通信被禁言
- 互联网晚报 | 3月22日 星期二 |​ ​工作人员标注mu5735残骸并展开调查;万门大学疑似解散VIP群跑路...
- 还没搞完的排序(后期更新)
- 虚拟化—用新的视角看IT
- Q120:PBRT-V3,“直接光照”积分器(14.3章节)
- KVM 001 -- 简介及安装
- SVN和Git 介绍,区别,优缺点,适用范围总结
- 2009年具有中国特色的脑筋急转弯
- Linux系统war包解压目录,linux系统下解压war包
- 进qq空间显示服务器失败,QQ空间找不到服务器-进空间找不到服务器的解决办法...
- 面试必须学会的八大技巧——让你在面试官面前游刃有余(面试注意事项等)
- android 获取粗略位置_从Android上的GPS提供商处获取*粗略*位置
- 使用 DBCA 命令 删除 Oracle 数据库
- 常用集合转JSON字符串公共类
- 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
热门文章
- 墨者学院 PHP代码分析溯源(第4题) 详解
- 多维(三维四维)矩阵向量运算-超强可视化
- TPS73601DBVR线性稳压器
- jpcsp java_【图片】【求助】安装java出现问题,运行jpcsp出现同样问题(看过置顶)【psp模拟器吧】_百度贴吧...
- 关于补丁程序的分类和安装优先级
- VirtualBox 错误代码0x80004005解决办法
- 阿修罗无法登录服务器未响应您可能遇到了,北通手柄连接电脑没反应 怎么解决...
- Oracle报错ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展
- JReport中formular的使用
- PHP获取东方头条接口的新闻,新闻API接口_免费数据接口 - 极速数据