4

javax.websocket APIを使用しorg.glassfish.tyrusて、実装としてJavaでWebsocketクライアントを作成しています。

通常はすべて正常に動作しますが、非常に大きな文字列を受信すると、原因として謎の 'Illegal UTF-8 Sequence' が原因で接続が終了することがあります。

log.info("Ws closed cuz: " 
   + reason.getCloseCode() + " , " 
   + reason.getReasonPhrase() + " , " 
   + reason.toString());

出力:

INFO: Ws closed cuz: NOT_CONSISTENT , Illegal UTF-8 Sequence ,
CloseReason[1007,Illegal UTF-8 Sequence]

文字列が大きすぎるか、文字列に UTF-8 と互換性のない文字が含まれていると思います。

この問題の原因となっている実際の文字列/パケット/フレームに関する情報を取得する方法はありますか? または、エンコーディングの問題を無視し、生の文字列を渡して処理させるように tyrus に指示する方法がある場合は?

そうでない場合、ソケットを介して文字列を送信するという基本的な作業を行い、検証を行わず、応答を処理させる別の Java Websockets クライアントはありますか?

フィードバックをお待ちしております。

4

2 に答える 2

1

以下はあくまでも推測です。

(1) サーバー側では、大きな文字列が 1 つのテキスト フレームと、それに続く 1 つ以上の継続フレームに分割されます。技術的には、元の大きな文字列がバイト配列に変換され、そのバイト配列が複数のサブバイト配列に分割されます。サブ配列はフレームに 1 つずつ設定されます (= 各フレームには 1 つのサブバイト配列が含まれます)。

(2) 各サブバイト配列が有効な UTF-8 シーケンスであるという保証はありませんが、有効性チェックはサーバー側またはクライアント側で実行されます。もしそうなら、それは Tyrus のバグです。

WebSocketListenernv-websocket-client のにはonFrame、 、onTextFrameonContinuationFrameおよびその他 (onTextMessageとは異なることに注意してください)などのフレーム粒度のコールバック メソッドonTextFrameがあるため、そこで各フレームのバイト配列を調べることができます。

WebSocket websocket = new WebSocketFactory()
    .createSocket("ws://...")
    .addListener(new WebSocketAdapter() {
        @Override
        public void onFrame(WebSocket ws, WebSocketFrame frame) {
            // If the frame is a text frame with FIN bit cleared, or
            // if the frame is a continuation frame.
            if ((frame.isTextFrame() && frame.getFin() == false) ||
                frame.isContinuationFrame()) {
                // The payload of the frame. There is no guarantee
                // that this byte array is a valid UTF-8 sequence.
                byte[] payload = frame.getPayload();

                // Check whether the payload is a valid UTF-8 sequence
                // if you want to.
                checkPayload(payload);
            }
        }
    })
    .connect();

nv-websocket-clientを使用して、WebSocket 接続で何が起こっているかを調べてみませんか?

于 2015-08-26T04:45:00.870 に答える
0

同じエラーが発生しました。バージョン 1.1 から 2.0.0に変更した後org.glassfish.tyrus、問題なく動作しました。

于 2020-12-20T11:57:15.803 に答える