# 發送和接收數據
## 6.1.發送數據
為了*發送一個WebSocket消息*,其中包括WebSocket連接之上的/data/,端點必須執行以下步驟。
1. 端點必須確保WebSocket連接處于OPEN狀態(比較 4.1節和4.2.2節)。如果在任何時刻WebSocket連接的狀態改變了,端點必須終止以下步驟。
2. 端點必須封裝/data/到定義在5.2節的一個WebSocket幀。如果要發送的數據太大或如果在端點想要開始發生數據時數據作為一個整體不可用,端點可以按照5.2節的定義交替地封裝數據到一系列的幀中。
3. 第一個包含數據的幀的操作碼(幀-opcode)必須按照5.2節的定義被設置為適當的值用于接收者解釋數據是文本還是二進制數據。。
4. 包含數據的最后幀的FIN位(幀-fin)必須按照5.2節的定義設置位1。
5. 如果數據正由客戶端發送,幀必須按照5.3節的定義被掩碼。
6. 如果任何擴展(第9章)已經協商用于WebSocket連接,額外的考慮可以按照這些擴展定義來應用。
7. 已成形的幀必須在底層網絡連接之上傳輸。
## [](https://github.com/zhangkaitao/websocket-protocol/wiki/6.%E5%8F%91%E9%80%81%E5%92%8C%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE#62%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE)6.2.接收數據
為了接收WebSocket數據,端點監聽底層網絡連接。傳入數據必須按照5.2節的定義解析為WebSocket幀。如果接收到一個控制幀(5.5節),幀必須按照5.5節定義的來處理。當接收到一個數據幀(5.6節)時,端點必須注意5.2節由操作碼(幀-opcode)定義的數據的/type/。這個幀的“應用數據”被定義為消息的/data/。如果幀由一個未分片的消息組成(5.4節),這是說*已經接收到一個WebSocket消息*,其類型為/type/且數據為/data/。如果幀是一個分片消息的一部分,隨后數據幀的“應用數據”連接在一起形成/data/。當接收到由FIN位(幀-fin)指示的最后的片段時,這是說*已經接收到一個WebSocket消息*,其數據為/data/(由連續片段的“應用數據”組成)且類型為/type/(分配消息的第一個幀指出)。隨后的數據幀必須被解釋為屬于一個新的WebSocket消息。
擴展(第9章)可以改變數據如何讀的語義,尤其包括什么組成一個消息的邊界。擴展,除了在負載中的“應用數據”之前添加“擴展數據”外,也可以修改“應用數據”(例如壓縮它)。
服務器必須按照5.3節的定義為從客戶端接收到的數據幀移除掩碼。