2011-06-22 64 views
1

我試圖測試一個SOCKS代理,它在多個機器的負載下。我的代碼的輪廓是沿着URLConnection(代理代理)忽略設置的代理

  1. 連接直接與一個客戶端服務器線的東西,下載測試文件,並記錄需要的時間。
  2. 通過代理與一個客戶端連接,下載測試文件並記錄所花費的時間。
  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會忽略代理。奇怪的是,當我嘗試通過代理與多個客戶端進行連接時,基線連接的工作方式並不重要 - 如果基線連接沒有使用代理,那麼多個客戶端連接仍然會執行。

我在這裏錯過了什麼?

感謝

+0

是基線一個靜態變量或東西? –

+0

不,下載的每個實例都有其自己的基準變量。 – Joel

回答

1

我設法解決它 - 不管出於什麼原因,到url.openconnection後續調用之間的時間()有差別。在每個start()之間調用Thread.sleep(10000)。