# 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。
- 1. HTML
- 1.1 HTML 标签
- 1.2 HTML 属性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 综合知识
- 5.1 HTTP
- 5.2 websocket
- 5.3 综合问题集合
- 5.4 前端优化
- 6. 附加知识
- 6.1 TCP/IP
- 6.2 数据结构
- 6.3 前端开发
- 7. 相关工具
- 7.1 Git
- 7.2 调试
- 7.3 Linux
- 8. 其他需要了解的内容
- 8.1 Python3
- 8.2 Java
- 8.3 数据库