Java WebSocket消息限制



我正试图在简单的Java应用程序(使用java.net.http.WebSocket类(和使用google-chrome --remote-debugging-port=9222 --user-data-dir=.运行的远程google-chrome之间创建通信

发送和接收小消息可以按预期工作,但在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

根据我目前所看到的情况,我的最佳猜测是Chrome开发工具不会在公开的webSocketDebuggerUrl端点上处理碎片文本消息。Chrome开发工具是否可以配置为这样做,是另一个问题。然而,我必须注意,RFC 6455(WebSocket协议(要求它:

客户端和服务器必须支持接收分段和未分段的消息。

我可以在这里看到一个解决方法。请记住,这是不受支持的,将来可能会发生意外的变化。运行客户端时,请在命令行-Djdk.httpclient.websocket.intermediateBufferSize=1048576上指定以下系统属性(或选择任何其他合适的大小(。只要您继续将true作为boolean last参数传递给send*方法来发送消息,java.net.http.WebSocket就会在单个WebSocket帧中发送未分组的消息。

在使用tomcat服务器的java中的web套接字发送大字符串时,我也遇到了类似的问题。在websocket服务器中可以有发送或接收的负载限制。


在tomcat的文档中签出org.apache.tomcat.websocket.textBufferSize。默认情况下为8192字节,请尝试增加大小。

相关内容

  • 没有找到相关文章

最新更新