0

私は、(たとえば)5つのhttp接続(異なるIPへの)のhttp接続時間を計算するJavaプログラムを作成しています。

最初のシナリオは、スレッド化せずに、プログラムがhttpサーバーを1つずつ接続してテストすることです。つまり、1つのサーバーのテストが終了したら、別のサーバーに進みます。このシナリオでは、かかる時間は非常に長くなります。さらに、タイムアウトが正しく機能していません。たとえば、

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つの接続を成功させることさえできません。

今私の質問は、複数のスレッドを使用して複数の接続を確立できますか?答えが「はい」の場合、上記の問題を回避するために私が注意しなければならないことは何ですか?

感謝。

*追加情報* 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 に答える