解决java.net.SocketTimeoutException:Readtimedout的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解决.SocketTimeoutException:Readtimedout的
问题
.SocketTimeoutException: Read timed out
产⽣问题的环境:ssm+mysql+gridFS+tomcat
问题代码段:
public void write(OutputStream os, InputStream is) {
try (BufferedOutputStream bos = new BufferedOutputStream(os); BufferedInputStream bis = new BufferedInputStream(is)) {
int count;
byte[] buffer = new byte[1024];
while ((count = bis.read(buffer)) > 0) {
bos.write(buffer, 0, count);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
其中输出流是使⽤的response.getOutPutStream();
问题原因:
由于mongodb与项⽬部署在不同服务器,读取⼤⽂件耗时较长,超过了tomcat限制的⼀条连接的⽣存时间,导致tomcat判定连接超时
解决⽅案:
在tomcat中修改server.xml,配置如下:
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" disableUploadTimeout="false"
redirectPort="8443" />
增加 disableUploadTimeout="false",取消读写连接超时设置
或者
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
keepAliveTimeout="100000"
redirectPort="8443" />
增加keepAliveTimeout="100000",增⼤连接⽣存时间
SocketException常见异常
第1个异常是.BindException:Address already in use: JVM_Bind
该异常发⽣在服务器端进⾏new ServerSocket(port)(port是⼀个0,65536的整型值)操作时。
异常的原因是以为与port⼀样的⼀个端⼝已经被启动,并进⾏监听。
此时⽤netstat –an命令,可以看到⼀个Listending状态的端⼝。
只需要找⼀个没有被占⽤的端⼝就能解决这个问题。
第2个异常是.ConnectException: Connection refused: connect
该异常发⽣在客户端进⾏new Socket(ip, port)操作时,该异常发⽣的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端⼝进⾏监听。
出现该问题,⾸先检查客户端的ip和port是否写错了,如果正确则从客户端ping⼀下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端⼝的程序是否启动,这个肯定能解决这个问题。
ConnectException: Connection refused: 该异常在客户端多线程访问时也会出现。
第3个异常是.SocketException: Socket is closed
该异常在客户端和服务器均可能发⽣。
异常的原因是⼰⽅主动关闭了连接后(调⽤了Socket的close⽅法)再对⽹络连接进⾏读写操作。
第4个异常是.SocketException: (Connection reset或者Connect reset by peer:Socket write error)
该异常在客户端和服务器端均有可能发⽣,引起该异常的原因有两个,第⼀个就是如果⼀端的Socket被关闭(或主动关闭或者因为异常退出⽽引起的关闭),另⼀端仍发送数据,发送的第⼀个数据包引发该异常(Connect reset by peer)。
另⼀个是⼀端退出,但退出时并未关闭该连接,另⼀端如果在从连接中读数据则抛出该异常(Connection reset)。
简单的说就是在连接断开后的读和写操作引起的。
第5个异常是.SocketException: Broken pipe
该异常在客户端和服务器均有可能发⽣。
在第4个异常的第⼀种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。
前两个异常的解决⽅法是⾸先确保程序退出前关闭所有的⽹络连接,其次是要检测对⽅的关闭连接操作,发现对⽅关闭连接后⾃⼰也要关闭该连接。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。