使用多个线程建立连接

时间:2012-07-23 06:18:10

标签: java

我正在编写一个Java程序来计算http连接时间(假设)5 http连接(到不同的IP)。

第一个场景是,没有线程,程序逐个连接和测试http服务器,这意味着完成一个服务器测试然后进入另一个服务器。在这种情况下,所花费的时间非常长。此外,超时工作不正常,例如,我已设置

setConnectTimeout(5 * 1000);
setReadTimeout(5 * 1000);

但时间返回

long starTime = System.currentTimeMillis();

c.connect();

String line;
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
while ((line = in.readLine()) != null){
    page.append(line);

elapseTime = System.currentTimeMillis() - starTime;

可以超过5秒,有些甚至高达30秒(但我只设置5秒作为超时)。

因此,我将实现变为多线程。但结果更加荒谬。我现在甚至无法获得一个成功的连接。

现在我的问题是,我们可以使用多个线程建立多个连接吗?如果答案是肯定的,我必须注意避免上述问题?

感谢。

* 额外信息 * 1)我正在计算代理连接速度,所以,ya,连接是代理连接。 2)我创建的线程大约为100.我认为应该没问题吗?

2 个答案:

答案 0 :(得分:0)

你是如何建立联系的?你在使用套接字连接吗?如果是这样,根据您设置套接字的方式,您可能会发现连接超时值可能会被忽略

Socket sock = new Socket("hostname", port);
sock.setSoTimeout(5000);
sock.connect();

实际上不会设置连接超时值,因为构造函数已经尝试连接。

SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket sock = new Socket();
sock.connect(sockaddr, 5000);

更准确地连接超时值。这可以解释为什么套接字超时不起作用。

答案 1 :(得分:0)

public float getConnectionTime(){
        long elapseTime = 0;

        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAdd, portNum));
        URL url;
        StringBuilder page = new StringBuilder();
        HttpURLConnection uc = null;
        try {



            uc = (HttpURLConnection)Main.targetMachine.openConnection(proxy);
//          uc = (HttpURLConnection)Main.targetMachine.openConnection();

            uc.setConnectTimeout(Main.timeOut);
            uc.setReadTimeout(Main.timeOut);


            long starTime = System.currentTimeMillis();

            uc.connect();



//          if (uc.getResponseCode() == HttpURLConnection.HTTP_OK){
//              System.out.println("55555");
//          }else System.out.println("88888");

            String line;
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
            while ((line = in.readLine()) != null){
               page.append(line);

            elapseTime = System.currentTimeMillis() - starTime;        


        }
        } catch (SocketTimeoutException e) {
            System.out.println("time out lo");
//          e.printStackTrace();
            return 9999; //if time out, use 9999 signal.
        } catch (IOException e){
            System.out.println("open connection error, connect error or inputstream error");
//          e.printStackTrace();
            return 9999;
        }finally{
            if (uc != null)
                uc.disconnect();
        }

//      System.out.println(page);
        return (float)elapseTime / 1000;
    }