一,理论概述:
在传统的web设计中,都是基于“请求——响应”的模式。在整个通信的过程中,都是web客户端首先发起一个请求,服务器再立即根据请求作出响应,一般服务端响应完毕(比如在60s之内)就自动断开这一次连接(见图1)。
这其中有一个最大的局限性就是服务端不能主动发送信息给客户端。现在我们的需求很简单,基本和必要的事情就是如何实现双工通信。如果要让服务端主动发信息给web的客户端,我们以前采取的一种策略就是轮询。
轮询就是不断地发送携带了没有实际意义的数据来维持与服务端“保持沟通”以达到不间断监听的目的。虽然轮询可以比较及时地发现服务器产生的消息,但也并没有真正意义上实现即时通讯,发生在轮询之间的消息仍有延迟,况且最为致命的缺陷就是为了维持连接客户端和后台服务端都要产生极大的开销。然而,Websocket技术的出现让即时通讯功能在实现的基础上发生的很大的改变(见图3)。
实际来说,WebSocket技术并不是使用了HTTP协议,HTTP协议是一种无状态的,理论上是无法实现全双工通讯的。Websocket技术采用了websocket协议,使其能够达到类似Socket技术的通讯效果。Websocket协议也是基于TCP协议的,这种在协议底层技术层面上的支持,使得websocket技术达到了全双工通讯的效果。然而WebSocket技术是为web技术提供服务的,在实际操作中,我们可以使用前端的JavaScript语言加上WEB后端(比如PHP、Java等语言)建立通讯,这看上去和传统的web编程并没有任何区别。只要服务端能够及时地主动发信息,我们就可以及时地把消息转发给另一个客户端,实现客户端与客户端之间的即时通讯。
那么在WebSocket的技术支持下我们理论上可以在WEB技术中实现类似于市面上的任何一款即时通讯软件的功能(比如QQ和微信)下面是我尝试着要实现的需求(下表1)。
信息载体消息类型接收方
字符流文字消息(text)个人或群体
字节流图片消息(p_w_picpath)个人或群体
语音消息(audio)个人或群体
视频消息(video)个人或群体
文件传送(application/octet-stream)个人或群体
表1可实现的目标
下面可以采用javascript语言(前端)+ java语言(后端)并通过WebSocket技术实现即时通讯模块。但在此之前我们还得认识一下没有在java API掩盖之下的websocket工作示意图(图4):