WebSocket介绍

WebSocket是一种协议,本质上和http,tcp一样。协议是用来说明数据是如何传输的。它的url前缀是ws:// 或者wss://,后者是加密的websocket。WebSocket没有试图在HTTP之上模拟server推送,而是直接在TCP之上定义了帧协议,因此WebSocket能够实现全双工通信。

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 [RFC 6455][1],WebSocketAPI被W3C定为标准。

WebSocket解决了web实时化以及服务器端推送的问题,相比传统http有如下好处:

  1. 一个WEB客户端只建立一个TCP连接
  2. Websocket服务端可以推送(push)数据到web客户端.
  3. 有更加轻量级的头,减少数据传送量

更详细内容请移步[维基百科][2]

应用

客户端实时性一直是一个大问题。Web应用、移动应用以及电脑桌面程序本质上都是客户端程序。如何实时获取服务器内容呢?

现在很多网站为了实现推送技术,所用的技术都是轮询。当然还有基于flash的实时通信。推送最好的一种方法当然是保持Socket长连接,浏览器如何能发起TCP连接呢?HTML5的Websocket技术就解决了这个问题。 用WebSocket实现web应用的实时通信已经很成熟了,很多语言都有相关的api实现(维基百科中已经列出了很多),如果你想的话,完全可以根据[RFC 6455][1]协议自己开发api实现。WebSocket极大的简化了Web实时性的开发。已经有很多相关介绍的文章了,比如本文末尾的参考资料。

这里接下来主要说说WebSocket在Android开发中的应用。

Android中使用WebSocket

长久依赖Android的推送一直困扰着我们,最偷懒的做法就是使用轮询模拟推送。而基于此,国内甚至出现了2家(可能我不知道,甚至更多)专门做推送服务的公司。我们知道推送最好的方法就是Socket长连接,但是对服务器有一定要求。项目由于领导的推动,需要实现“真正的推送”。

开始选择的方案就是Socket长连接直接搞,自定义协议,自己实现封包,拆包以及解决tcp粘包等问题。说实话自己对于稳定性以及实现方法都不是很有信心,主要是因为没有经验,技术确实有待提高,实现以后没有经过大量测试。

后来由于服务器统一放在总公司管理之下,不授权开放tcp端口,也就是说只能使用Http 80端口,直接悲剧了。。就这样直接上Socket长连接被否定了。后来后台的同事找到了WebSocket协议,发现刚好解决这个问题。因为这和前面提到的浏览器如何能发起TCP连接本质上是一个问题。所以WebSocket的另一个优点就是基于80端口实现socket推送。

前面已经说过了,WebSocket是一个协议,开发Android版本是可行的,并且已经有很多实现了。我们的实现选用的WebSocket RFC6455版本协议,我选择的是这个https://github.com/tavendo/AutobahnAndroid。作者已经内置了一些Demo,可以很快上手,还可以根据协议自己开发扩展实现。

这次就写到这里,以后可能写写一些细节实现。

参考资料:

http://zh.wikipedia.org/zh-cn/WebSocket

http://tools.ietf.org/html/rfc6455

http://cnodejs.org/topic/4f16442ccae1f4aa27001139

http://www.cnblogs.com/yjf512/archive/2013/03/11/2953483.html [1]:http://tools.ietf.org/html/rfc6455 “The WebSocket Protocol” [2]:http://zh.wikipedia.org/zh-cn/WebSocket