stephen's blog

[object Object] object(s)
 

Web Real-time Connection

前言

关于web实时通信,我们都知道通常是使用长轮询或者长连接这种方式。 本文是对几种web实时通信进行简单的总结介绍,仅供参考。

Ajax long polling

传统的轮询方式是客户端定时(一般使用setInterval)向服务器发送ajax请求,服务器收到请求后马上响应信息。这种方式在客户端和服务端都很好实现,但是会造成很多无用的请求,当服务器没有可返回的数据时,这次请求就浪费了。
而长轮询,则是客户端向服务器发送Ajax请求,服务器接到请求后保持住连接,直到有新消息才返回响应信息,客户端处理完响应信息后再向服务器发送新的请求。
当然使用长轮询,客户端和服务端需要具备以下的条件:

Server-sent Events(SSE)

SSE是HTML5规范的一个组成部分,简单点说,就是客户端向服务端发送一个HTTP请求,然后服务端不断单向地向客户端推送信息(message)。这种信息在格式上也很简单,就是“信息”加上前缀“data: ”,然后以“\n\n”结尾:

1
2
3
4
5
$ curl http://example.com/dates
data: 1394572346452
data: 1394572347457
data: 1394572348463
^C

也就是说,当数据源有新数据的时候,服务器端能立刻发送给一个或多个客户端,而不用等客户端来请求,这些新数据可能是实时新闻、最新股票、上线朋友的聊天信息等等。

Websocket

在HTML5中,还提供了一种叫做Websocket的技术,它不仅仅是一种web通信方式,而且也是一种应用层的协议。 它和前文提到的SSE一样都是用来建立客户端和服务端之间的通信渠道,不过两者最大的区别在于:

可以看出,两者虽然功能相似,但是各有特点,适合于不同的场合。关于更多websocket的内容,可以参考websocket.org

Socket.io

因为不是所有浏览器都支持Websocket标准,所以为了解决这个问题,Socket.io便诞生了。
Socket.io是基于node.js生态系统,是对Node.js关于支持WebSocket协议所有API的封装和拓展,完全由js实现。
同时,Socket.io设计的目标是支持任何的浏览器和任何设备。于是在接口方面,Socket.io统一了通信的API,在内部支持一系列降级功能:

也就是说,Socket.io会根据环境来选择适合的通信方式。这点是十分强大的。
而搭建Socket.io环境也十分简单,首先需要创建一个作为工作空间的目录,然后安装Node.js,并在工作空间下安装Socket.io(命令:npm install socket.io),这样环境已经搭建完成。还可以安装基于Node.js框架(如Express.js等)以协助应用的服务器端开发。 具体可以参考我用socket.io && express 写的一个简易的聊天室程序