![](/img/trans.png)
[英]Sending / receiving WebSocket message over Python socket / WebSocket Client
[英]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.