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();
}
}
}
注意:当发生异常错误时,应该及时关闭连接并且处理相关用户的上下线操作!
java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常 相关文章
面试官:Java 反射是什么我回答不上来!
一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量
Think in Java 第四 五 章
Think in Java 第四章 控制执行流程 测试while public class whileTest { static boolean condition(){ boolean result = Math.random() 0.99; System.out.println(result + ","); return result; } public static void main(String[] args) { while (condit
Java常用类-String及其它
Java常用类-String及其它 String java.lang.String类的使用 1. 概述 String:字符串,使用一对""引起来表示1. String声明为final,不可继承的2. String实现了Serializable接口:表示字符串支持序列化 实现了Comparable接口:表示String可以比较大小3. String
Java中的构造方法
Java中的构造方法 Java中,我们在声明一个对象并初始化的时候,实际上可以认为是在构造一个对象。比如说: 1 Student s = new Student(); 后面那个new巴拉巴拉就相当于在构造一个对象。换句话说,new出来一个对象之后,就相当于调用了构造方法。 而在类里面
java 线程池参数的意义
java常用的创建线程的方式应属ThreadPoolExecutor最为方便了,那这种方式创建线程会有多个参数,很多人对这些参数可能没有理清楚,今天我们来简单分析一下参数的作用: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTim
java + testNG测试框架搭建--HTTP层接口应用(五)
package com.iflytek.TestCase.domesticAPP.domesticAPPV121;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.iflytek.zx.test.smart.annotation.AEnv;import com.iflytek.zx.test.smart.service.web.AbstractHttpTest
java_多线程 (三)
1.什么是死锁 2.什么是Lock锁 /** * 第三种解决线程安全的方式 : Lock 锁 -- JDK5.0新增 * synchronized * 问题 : synchronized 与 lock 的异同 * 1.相同 : 两者都可以解决线程的安全问题 * 2.不同 : synchronized 在执行完相应的代码后 , 会自动释放锁 * lo
【Bean转XML】JAXB读取xml文档转换为java对象报错:IllegalAnnotationExceptions 类的两个属性具有相同名称 corpId
1、POM 依赖 dependency groupIdjavax.xml.bind/groupId artifactIdjaxb-api/artifactId version2.3.1/version /dependency dependency groupIdcom.sun.xml.bind/groupId artifactIdjaxb-impl/artifactId version2.3.0/version /dependency dependency group
根据map的value进行排序
JAVA对Map按Value值排序 在java实际编程中经常需要使用到HashMap,TreeMap以及LinkedHashMap来保存键值对,而java中对Map按Value排序并没有已经写好的方法,需要自己实现。 作者使用了自定义类以及Collections包的sort()方法实现Map的按值排序,具体代码如下
redis整合springboot项目
1、redis依赖 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency 2、redis序列化配置类 import org.springframework.context.annotation.Bean;import org.springframework.context.anno