在apache tomcat中将字节写入Web套接字时写入超时
Posted
技术标签:
【中文标题】在apache tomcat中将字节写入Web套接字时写入超时【英文标题】:Write Timeout while writing bytes to web socket in apache tomcat 【发布时间】:2021-03-02 09:17:10 【问题描述】:我有 Java web socket web 应用程序。 websocket 端点与移动客户端交互。在其中一种用例中,Web 应用程序需要将大小为 10MB 或更大的字节写入 Web-socket 输出流。以下是写入输出流的代码:
if (webSocSession.isOpen())
webSocSession.getBasicRemote().sendBinary(byteBuffer);
byteBuffer.clear();
在写入网络套接字时,我有时会遇到以下异常:
IOException writing to web-socket
java.io.IOException: java.net.SocketTimeoutException: Write timeout
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:324)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:259)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendBytes(WsRemoteEndpointImplBase.java:131)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:43)
at test.web.websocket.LIMSEndpoint$SocketWorker.writeToWebSocket(LIMSEndpoint.java:1188)
at test.web.websocket.LIMSEndpoint$SocketWorker.run(LIMSEndpoint.java:1127)
Caused by: java.net.SocketTimeoutException: Write timeout
at org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1458)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1376)
at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1347)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:93)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:509)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:311)
我尝试将以下 SEND 超时属性设置为 0(无限写入超时),但没有帮助。以下 Apache Tomcat 文档有所帮助 - https://tomcat.apache.org/tomcat-8.5-doc/web-socket-howto.html
org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT
网络套接字会话最大空闲超时已设置为 0(不超时)
Session.setMaxIdleTimeout(0)
在这方面的任何帮助都会有很大的帮助。
【问题讨论】:
【参考方案1】:我怀疑客户端接收缓冲区已填满并切断连接。我知道这会反过来发生,当客户端将大数据发送到 apache 服务器并且服务器未配置为具有扩展的二进制缓冲区时。参见:org.apache.tomcat.websocket.binaryBufferSize
也许你可以通过以更小的块发送数据来解决这个问题,sendBytes 有一个部分版本。
https://tomcat.apache.org/tomcat-10.0-doc/websocketapi/index.html?jakarta/websocket/Session.html
【讨论】:
谢谢吨。将测试您的建议并更新以上是关于在apache tomcat中将字节写入Web套接字时写入超时的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse中将web项目自动发布到Tomcat webapps下