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