0

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

第一种情况是,在没有线程的情况下,程序一个接一个地连接和测试 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) 我正在计算代理连接速度,所以,是的,连接是代理连接。2) 我创建的线程数在 100 左右。我认为应该没问题吧?

4

2 回答 2

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

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

于 2012-07-23T06:41:12.340 回答
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;
    }
于 2012-07-23T07:05:08.457 回答