我正在学习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位已设置,长度为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
答案 0 :(得分:4)
您的代码中的第99行有错误。 13不是操作码的错误来自于您生成如下所示的http响应:
HTTP/1.1 101 Switching Protocols\r\n
(...)\r\n
Sec-WebSocket-Accept: (...)==\n\r\n\r\n
请注意base64.encodestring
添加的额外错误\ n \ n。显然,chrome将\n\r\n
解释为两个正确的换行符,下一个标记为\r
,即13:不正确的操作码。将base64.encodestring
替换为base64.b64encode
时,\ n \ n未添加,您的代码按预期工作。