即时通讯协议选型:WebSocket协议

日常开发中我们出于保证连接的稳定性的目的,将应用拆分成了「主进程」和「通讯进程」,并为二者定义了相互通信的接口 。
即便如此,我们也只是实现了客户端一侧的进程间通信,而要实现与完整聊天系统中另一端的角色——服务端的通信,则需依靠「网络通信协议」来协助完成
在此我们选用的是WebSocket协议 。
什么是WebSocket?
WebSocket一词,从词面上可以拆解为 Web & Socket 两个单词,Socket我们并不陌生,其是对处于网络中不同主机上的应用进程之间进行双向通信的端点的抽象,是应用程序通过网络协议进行通信的接口,一个Socket对应着通信的一端,由IP地址和端口组合而成 。需要注意的是,Socket并不是具体的一种协议,而是一个逻辑上的概念 。
那么WebSocket和Socket之间存在着什么联系呢,是否可以理解为是Socket概念在Web环境的移植呢?为了解答这个疑惑,我们先来回顾一下,在JAVA平台上进行Socket编程的流程:
 

  1. 服务端创建ServerSocket实例并绑定本地端口进行监听
  2. 客户端创建Socket实例并指定要连接的服务端的IP地址和端口
  3. 客户端发起连接请求,服务端成功接受之后,双方就建立了一个端对端的TCP连接,在该连接上可以双向通信 。而后服务端继续处于监听状态,接受其他客户端的连接请求 。
 
上述流程还可以简化为:
 
  1. 服务端监听
  2. 客户端请求
  3. 连接确认
 
与之类似,WebSocket服务端与客户端之间的通信过程可以描述为:
 
  • 服务端创建包含有效主机与端口的WebSocket实例,随后启动并等待客户端连接
  • 客户端创建WebSocket实例,并为该实例提供一个URL,该URL代表希望连接的服务器端
  • 客户端通过HTTP请求握手建立连接之后,后面就使用刚才发起HTTP请求的TCP连接进行双向通信 。
 
即时通讯协议选型:WebSocket协议

文章插图
 
WebSocket协议最初是html5规范的一部分,但后来移至单独的标准文档中以使规范集中化,其借鉴了Socket的思想,通过单个TCP连接,为Web浏览器端与服务端之间提供了一种全双工通信机制 。WebSocket协议旨在与现有的Web基础体系结构良好配合,基于此设计原则,协议规范定义了WebSocket协议握手流程需借助HTTP协议进行,并被设计工作在与HTTP(80)和HTTPS(443)相同的端口,也支持HTTP代理和中间件,以保证能完全向后兼容 。
由于WebSocket本身只是一个应用层协议,原则上只要遵循这个协议的客户端均可使用,因此我们才得以将其运用到我们的Android客户端 。
【更多音视频学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
点击领取→音视频开发基础知识和资料包
什么是全双工通信?
简单来讲,就是通信双方(客户端和服务端)可同时向对方发送消息 。为什么这一点很重要呢?因为传统的基于HTTP协议的通信是单向的,只能由客户端发起,服务端无法主动向客户端推送信息 。一旦面临即时通讯这种对数据实时性要求很高的场景,当服务端有数据更新而客户端要获知,就只能通过客户端轮询的方式,具体又可分为以下两种轮询策略:
 
  • 短轮询 即客户端定时向服务端发送请求,服务端收到请求后马上返回响应并关闭连接 。优点:实现简单 缺点: 1.并发请求对服务端造成较大压力 2.数据可能没有更新,造成无效请求 3.频繁的网络请求导致客户端设备电量、流量快速消耗 4.定时操作存在时间差,可能造成数据同步不及时 5.每次请求都需要携带完整的请求头
 
即时通讯协议选型:WebSocket协议

文章插图
 
长轮询 即服务端在收到请求之后,如果数据无更新,会阻塞请求,直至数据更新或连接超时才返回 。优点:相较于短轮询减少了HTTP请求的次数,节省了部分资源 。缺点: 1.连接挂起同样会消耗资源 2.冗余请求头问题依旧存在
即时通讯协议选型:WebSocket协议

文章插图
 
与上述两个方案相比,WebSocket的优势在于,当连接建立之后,后续的数据都是以帧的形式发送 。除非某一端主动断开连接,否则无需重新建立连接 。因此可以做到:


推荐阅读