网站即时通讯功能,WEB即时通讯4大技术( 二 )


从浏览器支持角度来看 。WebSocket已经近在眼前 。但仍有一段较长的路要走 。特别是在中国这个IE6、7、8依然盛行的国家 。旧版本浏览器的消亡需要很长一段时间 。在完全实现浏览器全兼容前 。Comet技术可能仍然是最好的解决方案 。不过 。当前也已存在一些比较成熟的封装方案来解决这种兼容性限制 。比如:开源的Socket.io 。详见《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》 。
SSE:未来的解决方案2SSE(Server-Sent Event 。服务端推送事件)是一种允许服务端向客户端推送新数据的HTML5技术 。与由客户端每隔几秒从服务端轮询拉取新数据相比 。这是一种更优的解决方案 。
与WebSocket相比 。它也能从服务端向客户端推送数据 。那如何决定你是用SSE还是WebSocket呢?概括来说 。WebSocket能做的 。SSE也能做 。反之亦然 。但在完成某些任务方面 。它们各有千秋 。
WebSocket是一种更为复杂的服务端实现技术 。但它是真正的双向传输技术 。既能从服务端向客户端推送数据 。也能从客户端向服务端推送数据 。
WebSocket和SSE的浏览器支持率差不多 。大多数主流桌面浏览器两者都支持 。在Android 4.3以及更早的版本中 。系统默认浏览器两者都不支持 。Firefox和Chrome则完全支持;Android 4.4中 。系统默认浏览器两者都支持;Safari从5.0开始支持SSE(iOS系统从4.0开始) 。但直到6.0才正确地支持WebSocket(6.0之前的Safari所实现的WebSocket协议存在安全问题 。所以一些主流浏览器已经禁用了基于这个协议的实现) 。
与WebSocket相比 。SSE有一些显著的优势 。个人认为它最大的优势就是便利:不需要添加任何新组件 。用任何你习惯的后端语言和框架就能继续使用 。你不用为新建虚拟机、弄一个新的IP或新的端口号而劳神 。就像在现有网站中新增一个页面那样简单 。我喜欢把这称为既存基础设施优势 。
SSE的第二个优势是服务端的简洁 。相对而言 。WebSocket则很复杂 。不借助辅助类库基本搞不定(我试过 。令人痛苦) 。
因为SSE能在现有的 。甚至直接在命令行中运行后端脚本 。
不过 。这就引出了WebSocket相较SSE的一个潜在优势:WebSocket是二进制协议 。而SSE是文本协议(通常使用UTF-8编码) 。当然 。我们可以通过SSE连接传输二进制数据:在SSE中 。只有两个具有特殊意义的字符 。它们是CR和LF 。而对它们进行转码并不难 。但用SSE传输二进制数据时数据会变大 。如果需要从服务端到客户端传输大量的二进制数据 。最好还是用WebSocket 。
WebSocket相较SSE最大的优势在于它是双向交流的 。这意味向服务端发送数据就像从服务端接收数据一样简单 。用SSE时 。一般通过一个独立的Ajax请求从客户端向服务端传送数据 。相对于WebSocket 。这样使用Ajax会增加开销 。但也就多一点点而已 。如此一来 。问题就变成了“什么时候需要关心这个差异?”如果需要以1次/秒或者更快的频率向服务端传输数据 。那应该用WebSocket 。0.2次/秒到1次/秒的频率是一个灰色地带 。用WebSocket和用SSE差别不大;但如果你期望重负载 。那就有必要确定基准点 。频率低于0.2次/秒左右时 。两者差别不大 。
从服务端向客户端传输数据的性能如何?如果是文本数据而非二进制数据(如前文所提到的) 。SSE和WebSocket没什么区别 。它们都用TCP/IP套接字 。都是轻量级协议 。延迟、带宽、服务器负载等都没有区别 。除非……呃?除非什么?
当你在享用SSE的既存基础设施优势 。并在客户端和服务端脚本之间设了一个网络服务器 。区别就显现出来了 。一个SSE连接不仅使用一个套接字 。还会占用一个Apache线程或进程 。如果用PHP 。它会为这个连接专门创建一个PHP新实例 。Apache和PHP会使用大量的内存 。这会限制服务器所能支持的并行连接数 。所以 。要做到用SSE在数据传输性能上和WebSocket完全一样 。需要写一个自己的后端服务器 。当然 。那些在任何情况下都会用自己的服务器并使用Node.js的人 。会觉得这有什么稀奇的 。
说一下WebSocket在旧版本浏览器上的兼容 。当前 。大约超过2/3的浏览器支持这些新技术 。移动端浏览器的支持率会低一些 。依惯例 。每当需要双向套接字时 。就会用到Flash 。并且WebSocket的向后兼容通常是用Flash来做 。这已经相当复杂了 。如果浏览器上没有Flash 。情况更糟 。概括来说 。WebSocket难兼容 。SSE易兼容 。
【网站即时通讯功能,WEB即时通讯4大技术】有关SSE的详细介绍文章请参见:《SSE技术详解:一种全新的HTML5服务器推送事件技术》 。

推荐阅读