微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在apache tomcat中将字节写入Web套接字时写入超时

如何解决在apache tomcat中将字节写入Web套接字时写入超时

我有 Java 网络套接字网络应用程序。 websocket 端点与移动客户端交互。在其中一种用例中,Web 应用程序需要将 10MB 或更多大小的字节写入 Web-socket 输出流。以下是写入输出流的代码

     if (webSocSession.isopen()) {
          webSocSession.getBasicRemote().sendBinary(byteBuffer);
          byteBuffer.clear();
        } 

我有时在写入 web-socket 时遇到以下异常:

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

Web 套接字会话最大空闲超时已设置为 0(不超时)

Session.setMaxIdleTimeout(0) 

这方面的任何帮助都会有很大帮助。

解决方法

我怀疑客户端接收缓冲区已满并切断连接。我知道这会反过来发生,当客户端将大数据发送到 apache 服务器并且服务器没有配置为具有扩展的二进制缓冲区时。参见:org.apache.tomcat.websocket.binaryBufferSize

也许你可以通过以较小的块发送数据来解决这个问题,sendBytes 有一个部分版本。

https://tomcat.apache.org/tomcat-10.0-doc/websocketapi/index.html?jakarta/websocket/Session.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。