javascript - 向 websocket 客户端发送消息时压缩位必须为 0

标签 javascript python websocket

我正在用 python 编写一个 websocket 服务器,在将消息发送回客户端时遇到了问题。使用 chrome 的 javascript 控制台,我可以找到这条错误消息:

Compressed bit must be 0 if no negotiated deflate-frame extension

但除此之外,我找不到任何关于其实际含义的文档。你可以找到这个问题的开始(和代码)here .我有点不知所措。我试过玩弄第一个字节,将其更改为全 0,但根据 this ,第二位,在我的例子中是 0,如果 this 应该是“压缩位”文档正确;

"One reserved bit RSV1 in the WebSocket frame header is allocated to control application of compression for each message."

所以我不完全确定从这里到哪里去。在 Firefox 中,错误只是“加载页面时与 ws://localhost:8080/的连接被中断”。错误。

编辑:这是接收消息时的解析代码:

def parse( self, data, client_socket ):
    display_server_message( "Received message:\n%s" % str( data ) )
    byte_array = bytearray( data )
    mask = []

    message_string = ""
    for i in range( 0, len( byte_array ) ):
        b = byte_array[ i ]
        if i > 0 and i < 2:
            b = b & 0b01111111
        if i > 1 and i < 6:
            mask.append( byte_array[ i ] )
        if i > 5:
            b = b ^ mask[ (i - 2) % 4 ]
            message_string = message_string + chr( b )

    display_server_message( "Decoded Message:\n%s" % message_string )
    if ( message_string == "a test message" ):
        time.sleep( 5 )
        self.send_message( "Hello, how are you?", client_socket )


    pat = re.compile( "Sec-WebSocket-Key: (\S+)", re.MULTILINE )

    for match in pat.findall( data ):
        magic_string = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

        message = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n" % base64.standard_b64encode( hashlib.sha1( match + magic_string ).digest() )

        client_socket.send( message )
        display_server_message( "Message Sent:\n%s" % message )

最佳答案

这与您的其他问题的答案相同:WebSocket onmessage not firing

你的问题是你在 python 2.X 中使用 bytes 函数,但期望它像在 python 3.X 中那样工作

python 2.6.6:

>>> bytes([129, 19])
'[129, 19]'

python 3:

>>> bytes([129, 19])
b'\x81\x13'

通过在您的服务器代码中用以下内容替换发送,它在 python2.X 中对我有用:

client_socket.send( "".join( [chr(c) for c in formatted_bytes] )

一些其他注意事项:

  • 您链接到的代码将错误的消息长度加 1。

  • 您真的应该将握手代码与正常的消息解析代码分开。如果有人碰巧发送了一条包含“Sec-WebSocket-Key:”的消息,您最终会通过再次发回原始握手来破坏流。

关于javascript - 向 websocket 客户端发送消息时压缩位必须为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12308728/

相关文章:

javascript - 如何在javascript中获取ckeditor iframe对象

javascript - 使用 .jsx 扩展名测试 React 组件

javascript - 如果两个 promise 同时解决,这是否可能是竞争条件?

javascript - 使用 JavaScript 传输大文件客户端

python - pandas - 根据列值添加缺失的行以具有 linspace

Python Pika 和 RabbitMQ 连接发布

python - 将屏蔽数组作为简单数组返回,屏蔽值为 None

javascript - 使用 Ruby 和 EM::WebSocket::Server 的 WebSocket 握手

Golang Gorilla Websocket 在 120 秒时停止接收信息

javascript - 获得 Websocket 连接的完整响应