WebSocket EOFException
分类:Java 浏览:55 时间:2020-08-01 10:03

at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1206) at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1140) at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(W

项目升级上线前本地和测试环境都是正常运行的,线上的日志文件中却多了很多的错误日志。

java.io.EOFException: null

at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1206)

at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1140)

at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)

at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)

at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)

at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)

at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)

百度+谷歌,基本上就是说心跳的原因,说如果开启了nginx反向代理,超时时间设置的过短是nginx关掉了websocket,需要增强ping/pong(心跳维持)机制。


经过排查并非是这个原因导致的,客户端和服务器都会定时向对方发送心跳报文。


前端js中是使用setInterval来定时发送心跳包的,在切换tab页的时候并未发现定时任务会停止(原来是会的,这里不知道什么鬼,或许是频率较低或者是局域网ip)。


最终我断开网络连接,惊喜的发现了idea控制台中那渴望的错误信息,解决方案如下:


public void onError(Session session, Throwable throwable) {
    if ((throwable instanceof EOFException) && throwable.getCause() == null) {
        logger.warn("客户端异常退出:{}", session.getId());
    } else {
        logger.error("socket发生异常:{}", session.getId());
        logger.error("异常信息", throwable);
    }
    
    try {
        session.close();
    } catch (IOException e) {
        logger.error("关闭socket发生异常", e);
    }
}


眼不见为净。


奇巧淫技 蛋疼集锦