繁体   English   中英

Tomcat 关闭 websocket 连接并出现错误

[英]Tomcat closes websocket conection with an error

对于客户,我们使用Tomcat 8.0.29构建了一个 HTML5 websocket 应用程序。 如果我们从我们的网络或我们的家庭网络启动应用程序,一切正常。 但是如果客户从他的网络启动应用程序,一段时间后 websocket 会因错误而停止。 这可能会在 5 或 20 分钟后发生。

我们已经在使用和不使用 SSL 以及两台不同的服务器上对其进行了测试。 仅在客户网络中,连接因错误而中断。

我们还使用 Tomcat 中包含的 websocket echo 示例进行了测试。 和我们的 websocket 一样。 一段时间后,websocket 因错误而停止。 但前提是我们从客户网络启动应用程序。

当 echo 示例因错误而停止时,以下消息将写入 server.log

08-Dec-2015 10:20:37.757 SEVERE [http-apr-8081-exec-2] org.apache.tomcat.websocket.pojo.PojoEndpointBase.onError No error handling configured for [websocket.echo.EchoAnnotation] and the following error occurred
 java.io.IOException: Unexpected error [730,054] reading data from the APR/native socket [1,639,490,672] with wrapper [org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper@231e01e4:1639490672].<br/>
    at org.apache.coyote.http11.upgrade.AprServletInputStream.doRead(AprServletInputStream.java:133)<br/>
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.read(AbstractServletInputStream.java:124)<br/>
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:51)<br/>
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:183)<br/>
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:198)<br/>
    at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:96)<br/>
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:669)<br/>
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)<br/>
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)<br/>
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)<br/>
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)<br/>
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)<br/>
    at java.lang.Thread.run(Unknown Source)

如果我们在http://www.websocket.org/echo.html上开始测试,连接不会错误而关闭

对我来说,这看起来像是 Tomcat 的问题。 但是我该怎么做才能让它正常运行?

Tomcat:8.0.29(也有早期版本)
Windows 7:64 位
协议:HTTP/1.1

我向专门因为 websockets 而来到这里的读者道歉,但是我们的应用程序在通过 Spring 的 REST API 提供文件时遇到了类似的错误。 在寻找答案时,我首先找到的地方之一就是这个问题。 以下是我能够找出的错误信息:

  1. Unexpected error [730,054]中的数字在某种程度上很重要,并且是某种错误代码。 在我们的例子中,错误看起来像这样: java.io.IOException: Unexpected error [120,001] writing data to the APR/native socket [140,041,540,128,928] with wrapper [org.apache.tomcat.util.net.AprEndpoint$AprSocketWrapper@4f1861c:140041540128928]. 我发现这应该意味着连接被客户端中断了。
  2. 我们能够通过重新实现控制器方法来解决这个问题,以始终返回具有ByteArrayResource主体和内容类型application/octet-stream的通用ResponseEntity<Resource>对象:

     responseEntity = ResponseEntity.ok() .headers(createHttpHeaders()) .contentLength(file.length()) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new FileSystemResource(file));
  3. 我们案例中的错误似乎是由我们使用的非标准标头引起的,例如Content-Type: application/force-download 它可能导致浏览器以非标准方式终止连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM