簡體   English   中英

Java WebSocket 消息限制

[英]Java WebSocket message limit

I'm trying to create communication between simple Java App (using java.net.http.WebSocket class) and remote google-chrome run using 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 庫)嘗試了基本相同的方法,它按預期工作。

我在網上找不到有關此問題的任何資源。 我的例子中有什么我遺漏的嗎?


這是 url 的簡單示例: https://github.com/zeljic/websocket-devtools-protocol

根據我目前所見,我最好的猜測是 Chrome 開發工具不會在暴露webSocketDebuggerUrl端點上處理碎片化的文本消息。 是否可以將 Chrome 開發工具配置為這樣做是另一個問題。 但是,我必須指出,RFC 6455(WebSocket 協議)要求它:

客戶端和服務器必須支持接收分片和非分片消息。

我可以在這里看到一種解決方法。 請記住,這是不受支持的,並且將來可能會意外更改。 運行客戶端時,在命令行上指定以下系統屬性-Djdk.httpclient.websocket.intermediateBufferSize=1048576 (或選擇任何其他合適的大小)。 As long as you keep sending your messages with true passed as boolean last argument to the send* methods, java.net.http.WebSocket will send messages unfragment, in a single WebSocket frame.

好吧,我在使用 java 和 tomcat 服務器發送大字符串時遇到了類似的問題。 在 websocket 服務器中發送或接收的負載可能存在限制。


結帳 org.apache.tomcat.websocket.textBufferSize 在tomcat 的文檔中。 默認情況下它是8192字節嘗試增加大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM