簡體   English   中英

Python websocket 服務器 - 發送消息

[英]Python websocket server - sending message

我正在編寫自己的 websocket 服務器和客戶端。 我已經成功處理了握手並建立了連接。

現在我正在編寫創建適當框架的 send_message function。 下面的例子只是為了這個問題的目的,它不是我最終打算寫的,這只是我嘗試給我相同的以下結果的許多方式中的一種。

def send_message(client_socket: socket.socket, message: str):
    length = len(message)
    opcode = 0x1
    fin, rsv1, rsv2, rsv3, opcode = 1, 0, 0, 0, opcode
    first_byte = chr(fin << 7 | rsv1 << 6 | rsv2 << 5 | rsv3 << 4 | opcode)
    if length < 126:
        mask = 0
        second_byte = chr(mask << 7 | length)
        first_byte += second_byte
        first_byte = six.b(first_byte)
    payload = first_byte + message.encode("utf-8")

    return client_socket.send(payload)

對於輸入:從 function 上方的服務器確定應該Ok from server發送b'\x81\x0eOk from server'

第一個字節\x81 - 10000001

第一位設置為 1 - FIN ,表示這是消息的最后一幀

第二,第三和第四 - 全為零,對於這個例子無關緊要

以下四位 - opcode 0001,表示消息是文本

有問題的第二個字節\x0e它應該是00001110第一位設置為 0 - mask ,如果設置為 1,則有效負載被屏蔽,在我的情況下必須設置為 0,從服務器到客戶端的所有消息都不能被屏蔽

以下 7 位 - 有效載荷長度,如果Ok from server = 14

剩下的是有效載荷。

現在,當我在 chrome 中將其發送到 javascript 客戶端時,我收到: WebSocket connection to 'ws://localhost:8002/' failed: A server must not mask any frames that it sends to the client.

我從多個示例(websockets、SimpleWebsocketServer 等)中復制了代碼,所有這些都給了我相同的b'\x81\x0eOk from server'

問題 #1我做錯了什么?

問題 #2如何調試 websockets? 在 chrome devtools 中,不再有用於檢查 websocket 的“框架”選項卡,因此看不到接收到的實際字節。 嘗試過 Wireshark,但多年來一直缺少解碼 websocket 幀功能。

編輯

function 創建了正確的有效負載,問題出在其他地方,可能是套接字設置。

最初的握手有\n\r而不是\r\n 無論如何,所有客戶端都建立了連接,但是在解析以下消息時,它們會收到一個額外的字節,從而創建導致錯誤的傾斜幀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM