其他人在其他答案和评论暗示了这一点,但根本问题是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

});

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

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

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

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

  2. websocket如何区分用户_Node.js Websocket如何区分不同的用户

    本篇教程介绍了Node.js Websocket如何区分不同的用户,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 通过param1,param2来管理不同的ws ...

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

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

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

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

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

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

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

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

  7. python中 getnode用法_node.js 爬虫入门总结

    node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript ...

  8. dotnet调用node.js写的socket服务(websocket/socket/socket.io)

    https://github.com/jstott/socketio4net/tree/develop socket.io服务端node.js,.里面有js写的客户端:http://socket.io ...

  9. websocket和socket.io

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

最新文章

  1. Msdn 杂志 asp.net ajax 文章汇集
  2. kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归...
  3. UVA10294项链和手镯(等价类计数问题)
  4. 在php 添加时间,在PHP中添加时间
  5. 《Hadoop权威指南》读书笔记-第一章:初识Hadoop
  6. 如何解除国外听QQ音乐网易音乐地区版权限制解除
  7. 免费下载深度操作系统(deepin),三步快捷体验优秀国产操作系统
  8. 劳动节前得空半天-总结一下最近使用的LINUX命令
  9. 频数直方图的步骤_超级详细的直方图应用步骤及分析,一篇搞定直方图!
  10. AndrOid系统亭子运行,饼干智能好物开箱 篇二十二:给父母换个手机,让他成楼下凉亭的拍照KOL...
  11. 今天公司HR推荐了一个人来应聘财务经理
  12. [Unity] 状态机事件流程框架 (二) 设计游戏状态的保存框架,存档功能 ScriptableObject、EasySave
  13. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...
  14. 洛谷 P1456 Monkey King 题解
  15. 远程传输大文件使用什么平台好呢?
  16. 大数据技术原理与应用 实验6 Spark数据处理系统的搭建
  17. matplotlib绘制热图
  18. c语言hook微信dll,Hook微信 - 拦截新消息函数,获取消息内容
  19. python爬虫百度贴吧代码大全_获取贴吧图片的python爬虫
  20. 如何在媒体发布消息,个人怎样往网上发布新闻​

热门文章

  1. 在sqlServer中把数据导出为insert脚本
  2. dbcc dbreindex server sql_SQL Server数据库碎片整理
  3. sql 单引号_三种数据库的 SQL 注入详解
  4. 宽依赖和窄依赖_Kardemir开始生产窄钢板,进入板材市场
  5. python怎么设置颜色深浅变化_机器学习中减弱不同图像数据色调及颜色深浅差异...
  6. 微课|中学生可以这样学Python(5.5.3节):字符串格式化1
  7. Python代码调试之异常回溯
  8. plaintextedit指定一行一行的高亮显示_列表记录自动逐条高亮显示
  9. python装饰器property_python装饰器: @property
  10. linux充电时熄屏时间,充电时玩手机会损害电池吗