[英]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.