# 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 數據庫