2014-02-17 98 views
0

我學習蟒蛇的時刻和選擇的WebSocket服務器作爲一個學習項目方面,這可能是不是一個明智的決定閱讀的WebSocket RFC後...Python3基於WebSocket的服務器,客戶端關閉發送上

握手和接收單框架軟件包正在工作,但將數據發送回客戶端不是。 我使用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,翅片和UTF8位被設置時,長度爲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

+1

\ x81 \ x05您好似是根據工作實施發送的正確信息 –

回答

4

您的代碼中有第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,並且您的代碼按預期工作。

相關問題