#####2.2.1 心跳 Timer
心跳 Timer 是维持客户端与服务端长连一个强有力的保证。网络中接收发送都是使用
socket 的 recv 与 send 进行发送与接收,如果此套接字已经断开,则发送与接收数据都会出
现问题,创建心跳机制,就是为了及时检测该套接字是否有效。
所谓心跳就是给服务端发送一个自定义的包,来告诉服务端,自己在线,以确保长连的有效性。
#####2.2.2 发送超时 Timer
在开发网络应用程序的时候,处理业务和通讯流程之间经常会出现矛盾。这种矛盾主要是由于
两者之间的不同步造成的。比如,网络的延迟较大,而实际业务处理的速度则相对比较快,那
么如果处理完某一事务然后等待发送成功再处理下一个事务则会大大降低效率。所以我们建立
了一个发送消息队列。这是一个典型的“生产者消费者”模型,业务逻辑将需要发送的数据放到
消息队列中,SendPacketMonitor 从消息队列中取出数据,并发送出去。
由于使用了消息队列的模式,发送就变成了一种异步操作,业务逻辑将消息放入消息队列后,
就可以进行其他的操作,而无法知道该消息是否真正发送成功。因此,我们在设计消息队列的
时候采用了回调机制,业务方在放入消息队列的时候,必须实现 onSuccess 接口与
onTimeOut 接口,分别在发送成功与发送超时调用。
发送超时 Timer 是自己采用线程来模拟实现的,在 SendPacketMonitor 类,作为消费者,
会不停的从消息队列中取出数据,取出数据后,会判断该消息产生的时刻与当前时间相比较,
如果发现时差已经超过系统定义的最大超时时间,则直接调用“生产者”的 onTimeOut 接口,通
知其发送超时。
#####2.2.3 重连“Timer”
重连是另一个保证长连的机制,虽然我们使用了心跳机制来保证长连,但是由于网络环境的复
杂性,我们无法保证在一个连接开启后,就永远保持连接,因此,重连就成了另外一个保证。
重连主要是为了当连接断开的时候,客户端能够自动快速的连接到服务端。为了系统的稳定性,
及相应快速,重连 Timer 采用的是线程模拟 Timer 实现。
重连的逻辑中,会去检测服务端的心跳包,如果发现长时间没有收到服务端的任何数据包,则
认为该 socket 已经失效,并进行重连。
在重连 Timer 中,为了防止雪崩效应的出现,我们在检测到 socket 失效,并不是立马进行重
连,而是让客户端随机 Sleep 一段时间再去连接服务端,这样就可以使不同的客户端在服务端
重启的时候不会同时去连接,从而造成雪崩效应。
#####2.2.4 好友状态 Timer
虽然在实现的逻辑中,服务端在好友状态变化的时候,会主动推送消息给客户端,但是我们还
是设计了好友状态 Timer。因为在网络复杂的环境中,有太多的未知因素。