杨洪博
2014 年加入去哪儿,一直从事 A ndroid 客户端的研发,目前负责安卓公共功能的开发和维护,为公司内各类安卓客户端提供基础功能的支持。
基本名词解释
网络通信采用 TCP 协议时,在读和写操作之前,服务器与客户端之间必须建立一个连接,当读写完成后,不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手,链接的断开则需要四次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的。
所谓长连接,指在一个 TCP 连接上可以连续发送多个数据包,在 TCP 连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持,也就是我们经常说的心跳。具体的流程如下图:
我们平常所使用的 http 协议,是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接。而我们这里所指的长连接并不是 http 协议中 keep-alive 的长连接,而是我们根据 tcp 协议自己编写的,服务器可掌控客户端以及连接状态的一种特定的长连接。服务器可以通过绑定等操作,将连接 id 和业务 id 关联,做到有目的的推送信息。
基于以上原理,在安卓客户端上,长连接可以应用于服务器需要主动通知客户端的一些场景,例如用户提醒,应用内智能反馈,用户即时通讯等。在介绍具体应用之前,我们再来看一下长连接的两种常见模式:NIO-非阻塞 IO 和 BIO-阻塞 IO
NIO 的原理和实现
然而我们该用什么样的模式来做长连接呢。下面我们对两种常见的模式进行一下对比。
上图一个经典的每连接每线程的模型,BIO 如果维持一个连接就必须在服务器上起两个线程,之后每增加一个连接就需要起额外的两个线程。之所以使用多线程,主要原因在于 socket.accept()、socket.read()、socket.write()三个主要函数都是同步阻塞的。
NIO 服务端连接过程
1. 创建 ServerSocketChannel 实例 serverSocketChannel,并 bind 到指定端口。
2. 创建 Selector 实例 selector;
3. 将 serverSocketChannel 注册到 selector,并指定事件 OP_ACCEPT。
4. while 循环执行:
4.1 调用 select 方法,该方法会阻塞等待,直到有一个或多个通道准备好了 I/O 操作或等待超时。
4.2 获取选取的键列表;
4.3 循环键集中的每个键:
4.3.1 获取通道,并从键中获取附件(如果添加了附件);
4.3.2 确定准备就绪的操纵并执行,如果是 accept 操作,将接收的信道设置为非阻塞模式,并注册到选择器;
4.3.3 如果需要,修改键的兴趣操作集;
4.3.4 从已选键集中移除键
为了实现 Selector 管理多个 SocketChannel,必须将多个具体的 SocketChannel 对象注册到 Selector 对象,并声明需要监听的事件,目前有 4 种类型的事件:
connect:客户端连接服务端事件,对应值为 SelectionKey.OP_CONNECT(8)
accept:服务端接收客户端连接事件,对应值为 SelectionKey.OP_ACCEPT(16)
read:读事件,对应值为 SelectionKey.OP_READ(1)
write:写事件,对应值为 SelectionKey.OP_WRITE(4)。
长连接的应用
一条长连接,可以通过协议拓展,利用丰富且多层的协议,撑起一个客户端家族的与服务器之间的通信。具体表现为:多个 app 可共用一条长连接,同时与服务器进行通信。
1.AIDL:主要是实现进程间通信。
2. 进程共享:不同应用共享一个进程进行通信 , 发现已经起了通信进程则不重新起新进程 , 需要在 AndroidManifest.xml 文件中配置 , 代码如下。
同一个 app 可以共用一条长连接,处理不同业务线的业务,通过协议族,接受不同的服务器的信息。所以整个系统的结构图如下:
一套以长连接为中心的客户端 SDK 和云服务
目前平台为各个业务线准备了各种功能的一站式长连接解决方案。包括 IM 云,推送云等,各个业务线可以自主选择在大客户端内接入,或者在自己开发的新 app 中接入我们的 sdk,从而使得自己的客户端具有离线推送,即时通讯等需要较长开发时间的功能。
小结
因为运营的需要,用户对服务要求的提升,大数据和 AI 蓬勃的发展等因素,我认为基于长连接的应用场景会越来越多,不仅仅是推送和聊天的需求,随着后端对客户端感知,对客户行为的分析逐渐加深,服务器主动对客户端施加影响的需求会越来越大,一个稳定的,全方位的长连接解决方案必不可少,希望和大家共同探讨更加合适的解决方案,如果有朋友想接入我们的服务,可以与我们联系。
返回搜狐,查看更多
责任编辑: