在apache tomcat中向Web Socket写入字节时写入字节

plupiseo  于 2024-01-08  发布在  Apache
关注(0)|答案(2)|浏览(295)

我有Java Web Socket Web应用程序。WebSocket端点与移动的客户端交互。在一个用例中,Web应用程序需要将10 MB或更大的字节写入Web-socket outputstream。以下是写入输出流的代码:

  1. if (webSocSession.isOpen()) {
  2. webSocSession.getBasicRemote().sendBinary(byteBuffer);
  3. byteBuffer.clear();
  4. }

字符串
我在写web-socket时有时会得到以下异常:

  1. IOException writing to web-socket
  2. java.io.IOException: java.net.SocketTimeoutException: Write timeout
  3. at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:324)
  4. at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:259)
  5. at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendBytes(WsRemoteEndpointImplBase.java:131)
  6. at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:43)
  7. at test.web.websocket.LIMSEndpoint$SocketWorker.writeToWebSocket(LIMSEndpoint.java:1188)
  8. at test.web.websocket.LIMSEndpoint$SocketWorker.run(LIMSEndpoint.java:1127)
  9. Caused by: java.net.SocketTimeoutException: Write timeout
  10. at org.apache.tomcat.util.net.SocketWrapperBase.vectoredOperation(SocketWrapperBase.java:1458)
  11. at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1376)
  12. at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:1347)
  13. at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doWrite(WsRemoteEndpointImplServer.java:93)
  14. at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:509)
  15. at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:311)


我尝试将下面的SEND timeout属性设置为0(无限写入超时),但它没有帮助。

  1. org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT


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

  1. Session.setMaxIdleTimeout(0)


这方面的任何帮助都将是巨大的帮助。

7lrncoxx

7lrncoxx1#

我怀疑客户端的接收缓冲区已满,它切断了连接。我知道这将发生相反的情况,当客户端向Apache服务器发送大量数据时,服务器没有配置扩展的二进制缓冲区。请参阅:org.apache.tomcat.WebSocket.binaryBufferSize
也许你可以通过发送更小的数据块来解决这个问题,发送一个部分版本。
https://tomcat.apache.org/tomcat-10.0-doc/websocketapi/index.html?jakarta/websocket/Session.html

wbgh16ku

wbgh16ku2#

看到这个类似的SO问题:How can you set org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT?-设置/覆盖org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT必须以一种非常具体的方式完成,以便被选中。
此外,当您发送大型消息时,可能还需要覆盖WebSocketTransportRegistration上的以下属性:

  1. registration.setSendBufferSizeLimit(10 * 1024 * 1024);
  2. registration.setSendTimeLimit(120_000);

字符串

相关问题