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

Javascript 向websocket客户端发送消息时,压缩位必须为0,javascript,python,websocket,Javascript,Python,Websocket,我正在用python编写websocket服务器,在将消息发送回客户端时遇到了问题。使用chrome的javascript控制台,我可以找到以下错误消息: 如果没有协商的deflate帧扩展,则压缩位必须为0 但除此之外,我找不到任何关于这实际上意味着什么的文档。您可以找到这个问题的开始(和代码)。我有点不知所措。我尝试过使用第一个字节,将其更改为所有0,但是根据,第二位,在我的例子中是0,如果文档正确,应该是“压缩位” “WebSocket帧中的一个保留位RSV1 标头被分配用于控制每个应用程

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

如果没有协商的deflate帧扩展,则压缩位必须为0

但除此之外,我找不到任何关于这实际上意味着什么的文档。您可以找到这个问题的开始(和代码)。我有点不知所措。我尝试过使用第一个字节,将其更改为所有0,但是根据,第二位,在我的例子中是0,如果文档正确,应该是“压缩位”

“WebSocket帧中的一个保留位RSV1 标头被分配用于控制每个应用程序的压缩 信息。”

所以我不完全确定接下来该怎么办。在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 )
def解析(self、data、client_socket):
显示服务器消息(“收到的消息:\n%s”%str(数据))
字节数组=字节数组(数据)
掩码=[]
message_string=“”
对于范围(0,len(字节数组))中的i:
b=字节数组[i]
如果i>0且i<2:
b=b&0b01111111
如果i>1且i<6:
mask.append(字节数组[i])
如果i>5:
b=b^mask[(i-2)%4]
消息字符串=消息字符串+chr(b)
显示服务器消息(“解码消息:\n%s”%message\u字符串)
如果(消息_字符串==“测试消息”):
时间。睡眠(5)
self.send_message(“你好吗?”,客户端_套接字)
pat=re.compile(“Sec WebSocket键:(\S+),re.MULTILINE)
对于pat.findall中的匹配(数据):
magic_string=“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”
message=“HTTP/1.1 101交换协议\r\n升级:websocket\r\n连接:升级\r\nSec websocket接受:%s\r\n\r\n”%base64.standard\u b64encode(hashlib.sha1(match+magic\u string.digest())
客户端\u套接字发送(消息)
显示服务器消息(“已发送消息:\n%s”%message)

这与您的另一个问题的答案相同:

您的问题是,在Python2.X中使用的是
bytes
函数,但希望它能像在Python3.X中那样工作

蟒蛇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,这是不正确的

  • 您应该将握手代码与正常的消息解析代码分开。如果有人碰巧发送了一条包含“SecWebSocket密钥”的消息:“您将通过再次发送原始握手来破坏流


您可以将完整的代码发布到您的服务器上,或者获取wireshark/tcpdump对该线路的捕获。任何一个都应该非常清楚地指出问题。@kanaka添加了解析/头代码完整的可运行代码(到github gist的一个pastebin中)是我想要的(这样我就可以运行它并快速告诉您出了什么问题)。或者是一个wireshark捕获,它可以让我准确地看到消息的错误。@kanaka抱歉,我现在明白你的意思了,是服务器代码,是wireshark事务。实际上我自己刚刚找到了格式部分,令人沮丧。。。无论如何,正如您所说,实际问题是添加1,因为浏览器仍在等待另一个字节。非常令人沮丧!非常感谢!我会把两个答案都标为正确。