多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# WebSocket `Websocket` 其实是一个新协议,跟 `HTTP` 协议基本没有关系,只是为了兼容现有浏览器的握手规范。由 `HTML5` 提出。 ## Websocket 实例 典型的 Websocket 握手(借用Wikipedia的)如下: #### 浏览器发送给服务器 ```javascript GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com ``` - `Upgrade: websocket` 和 `Connection: Upgrade`,告诉 nginx、apache 等服务器,此次请求是 `websocket` 请求。 - `Sec-WebSocket-Key` 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。 - `Sec_WebSocket-Protocol` 是一个用户定义的字符串,用来区分相同 URL 下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~ - `Sec-WebSocket-Version` 是告诉服务器所使用的 `Websocket Draft` (协议版本) #### 服务器返回: ```javascript HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat ``` - 同样,`Upgrade: websocket` 和 `Connection: Upgrade`,告诉浏览器成功切换协议为 `websocket`. - `Sec-WebSocket-Accept` 这个则是经过服务器确认,并且加密过后的 `Sec-WebSocket-Key`。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。 - `Sec-WebSocket-Protocol` 则是表示最终使用的协议. (至此,http作用已经完成) ## WebSocket #### websocket 的创建 ```javascript var Socket = new WebSocket(url, [protocol] ); ``` > 以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。 #### websocktet 的状态 `只读属性 readyState` 表示连接状态,可以是以下值: |值 |表示的状态 | |---|------------------| |0 |表示连接尚未建立。 | |1 |表示连接已建立,可以进行通信。| |2 |表示连接正在进行关闭。| |3 |表示连接已经关闭或者连接不能打开。| #### websocket 的事件 |事件 |事件处理程序 |描述 | |-------|-------------------|------------------| |open |Socket.onopen |连接建立时触发 | |message|Socket.onmessage |客户端接收服务端数据时触发| |error |Socket.onerror |通信发生错误时触发 | |close |Socket.onclose |连接关闭时触发 | #### websocket 方法 |方法 |描述 | |---------------|------------------| |Socket.send() |使用连接发送数据 | |Socket.close() |关闭连接 | > 单个 TCP 连接上进行全双工通讯的协议。 > 获取 Web Socket 连接后,可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。 > 持久化 ### websocket 的实现 - python的一个开源项目 pywebsocket 可以实现简单的 websocket 服务端。 - [WebSocket-Node](https://github.com/Worlize/WebSocket-Node) 实现 websocket 服务端,需要依赖于底层的C++,Python的环境,支持以node做客户端的访问。 - [faye-websocket-node](https://github.com/faye/faye-websocket-node) 实现 websocket 服务端,是faye软件框架体系的一部分,安装简单,不需要其他依赖库。 - [socket.io](https://github.com/LearnBoost/socket.io) 实现 websocket 服务端,功能强大,支持集成websocket服务器端和Express3框架与一身。 ## webSocket 如何兼容低浏览器 Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR。