socket本身没有提供重连机制,websocket也是一样。所以重连是自己做的。
要实现websocket重连机制,首先要分析websocket的工作环境。socket的接收和发送都是阻塞线程的,所以websocket一般都是用两个线程分别去负责接收和发送消息。
这里就以接收和发送都是异步为前提实现重连。
socket 宏观的链接步骤为:connect----connected 异步。
socket 宏观的断开链接步骤为:disconnect----disconnected 异步。
如果给websocket定义生命周期的话,我是这样定义的。
所以websocket只能是在onlive(connected之后,disconnectting之前)期工作。我们怎么样知道websocket现在的状态呢?定义websocket的状态:
onconnectting (connectting之后,connected之前), 用socket三次握手判断。
onconnect (connected之后,disconnectting之前) 给服务器发送消息,已发送消息和接收消息的时间差为基准判断。
disconnectting(disconnecting之后,disconnected之前) socket断开连接机制为基准。
ondisconnect (disconnected之后,connectting之前) 业务中之前保存websocket的状态为基准。
原则就是做到websocket的状态不允许重复,生命执行流程不能倒置。
因为onconnectting、onconnect、disconnectting都是异步,所以有必要分别用一个同步的参数记录三个时期的状态。当处于onconnectting时期时,不做onconnect、disconnectting。其他状态也是同样的原则。
遵循自己定义的websocket生命周期原则,那么重连只是重走一遍websocket的生命周期而已。