8

私はJavaが初めてですWebSocketJSONより大きい長さの を渡そうとすると8192、websocket がすぐに切断されました。JSON長さは問題ありませ<= 8191ん。

MAX SIZE/ LIMITを介して渡すことができるデータはありますWebSocketか? はいの場合、そのサイズは?


これらの行を追加してエラーを修正しましたweb.xml

<context-param>
         <param-name>org.apache.tomcat.websocket.textBufferSize</param-name>
         <param-value>32768</param-value>
    </context-param>
    <context-param>
            <param-name>org.apache.tomcat.websocket.binaryBufferSize</param-name>
            <param-value>32768</param-value>
</context-param>

ありがとう@Davide Lorenzo MARINO。

4

2 に答える 2

12

IT は実際には非常に大きな価値であり、おそらく気にする必要はありません。

RFC-6455 ベース フレーミングによる単一フレームの最大サイズ制限は 18,446,744,073,709,551,615 バイト (64 ビット符号なし値の最大値) です。

要件を処理するために、できるだけ小さくするようにしてください。

問題はサーバー側(tomcat)で発生するためです。Tomcatのドキュメントを確認すると、次のことがわかります。

バイナリ メッセージのデフォルトのバッファ サイズは8192 バイトです。これは、サーブレット コンテキストの初期化パラメーター org.apache.tomcat.websocket.binaryBufferSize を目的の値 (バイト単位) に設定することで、Web アプリケーション用に変更できます。

したがって、tomcat の構成ファイルでorg.apache.tomcat.websocket.binaryBufferSizeパラメーターを更新することで変更できます。

詳細については、こちらの tomcat ガイドを参照してください。

于 2015-08-31T11:05:15.690 に答える
3

WebSocket が切断されることに関連する質問について、次のメッセージ「バイナリ メッセージ サイズが最大サイズを超えています」を受信して​​いた Android クライアントで同じ問題が発生しました。

すべての Jetty ドキュメントと残りの Web ページでいくつかの解決策を探した後、私が得た唯一の有効なオプションは、次のコード「maxBinaryMessageSize = size * 1024」を含めることです (ここで、サイズはクライアントの観点から必要な最大制限です)。次の行でわかるように、WebSocket クラス定義で:

    import org.eclipse.jetty.websocket.api.BatchMode;
    import org.eclipse.jetty.websocket.api.RemoteEndpoint;
    import org.eclipse.jetty.websocket.api.Session;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
    import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
    import org.eclipse.jetty.websocket.api.annotations.WebSocket;

    @WebSocket(maxBinaryMessageSize = 1024 * 1024)
    public class MyClientWebSocket
    {

      @OnWebSocketClose
      public void onClose(int statusCode, String reason)
      {
        closeLatch.countDown();
      }

      @OnWebSocketError
      public void onError(Throwable reason)
      {
        //TODO ACORDARSE DE QUITAR ESTO
        Log.w(TAG, "+++ ERROR : " + reason);
      }

      @OnWebSocketConnect
      public void onConnect(Session session)
      {
        // your code
      }

      @OnWebSocketMessage
      public void onMessageBinary(byte[] message, int offset, int length)
      {
       // message can be processed with a maximum of 1024 * 1024 bytes and not anymore limited to 64 * 1024

      }
    }

これがクライアント側 (Java/Android) からの正しい解決策であるかどうかを確認できる WebSocket の専門家がいる場合、これは素晴らしいことです。ありがとう。

于 2016-08-03T18:53:38.437 に答える