WebSocket 正常断开异常断开如何处理


https://blog.csdn.net/shangmingtao/article/details/75810099

WebSocket 正常断开异常断开如何处理

  1. 客户端:
  • 关闭浏览器
1
2
3
server处理方法: 触发onClose回调
client处理方法: 无
处理思路: 应用层ws主动关掉连接(优雅关闭)
  • 杀掉浏览器
1
2
3
server处理方法: 触发onClose和onError回调
client处理方法: 无
处理思路: 在操作系统中,应用程序对应的进程被干掉的时候会关闭其端口,也就是触发了TCP四次挥手。对于ws来讲直接在外部断开TCP会触发ws异常,对于ws来讲这样的关闭方式为非优雅关闭会触发异常
  • 断电断网
1
2
3
server处理方法: 检测client最后心跳上报时间
client处理方法: 触发onClose(断网)
处理思路: 断网的情况client之所以触发了onClose我认为可能是当断网时操作系统关闭了所有对外的网络端口或者操作系统通知了浏览器断网(由此看出操作系统的知识真的是太重要了);所以此时三个心跳周期过后当我们认为此session已经断开时不要忘记通知ws close掉这个session,不然有可能出现大量服务端TCP假死.接下来说重连,大家要注意重连对于server是来讲是一个新的连接,大家可以通过断网重连后server产生的session判断出断网重连实际上是产生了一个新的连接。对于server的原session如何处理我做了这样一个测试,当客户端断网后server依然通过原session发送数据给client当发送的数据超过一定时间一定数量没有回复后server会触发onError和onClose方法,对于原session server在client断开后从来不给这个client发消息的情况也就是重连的情况,我们要在新的session产生时及时清掉旧的session.同TCP假死处理一致.
  1. 服务端:
  • 重启tomcat
1
2
3
server处理方法: 无
client处理方法: 触发onClose
处理思路: 应用层ws主动关掉连接(优雅关闭)
  • 杀掉tomcat(kill -9 pid)
1
2
3
server处理方法: 无
client处理方法: 触发onClose和onError回调
处理思路: (同client被杀死)
  • 断电断网
1
2
3
server处理方法: 检测client最后心跳上报时间
client处理方法: 心跳异常
处理思路: 对于client来讲,只要正常发送心跳给server就可以了。如果server断开网络超过20分钟(心跳:次/10mins)所有client均会掉线
  • server断电断网时client如何感知
1
2
3
4
5
6
7
8
9
心跳周期: 次/1s
client现象: 断网/断电后167s(中间经历了167次心跳)触发client onClose方法
心跳周期: 次/1min
client现象: 断网/断电后6mins 40s(中间经历了6次心跳)触发client onClose方法
心跳周期: 次/10mins
client现象:
第一次测试:断网/断电后11mins 27s(中间经历了1次心跳)触发client onClose方法
第二次测试:断网/断电后14mins 28s(中间经历了1次心跳)触发client onClose方法
第三次测试:断网/断电后15mins 54s(中间经历了1次心跳)触发client onClose方法