我的项目是使用spring-boot web socket和嵌入式tomcat来实现聊天服务器。一切正常,但有时我得到了EOFException,然后客户端不能向聊天服务器发送html" target="_blank">消息,直到我重新启动tomcat,然后一切正常。我不知道EOFException什么时候会发生。Pls帮帮我
[TRACE]2017-10-23 06:17:10.707[http-nio-7755-exec-4]NativeWebSocketSession-发送文本消息payload=[{“result”:..],byteCount=164,last=true],standardWebSocketSession[id=42b,uri=/chat][DEBUG]2017-10-23 06:17:29.670[http-nio-7755-exec-8]loggingWebSocketSession[id=42b,uri=/chat]中的传输错误Wrapper.FillReadBuffer(NioEndpoint.java:1242)~[tomcat-embed-core-8.5.16.jar!/:8.5.16]在org.apache.tomcat.util.net.nioEndpoint$niosocketWrapper.read(NioEndpoint.java:1182)~[tomcat-embed-core-8.5.16.jar!/:8.5.16]在websocket.server.wsframeserver.doonDataAvailabilit(Wsframeserver.java:171)~[tomcat-embed-websocket-8.5.16.jar!/:8.5.16]at org.apache.tomcat.websocket.server.wsframeserver.notifyDataAvailability(Wsframeserver.java:171)[tomcat-embed-websocket-8.5.16.jar!/:8.5.16]ver.java:151)~[tomcat-embed-websocket-8.5.16.jar!/:8.5.16]在org.apache.tomcat.websocket.server.wshtpupgradehandler.upgradeDispatch(WshtpupgradeHandler.java:148)[tomcat-embed-websocket-8.5.16.jar!/:8.5.16]在org.apache.coyote.http11.upgrade.upgrade.upgrade.jar!/:8.5.16]在actProcessorlight.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!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]at org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java: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]SESTATUST[CODE=1006,REASUN=NULL]
是的,我解决了。此异常将发生在客户端或服务器在没有调用close socket方法的情况下中断或停止(可能是丢失了internet或在使用socket时关闭了笔记本电脑或移动设备)。为了解决这个问题,我们必须实现ping/pong机制,间隔后如果不能得到客户端的pong响应,我们就关闭这个socket。另一种方法,我们可以捕捉这个异常,然后我们将关闭旧的套接字。
谢谢,安迪