java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)
Posted 热爱coding的刺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)相关的知识,希望对你有一定的参考价值。
整合了好几篇文章,结合自己的经历整理一下。
从以下几个方面考虑。
一、先检查IDEA中application.yml配置文件。
注意1:host是本机地址,可以用 ip addr在linux中查看。
注意2:timeout不要设置为0。
注意3:如果有密码的话,密码一定要填上。如果忘记密码,可以去redis.conf中查看。
确定以上如果配置如果没有问题,进行下一步。
二、配置redis.conf配置文件。
1、将bind中的#去掉,并改为bind 0.0.0.0
2、先看一下,如果是“yes”,把“yes”改为“no”
三、查看一下防火墙状态。
注意:查看防火墙状态的命令:systemctl status firewalld,如果防火墙是开启状态,需要把防火墙关闭。
关闭防火墙的命令:systemctl stop firewalld.service
四、重启redis服务。(最关键的一步)
如果你上述所有的操作都做了,但是问题依旧没有解决,一定一定要认真执行这一步!
1、首先查看redis服务是否正在运行中。命令:ps -ef |grep redis
如图是redis正在运行的状态。
2、如果检测到redis正在运行,必须将其进程杀死。是必须!上图中,redis中的线程号是1409
杀死进程命令: kill -9 1409 (注意:你的系统中线程号是多少就写多少!)
3、最最最最关键的一步。重新加载redis.conf配置文件。
注意:不要在/目录下直接输入 redis-server!
注意:不要在/目录下直接输入 redis-server!
注意:不要在/目录下直接输入 redis-server!
你如果这样搞,刚才修改的配置文件并没有生效。
你需要找到redis.conf配置文件所在的位置。
例:redis-server /usr/local/redis-5.0.0/etc/redis.conf
写明redis.conf配置文件路径的原因就是为了让其重新加载,重新生效。
恭喜你又解决了一个bug。
完。
解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
前言
前几天写了一个下载接口,当时用的uuid作为作为压缩包名称,需求觉得不妥,然后让换成从数据库里面查出来的某一段标题作为压缩包名称
换成中文之后呢,简单调试了下,我擦!报错了!
赶紧去控制台查看日志
java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
发现并解决问题
此时我们的代码是这样的
private void downloadFile(Long signId,Long docType, HttpServletResponse response) throws Exception
Sign sign = signMapper.selectById(signId);
// 签署标题 也就是压缩包名称
String title = sign.getTitle()+".zip";
// 根据signId查询签署文档
List<SignDocumentVO> signDocumentVOS = signDocumentMapper.selectFilesBySignID(signId,docType);
//清空输出流
response.reset();
//定义输出类型
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename=" + title);
// 打包下载
ZipUtils.getZipFile(IOUtils.getByte(signDocumentVOS), response.getOutputStream(), response);
通过Debug,我最终把错误原因锁定到了中文编码上,这里我直接把中文传到了response里面
既然发现了问题,就很好解决了,我们对中文进行编码处理再传输
全部代码奉上
private void downloadFile(Long signId,Long docType, HttpServletResponse response) throws Exception
Sign sign = signMapper.selectById(signId);
// 签署标题 也就是压缩包名称
String title = sign.getTitle()+".zip";
// 编译成utf-8格式
title = URLEncoder.encode(title,"UTF-8");
// 根据signId查询签署文档
List<SignDocumentVO> signDocumentVOS = signDocumentMapper.selectFilesBySignID(signId,docType);
//清空输出流
response.reset();
//定义输出类型
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename="+title+";"+"filename*=utf-8''"+title);
// 打包下载
ZipUtils.getZipFile(IOUtils.getByte(signDocumentVOS), response.getOutputStream(), response);
其实主要是这几个地方,我标记出来
重启服务,验证结果
解决问题
可能导致的其他报错原因以及解决思路
1 tomcat连接超时
可以设置Tomcat的连接超时时间
具体操作为 :
1 进入tomcat中conf目录
2 打开server.xml文件
3 找到配置端口的地方,将 connectionTimeout 参数由原来默认的20000(20秒)改为60000(60秒)
如果你是SpringBoot项目就更简单了 直接在配置文件编写配置代码
# tomcat 超时连接时间
server:
tomcat:
connection-timeout: 60000
2 跨域问题
域问题导致。网上说要设置response的请求头属性,因为我是用ApiFox调试没有遇到跨域,不过也是一种可能
response.addHeader("Access-Contro1-A11ow-0rigin”, "*");
3 前端因素
使用ajax或者事件时,form表单提交按钮就没必要设置为submit类型,使用普通的button类型就行了,否则会出现以上错误信息
4 后端因素
个人猜测
1 后台处理时间太长了(逻辑太复杂或者死循环)
2 并发量很大
3 流没关
5 其他因素
网络问题也是不可忽视的一部分,如果你的网络波动很大或者说操作的时候断网,那么也极有可能出现这个问题
以上是关于java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)的主要内容,如果未能解决你的问题,请参考以下文章
Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。
解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
java.io.IOException: 您的主机中的软件中止了一个已建立的连接
ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。,进不了Debug,访问不到方法