1
我試圖測試一個SOCKS代理,它在多個機器的負載下。我的代碼的輪廓是沿着URLConnection(代理代理)忽略設置的代理
- 連接直接與一個客戶端服務器線的東西,下載測試文件,並記錄需要的時間。
- 通過代理與一個客戶端連接,下載測試文件並記錄所花費的時間。
- 通過代理連接多個客戶端,下載測試文件,記錄時間。
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會忽略代理。奇怪的是,當我嘗試通過代理與多個客戶端進行連接時,基線連接的工作方式並不重要 - 如果基線連接沒有使用代理,那麼多個客戶端連接仍然會執行。
我在這裏錯過了什麼?
感謝
是基線一個靜態變量或東西? –
不,下載的每個實例都有其自己的基準變量。 – Joel