解决java.net.SocketTimeoutException: Read timed out的问题

java.net.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个异常是java.net.BindException:Address already in use: JVM_Bind

该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

第2个异常是java.net.ConnectException: Connection refused: connect

该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

ConnectException: Connection refused: 该异常在客户端多线程访问时也会出现。

第3个异常是java.net.SocketException: Socket is closed

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

第5个异常是java.net.SocketException: Broken pipe

该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java处理InterruptedException异常的理论与实践

    前言 对于 InterruptedException,一种常见的处理方式是 "生吞(swallow)" 它 -- 捕捉它,然后什么也不做(或者记录下它,不过这也好不到哪去)-- 就像后面的 清单 4 一样.不幸的是,这种方法忽略了这样一个事实:这期间可能发生中断,而中断可能导致应用程序丧失及时取消活动或关闭的能力. 阻塞方法 当一个方法抛出 InterruptedException 时,它不仅告诉您它可以抛出一个特定的检查异常,而且还告诉您其他一些事情.例如,它告诉您它是一个阻塞(bl

  • java.net.SocketException: Connection reset 解决方法

    自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误: "2011-12-03 18:00:32 DefaultHttpClient [INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error2011-12-03

  • java.net.ConnectException: Connection refused问题解决办法

    Socket异常 客户端异常 java.net.ConnectException: Connection refused: connect. 该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听.出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping

  • 解决java.net.SocketTimeoutException: Read timed out的问题

    java.net.SocketTimeoutException: Read timed out 产生问题的环境:ssm+mysql+gridFS+tomcat 问题代码段: public void write(OutputStream os, InputStream is) { try (BufferedOutputStream bos = new BufferedOutputStream(os); BufferedInputStream bis = new BufferedInputStrea

  • 解决Java中OutOfMemoryError的问题

    目前为止,我遇到使用Tomcat有三种情况:第一,使用Eclipse,在Eclipse中配置Tomcat.第二,直接在Tomcat中部署项目.第三将Tomcat安装为windows服务. 在这三种情况下,出现OutOfMemoryError.该怎么解决呢?这里我不得不提我被网上那些不负责任的文章害得很惨.各种设置内存的方法都试了,可就是不起作用.下面我说的这几种方法都是我亲自试验过的,没有问题. 第一种情况:  如图:我用红色框框出来的.其中Xms和Xmx是增加java虚拟机初始堆大小和最大堆大

  • 5种解决Java独占写文件的方法

    本文实例讲解了5种解决Java独占写文件的方法,包含自己的一些理解,如若有不妥的地方欢迎大家提出. 方案1:利用RandomAccessFile的文件操作选项s,s即表示同步锁方式写 RandomAccessFile file = new RandomAccessFile(file, "rws"); 方案2:利用FileChannel的文件锁 File file = new File("test.txt"); FileInputStream fis = new Fi

  • 完美解决java读取大文件内存溢出的问题

    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 实际上是使用BufferedReader或者其子类LineNumberReader来读取的. 传统方式的问题: 是文件的所有行都被存放在内存中,当文件足够大时很快就会

  • 完美解决java.lang.OutOfMemoryError处理错误的问题

    原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space 3

  • 解决 java.lang.NoSuchMethodError的错误

    解决 java.lang.NoSuchMethodError的错误 1 原因 在项目依赖比较复杂或者 Java 运行的环境有问题时,或者同一类型的 jar 包有不同版本存在,都可能触发该错误.本质上说是 JVM 找不到某个类的特定方法,也就是说 JVM 加载了错误版本的类.说白了,就是 JVM 找不到真正想要调用的方法啦!出现该错误的情形主要有以下两个种: 导入了不匹配的包版本: 开发环境和运行环境不一致. 2 解决方法 查看"External Libraries",看报错的方法到底存

  • 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)

    解决java编译错误( 程序包javax.servlet不存在javax.servlet.*) 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax.servlet.http 不存在 等错误 由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决"软件包 javax.servlet不存在"错误的方法: 1. 搜索servle

  • 解决Java J2EE乱码问题的方法

    乱码是j2ee中一个比较常见的问题.遇到一两个问题的情况下,可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决.遇到多的情况下,就最好用过滤器. 过滤器只需要注意2个地方即可--类和web.xml 1.在web.xml上面的发布如下: <fileter> <!-- 类名 --> <filter-name>SetCharsetEncod

  • 完美解决Java中的线程安全问题

    给出一个问题,如下: 解决方案如下: public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.s

  • 解决java数值范围以及float与double精度丢失的问题

    1.java中int,float,long,double取值范围 public class TestOutOfBound { public static void main(String[] args) { System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE)); //内存溢出 System.out.println(Integer.MAX_VALUE); //2的31次方-1,10个数位,正的20亿左右,用在钱上面不一定够 Syste

随机推荐