不知道为什么'java.net.ConnectException:连接超时:连接'异常正在发生

问题描述:

下面的线程处于循环中,它只是连接到服务器,下载文件,关闭连接,然后重复该过程。 以下异常后循环的约500迭代抛出 -不知道为什么'java.net.ConnectException:连接超时:连接'异常正在发生

java.net.ConnectException:连接 超时:连接

为什么会这样来发生的? 一旦引发异常,是否有办法杀死线程?

码 -

public void run() { 

    boolean isExceptionThrown = false; 

    try { 
    while(true){ 

     URL url = new URL(urlString); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

     String inputLine; 

     while ((inputLine = in.readLine()) != null) 
     { 
      //do nothing, just want to read the file 
     } 

     in.close(); 

     ++counter; 
     System.out.println("Thread id : "+this.threadId+" Connection number : "+counter +" URL : "+urlString); 
     } 

    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

感谢。

+0

我看到`tomcat`和`tomcat6`标签这个问题是如何与tomcat相关的? – gabuzo 2011-01-14 10:27:17

+0

您是否在服务器或客户端上尝试过“netstat”命令,以检查是否存在(m)应用程序留下的任何未关闭的连接? – biziclop 2011-01-14 10:30:07

+0

我把它添加到tomcat的情况下,可能是服务器端问题.... – 2011-01-14 15:57:45

警告:在这里推测。即使您的客户端代码正在关闭连接,您的服务器可能不会很快清理,因此您的客户端无法建立新的连接。这听起来像是在〜500的连接标记处,服务器有点不知所措。

当计数== 400时,尝试放入类似睡眠的东西10秒,看看是否有多少你可以处理的差异?

首先,我认为打印堆栈跟踪后线程将退出,因此您应该杀死线程。

关于原因,您的问题中没有足够的信息来找出真正的问题。我想你也应该检查服务器端,检查是否永远下载相同的文件不会引起服务器端问题或触发保护措施。

它你想确保你可以使用像Wireshark这样的东西来检查客户端和服务器之间的网络活动。您可能会注意到,在最后一次连接时,您会看到出站数据包,而不是入站数据包。

可能是服务器因连接太多而淹没。即使关闭流,服务器可能需要一些时间来关闭套接字。

由于catch块位于while (true)块之外,因此一旦抛出异常,您的代码将退出循环。一旦run返回线程将死亡。

的问题是,你永远不会让你到连接完全关闭Reader一次,让线程释放资源在未来while循环:

有可能在一个线程池太多连接,创建另一个1(而其他人正试图关闭)创建超时(这是我的猜测)。

做到这一点,而不是(伪java代码):

while (true) { 
    BufferedReader in = null; 

    try { 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (Exception ignore) { 
       ignore.printStackTrace(); 
      } 
     } 

     in = null; 
    } 
} 

另外,给你的线程的时间“干净”本身是从活动完全免费之前。尝试sleep /等待线程完全关闭连接并释放其资源。