WebSocketClient 无法接收大小大于约 16k 字节的消息。抛出 ConnectionLostException
Posted
技术标签:
【中文标题】WebSocketClient 无法接收大小大于约 16k 字节的消息。抛出 ConnectionLostException【英文标题】:WebSocketClient not able to receive messages with size greater than around 16k bytes. Throwing ConnectionLostException 【发布时间】:2017-12-12 14:03:17 【问题描述】:我有一个 websocket - java 中的 stomp 客户端应用程序。它按预期工作,但是当我发送大约 16k 字节或更大的消息时。它正在抛出ConnectionLostException
。我检查了一个javascript客户端。在 javascript 中,客户端以大约 16k 字节的块发送和接收数据,即使大小增加到 100k 字节,它也能正常工作。我检查了 stomp 文档中的大小限制,默认为 ~65kb。这种情况的原因可能是什么,因为手动分块数据是一项复杂的任务并且需要时间。任何意见,将不胜感激。
堆栈跟踪是
org.springframework.messaging.simp.stomp.ConnectionLostException: Connection closed
11:48:31.001 [WebSocketClient-AsyncIO-1] ERROR com.demo.webSocket.lib.usage.ExampleClientLib - Connection Closed
at org.springframework.messaging.simp.stomp.DefaultStompSession.afterConnectionClosed(DefaultStompSession.java:487)
at org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.afterConnectionClosed(WebSocketStompClient.java:354)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onClose(StandardWebSocketHandlerAdapter.java:141)
at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:535)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:513)
at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:341)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:283)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:127)
at org.apache.tomcat.websocket.WsFrameClient.processSocketRead(WsFrameClient.java:78)
at org.apache.tomcat.websocket.WsFrameClient.access$300(WsFrameClient.java:31)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:133)
at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.completed(WsFrameClient.java:117)
at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
at sun.nio.ch.Invoker$2.run(Invoker.java:218)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
【问题讨论】:
【参考方案1】:首先,能否请您提供客户端中ConnectionLostException
异常的堆栈跟踪?
其次,我认为下载 Spring Framework source 并将其链接到您拥有的 Spring Framework 二进制文件可能会有所帮助,这样您就可以通过将 IDE 设置为停止来调试并准确查看代码在何处以及为什么会死机org.springframework.messaging.simp.stomp.ConnectionLostException
或在 StompSession.send()
方法上设置断点并逐步执行。
错误可能出现在 Tomcat 或 Stomp 中,其中一个或另一个可能无法处理异步或部分消息传递。
还请查看这些其他问题,因为它们似乎与您的问题有关:
Websocket java client Spring + Stomp: Transport error: ConnectionLostException
Spring Boot Stomp WebSocket
特别是第一个链接的答案:
...内部 spring java websocket stomp 客户端不能进行部分消息传递,也不能配置消息缓冲区的大小。
要尝试的另一件事可能是使用 Glassfish 而不是 Tomcat 运行它。
【讨论】:
最大堆大小为 2 GB,初始堆大小为 128 MB。通过 js 客户端发送时,默认将数据分组为 16k 字节的块,而对于 java 客户端,它是一次性发送数据,如果大小增加 16k 字节,则与 Web 套接字服务器的连接中断。所以我认为问题出在stompsession的send方法的实现上。 仅供参考,我正在使用 org.springframework.messaging.simp.stomp.StompSession 进行消息发送 @Amanjangra 您能否更新您的问题以包含异常的堆栈跟踪? 添加了堆栈跟踪,send方法也完全执行,没有任何异常,但是消息没有到达服务器,同时遇到了connectionLostException。 @Amanjangra 也更新了我的答案,我希望其中一个资源可以帮助您解决这个问题。以上是关于WebSocketClient 无法接收大小大于约 16k 字节的消息。抛出 ConnectionLostException的主要内容,如果未能解决你的问题,请参考以下文章
用socket发送接收数据,但每次接收的数据字节长度都大于发送的25个字节?