Spring websocket EOFException

And*_*ndy 5 tomcat8 spring-boot spring-websocket

我的项目是使用spring-boot web socket和嵌入式tomcat来实现聊天服务器。一切正常,但有时我收到 EOFException,然后客户端无法向聊天服务器发送消息,直到我重新启动 tomcat,然后一切正常。我不知道什么时候会发生 EOFException。请帮助我

[TRACE] 2017-10-23 06:17:10.707 [http-nio-7755-exec-4] NativeWebSocketSession - 发送 TextMessage payload=[{"result":...], byteCount=164, last=true], StandardWebSocketSession [id=42b, uri=/chat] [DEBUG] 2017-10-23 06:17:29.670 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 中的传输错误java.io.EOFException: 在 org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1242) ~[tomcat-embed-core-8.5.16.jar!/:8.5.16] 处为 null在 org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1182) ~[tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 org.apache.tomcat。 websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72) ~[tomcat-embed-websocket-8.5.16.jar!/:8.5.16] 在 org.apache.tomcat.websocket.server。WsFrameServer.doOnDataAvailable(WsFrameServer.java:171) ~[tomcat-embed-websocket-8.5.16.jar!/:8.5.16] at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151) ) ~[tomcat-embed-websocket-8.5.16.jar!/:8.5.16] 在 org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148) [tomcat-embed-websocket-8.5 .16.jar!/:8.5.16] 在 org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) [tomcat-embed-core-8.5.16.jar!/:8.5.16 ] 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:868) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 org.apache.tomcat.util。net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase. java:49) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java。 util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed -core-8.5.16.jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[code=1006, reason=null]doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat -embed-core-8.5.16.jar!/:8.5.16] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16 .jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755 -exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[code=1006, reason=null]doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat -embed-core-8.5.16.jar!/:8.5.16] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16 .jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755 -exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[code=1006, reason=null]16] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache.tomcat.util .threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java:748) [ ?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[code=1006] ,原因=空]16] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache.tomcat.util .threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java:748) [ ?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[code=1006] ,原因=空]concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache。 tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java: 748) [?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[代码=1006,原因=空]concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_131] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_131] 在 org.apache。 tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] 在 java.lang.Thread.run(Thread.java: 748) [?:1.8.0_131] [DEBUG] 2017-10-23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus[代码=1006,原因=空]61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] [DEBUG] 2017-10- 23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus [code=1006, reason=null]61) [tomcat-embed-core-8.5.16.jar!/:8.5.16] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131] [DEBUG] 2017-10- 23 06:17:29.671 [http-nio-7755-exec-8] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=42b, uri=/chat] 关闭 CloseStatus [code=1006, reason=null]

And*_*ndy 7

是的,我解决了。在没有调用关闭套接字方法的情况下客户端或服务器被中断或停止(可能会丢失互联网,或者使用套接字时关闭笔记本电脑或移动设备)后,将发生此异常。所以如果我们想解决这个问题,我们必须实现 ping/pong 机制,间隔后如果我们不能从客户端得到 pong 响应,我们将关闭这个套接字。另一种方式,我们可以捕获这个异常,然后我们将关闭旧的套接字。

谢谢,安迪

  • 您是否有可以分享的示例代码来解决此异常? (2认同)