gpt4 book ai didi

Java WebSocket 消息限制

转载 作者:行者123 更新时间:2023-12-01 09:40:34 24 4
gpt4 key购买 nike

我正在尝试在简单的 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 库),它按预期工作。

我在网上找不到有关此问题的任何资源。
我的例子中有什么我遗漏的吗?

这是简单示例的网址:
https://github.com/zeljic/websocket-devtools-protocol

最佳答案

根据我目前所见,我最好的猜测是 Chrome 开发工具不会处理暴露的 webSocketDebuggerUrl 上的碎片化文本消息。端点。是否可以将 Chrome 开发工具配置为这样做是另一个问题。然而,我必须指出,RFC 6455(WebSocket 协议(protocol))mandates它:

Clients and servers MUST support receiving both fragmented and unfragmented messages.


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

关于Java WebSocket 消息限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61577378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com