WebSocket
html 页面在刚刚开始出现的时候是静态的,不能进行交互,直到Ajax的出现,但是所有的请求都必须由客户端发起,服务端响应,如果服务端有最新消息,难以发送到客户端去,在WebSocket 基数出现前,为了让客户端能够即时的获取服务端的数据,一般采用如下三种方案:
- 轮询
这是最简单的一种解决方案,客户端在固定的时间间隔下,不停的向服务端发送请求,查看服务端是否有最新的数据,服务端如果有最新的数据则返回给客户端,服务端如果没有则返回一个空的 json 或者 xml 文档,这种方式实现简单,但是弊端明显,会有大量无效请求,浪费服务端资源。
- 长连接
长连接有点类似于轮询,不同的是服务端不是每次都会响应客户端的请求,只有在服务端有新数据的时候才会响应客户端的请求,这种方式节省资源,但是也存在一些问日,比如:1. 如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。2. TCP和HTTP 规范中都有连接超时,所以长连接蹦年一直持续,客户端和服务端的连接需要定期的连接和关闭再连接。
- Applet 和 Flash
Applet 可以内嵌到浏览器中去执行,但是浏览器必须能够运行Java或者Flash,无论是Applet还是Flash都存在安全问题,随着Html5在标准浏览器中广泛支持,Flash下架已经被提上日程
WebSocket特点
- HTTP/1.1 的升级特性
在所有的 HTTP 客户端都可以在请求头中包含 Connection:Upgrade,这个表示客户端希望升级请求协议。我们需要在 Upgrade 头中指定一个或多个协议的列表,这些协议必须兼容HTTP/1.1 协议,服务器收到请求后,如果接受升级请求,那么将会返回一个101的状态码,表示转换请求协议,同时在 Upgrade 头中使用单个值。最大的好处就是最终使我们可以使用任意的协议,在升级握手完成之后,建立一个Socket连接。
- 使用 HTTP/1.1升级的WebSocket协议
一个WebSocket 请求首先使用非正常的HTTP请求以特定的模式访问一个URL,这个URL有两种模式,分别是ws和wss,对应 http 和 https。请求头中除了Connextion:Upreade 之外还有一个 Upgrade:websocket,他们共同告诉服务器将连接升级为WebSocket这样一种全双工协议。如此,在握手完成之后,文本消息或者其他二进制消息就可以在两个方向上进行发送,而不需要关闭和重建连接。
- WebSocket 协议的优势
1. WebSocket 连接在端口80(ws)或者443(wss)上创建,与HTTP使用的端口相同,基本上所有的防火墙都不会阻塞WebSocket连接
2. 使用HTTP协议进行握手,因此它可以自然而然的集成到网络浏览器和HTTP服务中
3. ping 和 pong 将被反复发送,进而保持WebSocket 连接几乎一直处于活跃状态。
4. 当消息启动或者到达时,服务端和客户端都可以知道
5. 连接关闭时将发送一个特殊的关闭消息
6. 支持跨域,可以避免Ajax的限制
7. 当握手完成后就不存在连接数每个主机名两个连接的限制了,因为此时连接已经不再是HTTP协议了
- WebSocket的用途