写在前面
本人是搞技术的,由衷的喜欢技术。其实我想大多数开发人员喜欢技术的并不多,多数为了工作而不得不学习新的技术。但是我是那种喜欢技术的,除了工作中会用的新计划我会去研究,业余时间我也喜欢研究和学习新的技术。当然,鄙人学习新的技术本质的目的不是在于跳槽,起初的目的就是为了好玩!
有时想想,我在研究学习的时候,也许别人正在流连忘返与各种娱乐场所,当时我想说其实那只是他们的爱好,那么我的爱好就是写代码,其实也没所谓…道不同何必去管别人!
一种Html5的协议
WebScoket的字眼对于学过各种编程语言的开发者来说并不陌生,尤其“Socket”这个词,想到这个词,我们就会想到 UDP、TCP、Http等等各种传输协议。Http协议大家很是熟悉,所有的www的文件都必须遵守这个标准,协议协议顾名思义就是为了统一管理大家约定的一个传输方式。大家都知道以往的html标准都是基于http协议的,那么伴随着html5的建立,在html5标准中新来的一个新的字眼websokcet。Websocket跟http一样,都是基于tcp协议的一种扩展。从概念的角度来说,业务费就是满足现有web需求,建立的一种新的web传输方式。
传统即时通讯的做法
一个新的技术的出现和一种新的标准的建立,其实大致都是为了解决实际问题,提供了一项新的解决方案。Websocket也是如此,那么首先我们分析一下websocket的基于html5的问题而出现,它到底跟传统的http协议有哪些异同点呢?
其实对比这两个问题,我们最好例句一个应用场景来描述这个问题,这样也比较切合实际,虚头巴脑的技术讲解其实是对技术的一种玷污。
现在一家公司想做web应用《web内部及时通讯》,我们想到即时通讯技术,我们其实很快就会联想到QQ、微信等相关产品,但是但多数是基于PC端,基本是利用TCP、UDP协议去实现的。那么对于http协议而言的web程序一般公司却做的很少,不是因为不需要,而是这的确有些难度,当然像腾讯webqq版做的真是没话说。且不去研究腾讯是如何做的,我们先来看看传统做web及时通讯都有哪些方案。
1. Ajax轮询
2. 长连接
3. Comet
4. Flash、applet
第一点说白了,就是启用js去启用一个定时任务,每隔一个定时时间就去请求一次服务器后台,读取最新的消息,然后客户端进行显示。其实这种方式目前依然还是被很多公司或者说是技术人员去使用,之所以没有思考升级他们的这种方案,是因为目前他们用这种方式还没有遇到问题,之所以没遇到问题,我的意思其实是说,他们的应用在线用户还很少,呵呵~~这样功能其实可以实现,但是这样的方式,客户端就会不停的打开和服务端的链接,在并发量很大的互联网应用中,这种做法是相当危险的,他基本上是集聚而且又是一种持续的加大着服务端的压力。
第二点:HTTP长连接这种把数据从服务器主动“推”到客户端的技术,能带来的好处不言而喻。它可以把最新的统计数据输出到客户端,也可以实现即时通讯。HTTP1.1支持持久连接。如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-alive。TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。结合服务端的处理,再加上一定观察者模式或其它则可以再一定程度上去优化。
第三点:Comet基于 HTTP 长连接的“服务器推送”技术,对于具体的内容大家可以看这个网址http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
第四点:Flash applet 以及很多插件的模式,其实就是在浏览器上跨越http协议,使用本地Socket 和服务端进行相关交互。这个模式的不好的一点就是浏览器需要装插件,这个时候也会就会存在浏览器差异等不稳定的情况。
总结:无论以上那种方式,可以大致分为两点:第一,用长连接的方式进行处理,比如技术Comet或者Comet后的pushlet 基本上都是利用长连接支持,来在服务端做优化以及处理。第二,在浏览器上做手脚,利用浏览器上的插件模式,进行建立夸http协议之外的sokcet通信。
Websocket原理
WebSocketprotocol 。
现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。
而比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。
在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
1. Header
互相沟通的Header是很小的-大概只有 2 Bytes
2. Server Push
浏览器
服务器
在服务器端,也出现了一些实现websocket协议的项目:
jetty 7.0.1 包含了一个初步的实现
resin 包含有websocket 实现
pywebsocket,apache http server 扩展
apache tomcat7.0.27 版本
Nginx 1.3.13 版本
jWebSocket java实现版
websocket api在浏览器端的广泛实现似乎只是一个时间问题了, 值得注意的是服务器端没有标准的api, 各个实现都有自己的一套api, 并且jcp也没有类似的提案, 所以使用websocket开发服务器端有一定的风险.可能会被锁定在某个平台上或者将来被迫升级.
(个人微信号)
![](https://wallpaper.image.duodianmeihao.com/ryan/ryan.jpg)
![](https://wallpaper.image.duodianmeihao.com/ryan/qrcode.jpg)