Java лимит сообщений WebSocket - PullRequest
5 голосов
/ 03 мая 2020

Я пытаюсь установить связь между простым Java приложением (используя java.net.http.WebSocket класс) и удаленным google-chrome, запущенным с использованием google-chrome --remote-debugging-port=9222 --user-data-dir=.

Отправка и получение небольших сообщений работает, как и ожидалось, но там это проблема в случае больших сообщений, 16 КБ.

Вот часть 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)
...

I ' Мы в основном пытались сделать то же самое, используя puppeteer (nodejs library), и она работает, как и ожидалось.

Я не могу найти в Интернете ни одного ресурса по этой проблеме. Что-то мне не хватает в моем примере?


Вот URL к простому примеру: https://github.com/zeljic/websocket-devtools-protocol

1 Ответ

0 голосов
/ 11 мая 2020

Исходя из того, что я видел до сих пор, лучше всего предположить, что Chrome Dev Tools не обрабатывают фрагментированные текстовые сообщения на этой открытой webSocketDebuggerUrl конечной точке. Может ли Chrome Dev Tools быть настроен на это или нет, это другой вопрос. Однако я должен отметить, что RF C 6455 (протокол WebSocket) требует it:

Клиенты и серверы ДОЛЖНЫ поддерживать получение как фрагментированных, так и нефрагментированных сообщений.

Здесь есть один обходной путь. Имейте в виду, что это не поддерживается и может неожиданно измениться в будущем. При запуске клиента укажите следующее системное свойство в командной строке -Djdk.httpclient.websocket.intermediateBufferSize=1048576 (или выберите любой другой подходящий размер). Пока вы продолжаете отправлять свои сообщения с true, переданным в качестве аргумента boolean last методам send*, java.net.http.WebSocket будет отправлять сообщения в не фрагментированном виде в одном фрейме WebSocket.

...