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()。
相关文章推荐
- #1015 : KMP
- Android之Dialog详解
- UVA_10336_Divisibility
- Struts2框架中OGNL表达式的学习
- 思科防火墙ASA端口映射
- iOS _BSMachError: (os/kern) invalid capability (20)
- css的repaint和reflow
- 4.Java中获取当前目录的方法
- 敏捷风暴2016(广州站)
- 关于java中bean拷贝的思考
- Markdown 常用技巧
- Selinux SeAndroid理解
- C++ 中Traits技术 (4) —— 类型推导
- 2 ARM7的三级流水线过程
- css sprite
- Android 值动画一(ObjectAnimator)
- App更新策略课程-定义后台更新服务
- HANDLE,HMODULE,HINSTANCE,HWND概念
- 从mysql官网下载mysql安装包
- 位运算总结