java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常
遇到这个问题不要慌,去查查众说纷纭。那我就在这里总结一下吧
存在此问题的有以下几种情况
1、ws连接不稳定经常断线;
答:
1)可能是客户和服务器之间的网络问题
2)可能是服务端内存不够用导致线程被异常清理
2、ws连接成功后过一点时间后就自动断开
答:
1)一般情况下是nginx转发或者 tomcat的连接超时导致容器层主动关闭这个连接
(1)修改容器层tomcat或者nginx【proxy_read_timeout 5000s; keepalive_timeout 5000s;】配置即可,但是治标不治本不推荐
(2)服务端主动向客户端发送心跳消息的发送,不推荐,因为会导致服务端负荷
(3)客户端主动向服务端发送心跳消息,我个人情况下比较推荐这种方案
3、ws连接之后服务端由于鉴权失败等各种原因服务器主动关闭连接导致抛出该异常
答:解决代码在下面【重点在于CloseReason.CloseCodes.TLS_HANDSHAKE_FAILURE错误码,当你使用这个错误码会导致io错误,意思是握手失败】
/** * 操作进行下线 * @param session */ public void optClose(Session session){ // 判断当前连接是否还在线 if (session.isOpen()){ try { // 关闭连接 CloseReason closeReason = new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE,"鉴权失败!"); session.close(closeReason); } catch (IOException e) { e.printStackTrace(); } } }
注意:当发生异常错误时,应该及时关闭连接并且处理相关用户的上下线操作!