簡體   English   中英

Python中的WebSocket幀解碼

[英]WebSocket frame decoding in Python

我試圖在服務器端實現WebSocket框架取消屏蔽算法(基於此: 如何在服務器端發送和接收WebSocket消息? )。 這是我得到的:

def decode(data):
    frame = bytearray(data)

    length = frame[1] & 127

    indexFirstMask = 2
    if length == 126:
        indexFirstMask = 4
    elif length == 127:
        indexFirstMask = 10

    indexFirstDataByte = indexFirstMask + 4
    mask = frame[indexFirstMask:indexFirstDataByte]

    i = indexFirstDataByte
    j = 0
    decoded = []
    while i < len(frame):
        decoded.append(frame[i] ^ mask[j%4])
        i += 1
        j += 1

    print decoded

    return "".join(chr(byte) for byte in decoded)

但是我得到了非常奇怪的結果。 在JavaScript方面:

w = new WebSocket("ws://localhost:2000");
w.send("test");
w.send("test");
w.send("test");
w.send("test");

在服務器端生成:

[42, 73, 45, 46, 1, 0]
[42, 1, 98, 0, 0]
[2, 97, 0, 0]
[2, 97, 0, 0]

更多調用w.send("test"); 產生[2, 97, 0, 0] 前兩個數組的長度> 4(單詞test的字符數)。 並且這些都沒有轉換為單詞test 它看起來我在解碼代碼中一定做錯了。 是什么原因造成的? 有幫助嗎?

編輯看看原始幀:

[193, 134, 48, 166, 232, 11, 26, 239, 197, 37, 49, 166]
[193, 133, 57, 161, 169, 218, 19, 160, 203, 218, 57]
[193, 132, 150, 97, 124, 54, 148, 0, 124, 54]
[193, 132, 163, 26, 102, 249, 161, 123, 102, 249]
[193, 132, 238, 212, 210, 156, 236, 181, 210, 156]

當然這些數字有點隨機(由於屏蔽),但請注意第二個字節(應該代表有效載荷的長度)是134 ,然后是133 ,然后總是132 前兩幀也比其他幀長。 這里發生了什么?

我剛剛再看一遍這個幀,我意識到第一個字節:

193[DEC] == 11000001[BIN]

根據規范表示使用RSV1 (第二位為1 )。 這似乎意味着使用了擴展名,而且在我的握手代碼中我發現了以下行:

ext = req.headers.get("Sec-WebSocket-Extensions", "").strip()
if ext:
    res += "Sec-WebSocket-Extensions: %s\r\n" % ext

在Chrome中我可以看到:

Sec-WebSocket-Extensions:x-webkit-deflate-frame

當我做握手時

我不確定這些擴展如何工作,但從握手代碼中刪除這3行可以解決問題。

暫無
暫無

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

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