我已经使用WebSockets一段时间了,我选择使用Node服务器和WebSockets为我在大学的最后一年的项目创建一个敏捷项目管理工具。我发现使用WebSockets可以使应用程序每秒处理的请求数量增加624%。
但是,自启动项目以来,我已经阅读了安全漏洞,并且某些浏览器默认选择禁用WebSocket。
这使我想到了一个问题:
当WebSocket似乎在降低延迟和资源开销方面做得很好时,为什么要使用AJAX?AJAX有什么比WebSocket更好的功能吗?
WebSockets并不是要取代AJAX,严格来说也不是替代Comet / long-poll(尽管在很多情况下这很有意义)。
WebSocket的目的是在浏览器和服务器之间提供低延迟,双向,全双工和长时间运行的连接。WebSockets为浏览器应用程序打开了新的应用程序域,而这实际上是使用HTTP和AJAX不可能实现的(交互式游戏,动态媒体流,桥接到现有网络协议等)。
但是,WebSockets和AJAX / Comet之间肯定有目的重叠。例如,当浏览器希望收到服务器事件(即推送)的通知时,Comet技术和WebSockets当然都是可行的选择。如果您的应用程序需要低延迟推送事件,那么这将是支持WebSockets的一个因素。另一方面,如果您需要与现有框架和已部署的技术(OAuth,RESTful API,代理,负载平衡器)共存,那么这将是支持Comet技术的一个因素(目前)。
如果您不需要WebSockets提供的特定好处,那么最好坚持使用AJAX和Comet等现有技术,因为这可以让您重用并与庞大的现有工具,技术,安全机制生态系统集成,知识库(例如,与WebSockets相比,stackoverflow上的更多的人知道HTTP / Ajax / Comet)等。
另一方面,如果要创建一个在HTTP / Ajax / Comet的延迟和连接限制内不能很好运行的新应用程序,请考虑使用WebSockets。
另外,一些答案表明WebSocket的缺点之一是服务器和浏览器支持有限/混合。让我散布一下。尽管iOS(iPhone,iPad)仍支持较早的协议(Hixie),但大多数WebSockets服务器均支持Hixie和HyBi / IETF 6455版本。大多数其他平台(如果它们还没有内置支持)可以通过web- socket-js(基于Flash的polyfill)获得WebSockets支持。这涵盖了绝大多数Web用户。另外,如果您将Node用作服务器后端,则可以考虑使用Socket.IO,其中包括web- socket-js作为后备,即使不可用(或禁用),它也将退回到使用任何Comet技术适用于给定的浏览器。
更新 :iOS 6现在支持当前的HyBi / IETF 6455标准。