websocket html5 新协议: 在浏览器和服务器之间建立一个不受限的双向通信的通道.

HTTP 协议: 先请求 在 服务器响应协议.

必须浏览器 先发送请求给服务器. 服务器才能响应请求.发回数据.

换句话说: 浏览器不主动发起请求 服务器是没办法发送数据给浏览器的. 要实现 在线股票的功能.就只能借助别的 类似flash了..’

WebSocket 协议

利用Http协议来建立链接. WebSocket 连接也 必须由浏览器发起 因为最初的链接靠的是http请求. 只不过 一旦 websocket 连接成功了. 以后就可以互相通信了.

GET ws://localhost:3000/ws/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:3000
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13

该请求 和普通http请求区别: GET请求的地址不是类似/path/,而是以ws://开头的地址; 请求头Upgrade: websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接; Sec-WebSocket-Key是用于标识这个连接,并非用于加密数据; Sec-WebSocket-Version指定了WebSocket的协议版本。

如果服务器 接收请求 会返回: HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: server-random-string

该响应代码101表示本次连接的HTTP协议即将被更改,更改后的协议就是Upgrade: websocket指定的WebSocket协议。

一个WebSocket连接就建立成功: 浏览器和服务器就可以随时主动发送消息给对方。 消息有两种,一种是文本,一种是二进制数据。 通常,我们可以发送JSON格式的文本,这样,在浏览器处理起来就十分容易。

为什么WebSocket连接可以实现全双工通信而HTTP连接不行呢?实际上HTTP协议是建立在TCP协议之上的,TCP协议本身就实现了全双工通信,但是HTTP协议的请求-应答机制限制了全双工通信。WebSocket连接建立以后,其实只是简单规定了一下:接下来,咱们通信就不使用HTTP协议了,直接互相发数据吧。

服务器

由于WebSocket是一个协议,服务器具体怎么实现,取决于所用编程语言和框架本身。 Node.js本身支持的协议包括TCP协议和HTTP协议, 要支持WebSocket协议,需要对Node.js提供的HTTPServer做额外的开发。 已经有若干基于Node.js的稳定可靠的WebSocket实现,我们直接用npm安装使用即可。