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错误,意思是握手失败】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * 操作进行下线 * @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(); } } } |
注意:当发生异常错误时,应该及时关闭连接并且处理相关用户的上下线操作!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了