1

複数のマシンからの負荷がかかっている SOCKS プロキシをテストしようとしています。私のコードの概要は、次の行に沿ったものです

  1. 1 つのクライアントでサーバーに直接接続し、テスト ファイルをダウンロードして、かかった時間を記録します。
  2. プロキシ経由で 1 つのクライアントに接続し、テスト ファイルをダウンロードして、かかった時間を記録します。
  3. プロキシ経由で複数のクライアントに接続し、テスト ファイルをダウンロードし、時間を記録します。

1と2は同じ機能で実行されます。

private static void baseline() {
    Download withProxy = new Download(socksPort, targetFile);
    Download withoutProxy = new Download(true, socksPort, targetFile); //The true argument just indicates not to use the proxy.


    try { //Come to think of it, I could just call run() directly here since this part is meant to be done serially.
        withProxy.start();
        withProxy.join();
        withoutProxy.start();
        withoutProxy.join();
                    //Some code for getting the times goes here.
    } catch (Exception e) {
        System.out.println("Couldn't get baseline.");
        e.printStackTrace();
    }
}

ダウンロード オブジェクトは Thread から継承されます。ほとんどの作業は、次のような run() メソッドで行われます。

public void run() {
    try {
        URL url = new URL("http://" + targetFile); 
        URLConnection urconn = null;
        if (baseline) {
            urconn = url.openConnection(Proxy.NO_PROXY); 
        } else {
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, proxyAddr);
            urconn = url.openConnection(proxy); 
        }
        InputStreamReader isr = new InputStreamReader(urconn.getInputStream());
        System.out.println("Thread " + id + " is downloading.");
        long startTime = System.currentTimeMillis();
        char[] buf = new char[64];
        while (isr.read(buf) != -1) {
            ;
        }   
        long endTime = System.currentTimeMillis();
        isr.close();
        System.out.println("Thread " + id + " has completed.");
        delta = (endTime - startTime);

    } catch (Exception e) {
        e.printStackTrace();
        System.exit(1);
    }
}

問題は、ベースライン関数を呼び出すと、常に最初に選択されたプロキシが使用されることです。最初に withproxy スレッドを実行すると、withproxy スレッドがプロキシを使用します。最初に withoutproxy を実行すると、withproxy はプロキシを無視します。本当に奇妙なことは、後でプロキシを介して複数のクライアントに接続しようとすると、ベースライン接続がどのように機能したかは関係ありません.ベースライン接続がプロキシを使用しなかった場合でも、複数のクライアント接続は引き続き使用されます.

ここで何が欠けていますか?

ありがとう

4

1 に答える 1

1

私はなんとかそれを修正しました - 何らかの理由で、url.openconnection() への後続の呼び出し間の時間は違いを生みます。各 start() の間に Thread.sleep(10000) を呼び出すと機能します。

于 2011-06-23T13:00:39.953 に答える