web-dev-qa-db-ja.com

Java WebSocketメッセージの制限

単純なJavaアプリ(Java.net.http.WebSocketクラスを使用)とリモートgoogle-chromeを使用してgoogle-chrome --remote-debugging-port=9222 --user-data-dir=.を実行する間の通信を作成しようとしています

小さなメッセージの送受信は期待どおりに機能しますが、16KBの大きなメッセージの場合には問題があります。

これはJavaソースの一部です:


var uri = new URI("ws://127.0.0.1:9222/devtools/page/C0D7B4DBC53FB39F7A4BE51DA79E96BB");

/// create websocket client
WebSocket ws = HttpClient
    .newHttpClient()
    .newWebSocketBuilder()
    .connectTimeout(Duration.ofSeconds(30))
    .buildAsync(uri, simpleListener)
    .join();

// session Id attached to chrome tab
String sessionId = "...";

// send message
String message = "{\"id\":1,\"method\":\"Runtime.evaluate\",\"params\":{\"expression\":\"document.body.style.backgroundColor = 'blue';\",\"returnByValue\":true,\"awaitPromise\":true,\"userGesture\":true},\"sessionId\":\"" + sessionId + "\"}";

// this works
ws.send(message, true);

// generate big string contains over 18k chars for testing purpose
String bigMessage = "{\"id\":2,\"method\":\"Runtime.evaluate\",\"params\":{\"expression\":\"[" + ("1,".repeat(9000)) + "1]\",\"returnByValue\":true,\"awaitPromise\":true,\"userGesture\":true},\"sessionId\":\"" + sessionId + "\"}";

// this doesn't work
ws.send(bigMessage, true);

ここにスタックがあります:

Java.net.SocketException: Connection reset
    at Java.base/Sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.Java:345)
    at Java.base/Sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.Java:376)
    at Java.net.http/jdk.internal.net.http.SocketTube.readAvailable(SocketTube.Java:1153)
    at Java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.Java:821)
    at Java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.Java:175)
    at Java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.Java:198)
...

puppeteer(nodejsライブラリ)を使用して基本的に同じことを試しましたが、期待どおりに動作します。

この問題に関するオンラインのリソースは見つかりません。私の例で欠けているものはありますか?


簡単な例のURLは次のとおりです。 https://github.com/zeljic/websocket-devtools-protocol

9
Đorđe Zeljić

まあ、TomcatサーバーでJavaでweb-socketsを使用して大きな文字列を送信するときに同様の問題がありました。websocketサーバーで送信または受信するペイロード制限がある場合があります。


Tomcatのドキュメント のorg.Apache.Tomcat.websocket.textBufferSizeをチェックアウトします。デフォルトでは8192バイトです。サイズを増やしてみてください。

0
Varun Kumar