Skip to content

xielei0502/ws-reconnect

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

ws-reconnect

ws断线重连的方案实现

前端开发中经常会遇到使用websocket的情况。比如行情、k线、消息提醒等功能; 但是ws经常会出现连接中断的情况,这样之前通过ws订阅的消息就无法获取了。导致客户端出现消息接受不到的情况,往往只能刷新页面来重新建立连接; 为了解决这个问题,我也是看了不少网上的方案,研究如何进行ws的断线重连、以及重连之后,如何重新处理之断开前的业务;

一、首先解决如何将断开的ws重新连接:

1. 方案一:

思路: 通过发送心跳,监听心跳来判断; 每隔5s主动发送一下心跳,并记录心跳的返回时间;每隔10s去看下心跳时间,如果跟当前时间差了10s了。说明这10s钟内,至少有1~2次心跳是没连上的;那么就进行重连操作。 注意点: 1. 心跳发送是从客户端主动发起的,而ws是需要在建立起连接后,才允许发送消息。所以定时任务要在onopen的回调里面去写。心跳时间的监测最好也放在onopen里面,避免造成错误的判断; 2. 因为是有重新连接的逻辑在里面。所以每次定时任务建立的时候,需要判断当前ws是否存在对应的定时任务。否则会重复执行,导致错误判断; 3. 重连无非就是建立一个新的连接,所以在代码里面,需要主动把之前ws给断开(无论是否已经断开了),否则会有多个ws连接建立,推送的消息也是重复的。

2. 方案二:

思路:通过监听onClose事件来判断;在onclose回调里面加入判断,如果event.code是正常关闭,那么不处理。否则的话,进行重新连接。 注意点:1. 这个方案看起来比较简单。不过这个方案只考虑到ws是真的断开了,而没有考虑到服务端接受不到消息的情况。 2. 需要判断好到底是客户端主动断开,还是异常断开。所以需要在原有的close方法上封装一层逻辑,通过参数来标志,从而判断是否需要重连。

二、解决完ws重连的事情之后,剩下的就是看怎么重新处理之断开前的业务:

方案思路:首先记录下连接之后做了哪些操作,把每次订阅的消息都记录下来。断开重连之后,重新发送这些消息。 注意点:1. 有订阅消息,自然也会有取消订阅。订阅的时候把消息保存到内存中,取消订阅时,也记得要把消息从内存中删除掉。

三、备注:

其实缓存的消息,不仅是在断开重连后用的到,在初始化的时候也会用到。因为在ws还没完全建立好连接的时候,消息是无法发送的。这个时候必须记录下消息,在完全连接以后再进行发送。 另:这里主要是整理一个思路,并且记录一下相关核心代码,方便下次查阅。没有把它封装成通用的libs文件,一个是基础功底还不是那么好,写出来的代码可配性不是特别好,强行封装出来的功能,可能最后代码写的也比较丑陋。二是初心也不在于此,做起来有点违背自己最初做笔记的想法。所以就没做这个事情了。

About

ws断线重连的方案实现

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%