您的位置:首页 > 其它

Socket通信几个概念

2016-04-18 22:47 225 查看

心跳流程

简介:

所谓的心跳机制就是客户端定时发送简单的信息给服务器端告诉它我还在而已。代码就是每隔若干时间发送一个固定信息给服务端,服务端收到后及时回复一个固定信息,如果服务端若干时间内没有收到客户端心跳信息则视客户端断开,同理如果客户端若干时间没有收到服务端心跳回值则视服务端断开。

客户端开启心跳流程图



描述:

客户端初始化SDK后,同步开启心跳轮训线程,线程实现内部会判断是否需要发送心跳协议(减少不必要的心跳协议请求),时刻监听通道连接状态。

Socket重连

当长连接被建立后,由于网络的稳定性,以及人为切换网络等一系列的问题,并不能保证长连接一直保持通畅状态,但是作为用户不会去注意网络的状态情况,他们关心的仅仅是APP的体验,所以对开发人员来说,实现断网重连功能,规避频繁断网带来的体验影响非常必要。

重连策略流程图



功能描述:

重连被触发时,如果该次连接成功,退出重连。反之重连失败后,会判断当前重连的次数是否超过预期值(这里设为6次),并对重连次数计数,如果超过就会退出重连,反之休眠预设的时间后再次进行重连操作。

重连触发条件



描述:

重连触发条件分为四种:

1:主动连接不成功(主动连接Socket,如果连接失败,会触发重连机制)

2:网络被主动断开(正常建立连接,操作过程中,网络被断开,通过系统广播触发重连)

3:服务器没响应,心跳没回值(服务端心跳预设时间内没回值,客户端认为服务端已经断开,触发重连)

网络状态判断

Tcp API并没有提供一个可靠的方法判断当前长连接通道状态,isConnected()和isClosed()仅仅告诉你当前的Socket状态,不是同一回事。isConnected()告诉你是否Socket与Romote host保持连接,isClosed()告诉你是否Socket被关闭。

假如你想判断长连接通道是否被关闭,只能通过以下方法:

1:read() return -1

2:readLine() return null

3:readXXX() throw EOPException for any other XXX

4: write 将抛出IOException: Broken pipe(通道被关闭)

所以SDK封装isConnected()方法的时候,一定要根据这几种情况综合判断当前的通道状态,而不是仅仅通过Socket.isConnected()或者Socket.isClosed()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: