不确定为什么'java.net.ConnectException:Connection timed out:connect'异常发生

时间:2011-01-14 10:17:28

标签: java tomcat tomcat6

以下线程处于循环中,它只是连接到服务器,下载文件,关闭连接然后重复该过程。 在循环的大约500次迭代之后抛出以下异常 -

  

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

为什么会发生这种情况? 一旦抛出异常,有没有办法杀死线程?

代码 -

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();
    }
}

感谢。

4 个答案:

答案 0 :(得分:2)

问题在于,您绝不允许您与完全关联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 /等待线程完全关闭连接并释放其资源。

答案 1 :(得分:1)

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

当计数== 400时,尝试输入类似睡眠的东西10秒,看看这对你能处理的数量有什么影响吗?

答案 2 :(得分:1)

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

一旦抛出异常,您所拥有的代码将退出循环,因为catch块在while (true)块之外。一旦run返回,线程将会死亡。

答案 3 :(得分:0)

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

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

您希望确保可以使用Wireshark之类的内容来检查客户端和服务器之间的网络活动。您可能会注意到,在最后一个连接上,您将看到出站数据包,但不会看到入站数据包。