websocket心跳的实现
来源:互联网 发布:手机如何切换软件 编辑:程序博客网 时间:2024/05/10 02:39
http://blog.csdn.net/real_bird/article/details/77119897
前言
在使用websocket的过程中,有时候会遇到客户端网络关闭的情况,而这时候在服务端并没有触发onclose事件。这样会:
- 多余的连接
- 服务端会继续给客户端发数据,这些数据会丢失
所以就需要一种机制来检测客户端和服务端是否处于正常连接的状态。这就是websocket心跳,这个名字非常生动形象,还有心跳说明还活着(保持正常连接),没有心跳说明已经挂掉了(连接断开了)。
要解决的问题
我的代码主要解决了以下几个问题。
- 连接上之后,每秒发送一个心跳,服务器同样返回一个心跳,用来表示服务器没挂。
- 断线重连(我们测试的环境是断开网络连接),断开网络后,心跳包无法发送出去,所以如果当前时间距离上次成功心跳的时间超过20秒,说明连接已经出现问题了,此时需要关闭连接。
- 第一次关闭连接时websocket会尝试重连,设置了一个时间期限,10秒。10秒内如果能连上(恢复网络连接)就可以继续收发消息,连不上就关闭了,并且不会重连。
- 30秒内收不到服务器消息(心跳每秒发送),我就认为服务器已经挂了,就会调用close事件,然后进入第3步。
需要什么
开始考虑得不周到,命名不规范。
- 一个定时器
ws.keepAliveTimer
,用来每秒发送一次心跳。 - 上次心跳成功的时间
ws.last_health_time
以及当前时间let time = new Date().getTime();
。 - 断开连接(
ws.close()
)时的时间reconnect
,因为在close事件发生后需要重连10秒。 - 是否已经重连过
reconnectMark
。 - 断开连接(
ws.close()
)时需要保存ws对象tempWs
。我曾试图ws = { ...ws }
发现会丢失绑定的事件。 - 一个定时时间为30秒的setTimeout定时器
ws.receiveMessageTimer
,用来表示服务器是否在30秒内返回了消息。
代码部分
我是在react中使用websocket心跳的。当用户登录时我会建立websocket连接。由于使用了redux,所以该部分代码放在componentWillReceiveProps
中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
以上就是websocket心跳的全部实现。看到断开网络后然后再脸上网络websocket又连上了,那一刻心里很喜悦。如果有什么问题,欢迎大家和我交流。
阅读全文
0 0
- websocket心跳的实现
- websocket心跳的实现(转载)
- websocket心跳的实现(包括全部代码)
- 初探和实现websocket心跳重连
- 使用Websocket实现消息推送(心跳)
- 初探和实现websocket心跳重连
- 初探和实现websocket心跳重连
- websocket 心跳包重连
- websocket 心跳连接
- websocket 心跳检测
- 关于socket心跳的实现
- netty的心跳检测实现
- Android实现心跳的效果
- netty的心跳检测实现
- linux 心跳包的实现
- WebSocket心跳机制和代码
- WebSocket的java实现
- go的websocket实现
- SqlServer行转列
- 63. Unique Paths II
- Mycat 的主从复制实例
- 树形dp总结
- python 函数二
- websocket心跳的实现
- caffe 有关prototxt文件的设置解读
- 蓝桥杯热身赛
- Python While 循环语句
- linux内核设计与实现[第3章 摘抄]
- Map put和remove的 使用
- 20171125 ASCII码的转换
- Javaweb实现旅游管理系统(商城)(二)
- Java任务--Map