1

Python で websocket サーバーを作成していますが、メッセージをクライアントに送り返すときに問題が発生しました。Chrome の JavaScript コンソールを使用すると、次のエラー メッセージを見つけることができます。

ネゴシエートされた deflate-frame 拡張がない場合、圧縮ビットは 0 でなければなりません

しかし、それ以上に、それが実際に何を意味するのかについてのドキュメントは見つかりません。この問題の開始点 (およびコード) は、ここで見つけることができます。私はちょっと途方に暮れています。最初のバイトをいじって、すべて 0 に変更してみましたが、thisによると、私の場合は 0 である 2 番目のビットは、このドキュメントが正しい場合は「圧縮ビット」である必要があります。

「各メッセージの圧縮の適用を制御するために、WebSocket フレーム ヘッダー内の 1 つの予約ビット 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 )
4

1 に答える 1

1

これは、他の質問と同じ答えです: WebSocket onmessage not fire

問題はbytes、python 2.X で関数を使用しているが、python 3.X と同じように機能することを期待していることです。

python2.6.6:

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

パイソン3:

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

サーバーコードで送信を次のように置き換えると、python2.Xで機能します。

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

その他の注意事項:

  • リンク先のコードは、メッセージの長さに 1 を追加していますが、これは正しくありません。

  • ハンドシェイク コードは、通常のメッセージ解析コードとは別のものにする必要があります。誰かが「Sec-WebSocket-Key:」を含むメッセージをたまたま送信した場合、生のハンドシェイクを再度送信してストリームを破損させることになります。

于 2012-09-07T15:45:00.690 に答える