簡體   English   中英

基於Python3的WebSocket服務器,客戶端在發送時關閉連接

[英]Python3 based WebSocket server, client closes connection on send

我目前正在學習python並選擇WebSocket服務器作為學習項目,在閱讀WebSocket rfc之后,這可能不是一個明智的決定。

握手和接收單幀程序包都可以,但是不能將數據發送回客戶端。 我正在使用Firefox和Chromium作為測試客戶端。

從服務器接收數據時,兩個瀏覽器都將取消連接,這是Chromiums錯誤消息:

WebSocket connection to 'ws://localhost:1337/' failed: Unrecognized frame opcode: 13

createFrame函數應將消息文本框起來,發送給客戶端。

def createFrame (text):
    length = len(text)

    if length <= 125:
        ret = bytearray([129, length])

        for byte in text.encode("utf-8"):
            ret.append(byte)

        print(ret)

        return ret
#TODO 16 & 64Bit payload length

這是createFrame調試輸出,如果我理解rfc,fin和utf8位置1,則看起來很好,長度為5:

bytearray(b'\x81\x05Hello')

這是原始的發送和接收循環:

while 1:
data = conn.recv(1024) #TODO Multiple frames
if len(data) > 0:
    print(readFrame(data))
    conn.send(createFrame("Hello"))

整個代碼可以在以下要點中找到: https : //gist.github.com/Cacodaimon/33ff6c3c4b312b074c3e

您的代碼中的第99行出現錯誤。 錯誤13不是操作碼的原因是您生成了一個如下所示的http響應:

HTTP/1.1 101 Switching Protocols\r\n
(...)\r\n
Sec-WebSocket-Accept: (...)==\n\r\n\r\n

請注意,額外的錯誤\\ n由base64.encodestring添加。 顯然,chrome將\\n\\r\\n解釋為兩個正確的換行符,下一個標記是\\r ,即13:錯誤的操作碼。 當您將base64.encodestring替換為base64.b64encode ,不會添加\\ n並且您的代碼將按預期工作。

暫無
暫無

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

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