Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Ajax vs WebSocket

  本站已经不使用Ajax好久了,目前的WebSocket版程序也运行的很稳定。有人问为什么不用Ajax?WebSocket有什么优点吗?我最讨厌这样的问题了,不过这个问题确实值得思考。和TCP比起来WebSocket简直毫无优点,但是和Ajax比起来它几乎浑身都是优点。
  Ajax有什么优点?
  有人回答Ajax可以在页面不刷新的情况下加载并更新数据就是它的优点。这用IFRAME也能做到,根本算不上什么优点。那么Ajax使用起来比IFRAME方便算是优点了吧?这是不可否认的,但仅此而已。由此我们只能得出一个结论:Ajax比IFRAME方式强。这放在2005年也许值得思考,但现在已经是2013年了。比IFRAME强很光荣吗?不过由于Ajax流行了这么多年,浏览器对它已经兼容的非常完美。而且它完全基于HTTP,只需要做前端的封装就可以使用。还有很多成熟的框架可以直接使用,像jQuery这样的封装,调用时只要一行代码就能搞定。初学者甚至不需要知道什么是XHR对象就可以使用封装好的Ajax。所以我总结下Ajax的优点就是:兼容性好、易学易用。
  我为什么不用Ajax?
  最重要的原因是它不能满足我的需求,或者说如果非要用Ajax做到同样的效果我需要更大的服务器开销。现代Web的趋势对数据实时同步的需求越来越高,无论是百度贴吧还是QQ空间,它们的程序都有长轮询在工作,以确保服务器上的数据可以实时推送到客户端。但是长轮询是个开销很大的东西,每次通信都需要一个新的HTTP请求,如果数据交互频繁,服务器就需要处理很多HTTP请求。而且,HTTP请求头中会发送Cookie等一些不必要的数据,这会浪费了大量带宽。当然,数据流方式的Comet也是一种不错的做法,他可以规避长轮询的各种问题。但是它需要在低版本IE上需要使用IFRAME做兼容,算不上纯正的Ajax方式。而且由于浏览器对XHR对象的实现细节目前没有规范的约束,这种Comet方式的稳定性并不好。所以说Comet是Ajax的硬伤。
  为什么用WebSocket?
  其实是迫不得已!我觉得WebSocket这个协议的设计也有很多蛋疼之处,之前的文章中就喷过它。如果浏览器直接提供TCP的API我一定不会用这种蛋疼的协议!有时候甚至想用UDP,但是浏览器不给兼容有什么办法呢?WebSocket是目前兼容最好的通信API了,虽然IE从10才开始兼容,但是低版本IE我们也可以通过AS上TCP的API来自己封装个WebSocket协议,这在之前的文章中有介绍过。使用WebSocket的另一大原因是很多Mobile设备上的浏览器也支持它。
  为什么WebSocket至今没有流行起来?
  最重要的原因就是兼容性,要是IE6就兼容早就流行起来了!问题是从IE10才开始兼容,虽然对低版本IE的兼容我们可以变相实现,但很多人就是不愿意使用变相兼容。他们觉得这种实现方式稳定性太差不可靠了。除了兼容性问题就是构架困难的问题,WebSocket的握手协议虽然是形似HTTP但它不是,所以很多HTTP服务器上难以实现WebSocket。几乎所有CGI方式运行的服务器程序都对WebSocket不友好,所以在服务器方面它就吃了个闭门羹。另外,目前也没有什么比较成熟的WebSocket框架可以用,所以一般的开发者都不会考虑它。
  什么时候不该用WebSocket?
  最大的问题依然是兼容性,虽然我们可以变相兼容到低版本IE上,但是那样就失去了原有的优势。所以如果一个项目面向的用户群使用的浏览器大部分都为低版本IE时就不该使用WebSocket。另外,WebSocket是长连接,如果客户端的程序没有数据实时同步的需求就没必要使用它。因为长连接会带来一定的服务器内存开销。如果Ajax就能轻松搞定的话就完全没必要兴师动众的搞WebSocket。
网名:
54.198.108.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^