2

独自のWebSocketサーバーを実装しようとしていますが、JavaScriptのonmessage関数で少し問題が発生しています。発砲しません!アラートを入れて、呼び出されたときにアラートが表示されないようにします。私はFirefoxとChromeの両方を試してみましたが無駄になりました。

私の知る限り、サーバーは正しいメッセージも送信しています。16進数に変換すると、次のドキュメントのセクション5.7の例と完全に一致します。

http://datatracker.ietf.org/doc/rfc6455/?include_text=1

だから私は自分が何を間違っているのか完全にはわかりません。ハンドシェイクは正常に機能し、クローズも正常に機能します。現在メッセージを送信するための私のコードは次のとおりです。

formatted_bytes = []
formatted_bytes.append( 129 )

message_bytes = bytearray( message )

data_start = 0

if ( len( message_bytes ) <= 125 ):
    formatted_bytes.append( len( message_bytes ) )
    start = 2

for byte in message_bytes:
    formatted_bytes.append( byte )

client_socket.send( bytes( formatted_bytes ) )

サーバーはPythonで書かれているので、そのことを忘れてしまいました。

4

1 に答える 1

4

これは、他の質問と同じ答えです。WebSocketクライアントにメッセージを送信するときは、圧縮ビットを0にする必要があります。

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

python2.6.6:

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

Python 3:

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

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

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

他のいくつかの注意:

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

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

于 2012-09-07T15:44:39.300 に答える