基于Python3的WebSocket服务器,客户端在发送时关闭连接

时间:2014-02-17 22:42:00

标签: python python-3.x websocket

我正在学习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

1 个答案:

答案 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未添加,您的代码按预期工作。