# 發(fā)送和接收數(shù)據(jù)
## 6.1.發(fā)送數(shù)據(jù)
為了*發(fā)送一個WebSocket消息*,其中包括WebSocket連接之上的/data/,端點必須執(zhí)行以下步驟。
1. 端點必須確保WebSocket連接處于OPEN狀態(tài)(比較 4.1節(jié)和4.2.2節(jié))。如果在任何時刻WebSocket連接的狀態(tài)改變了,端點必須終止以下步驟。
2. 端點必須封裝/data/到定義在5.2節(jié)的一個WebSocket幀。如果要發(fā)送的數(shù)據(jù)太大或如果在端點想要開始發(fā)生數(shù)據(jù)時數(shù)據(jù)作為一個整體不可用,端點可以按照5.2節(jié)的定義交替地封裝數(shù)據(jù)到一系列的幀中。
3. 第一個包含數(shù)據(jù)的幀的操作碼(幀-opcode)必須按照5.2節(jié)的定義被設置為適當?shù)闹涤糜诮邮照呓忉寯?shù)據(jù)是文本還是二進制數(shù)據(jù)。。
4. 包含數(shù)據(jù)的最后幀的FIN位(幀-fin)必須按照5.2節(jié)的定義設置位1。
5. 如果數(shù)據(jù)正由客戶端發(fā)送,幀必須按照5.3節(jié)的定義被掩碼。
6. 如果任何擴展(第9章)已經(jīng)協(xié)商用于WebSocket連接,額外的考慮可以按照這些擴展定義來應用。
7. 已成形的幀必須在底層網(wǎng)絡連接之上傳輸。
## [](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.接收數(shù)據(jù)
為了接收WebSocket數(shù)據(jù),端點監(jiān)聽底層網(wǎng)絡連接。傳入數(shù)據(jù)必須按照5.2節(jié)的定義解析為WebSocket幀。如果接收到一個控制幀(5.5節(jié)),幀必須按照5.5節(jié)定義的來處理。當接收到一個數(shù)據(jù)幀(5.6節(jié))時,端點必須注意5.2節(jié)由操作碼(幀-opcode)定義的數(shù)據(jù)的/type/。這個幀的“應用數(shù)據(jù)”被定義為消息的/data/。如果幀由一個未分片的消息組成(5.4節(jié)),這是說*已經(jīng)接收到一個WebSocket消息*,其類型為/type/且數(shù)據(jù)為/data/。如果幀是一個分片消息的一部分,隨后數(shù)據(jù)幀的“應用數(shù)據(jù)”連接在一起形成/data/。當接收到由FIN位(幀-fin)指示的最后的片段時,這是說*已經(jīng)接收到一個WebSocket消息*,其數(shù)據(jù)為/data/(由連續(xù)片段的“應用數(shù)據(jù)”組成)且類型為/type/(分配消息的第一個幀指出)。隨后的數(shù)據(jù)幀必須被解釋為屬于一個新的WebSocket消息。
擴展(第9章)可以改變數(shù)據(jù)如何讀的語義,尤其包括什么組成一個消息的邊界。擴展,除了在負載中的“應用數(shù)據(jù)”之前添加“擴展數(shù)據(jù)”外,也可以修改“應用數(shù)據(jù)”(例如壓縮它)。
服務器必須按照5.3節(jié)的定義為從客戶端接收到的數(shù)據(jù)幀移除掩碼。
