web-dev-qa-db-fra.com

Java Limite de messages WebSocket

J'essaye de créer une communication entre simple Java App (en utilisant Java.net.http.WebSocket class) et à distance google-chrome exécuter avec google-chrome --remote-debugging-port=9222 --user-data-dir=.

L'envoi et la réception de petits messages fonctionnent comme prévu, mais il y a un problème en cas de messages plus volumineux, 16 Ko.

Voici une partie de Java source:


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);

Voici la pile:

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)
...

J'ai essayé fondamentalement la même chose en utilisant puppeteer (bibliothèque nodejs) et cela fonctionne comme prévu.

Je ne trouve aucune ressource en ligne sur ce problème. Y a-t-il quelque chose qui me manque dans mon exemple?


Voici l'URL d'un exemple simple: https://github.com/zeljic/websocket-devtools-protocol

9
Đorđe Zeljić

Eh bien, j'ai eu un problème similaire lors de l'envoi d'une grosse chaîne en utilisant des web-sockets dans Java avec un serveur Tomcat. Il peut y avoir une limite de charge utile à envoyer ou à recevoir dans le serveur websocket.


checkout org.Apache.Tomcat.websocket.textBufferSize in documentation de Tomcat . Par défaut, il s'agit de 8192 octets essayez d'augmenter la taille.

0
Varun Kumar