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