我不得不將自定義Java線程池服務器作爲更大項目的一部分。Web瀏覽器向自定義Java服務器發送多個請求
自從至少有一個白天和黑夜,我遇到了一個問題,這個問題正在傷害我腦海中的神經元。
我所做的很簡單(接着是在線資源)。我有一個while循環,永遠循環。發出請求,它接受它並將它發送到線程池(Java執行程序框架)。
protected ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(! isStopped()){
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if(isStopped()) {
System.out.println("Server Stopped.") ;
return;
}
throw new RuntimeException("Error accepting client connection", e);
}
this.threadPool.execute(
new Task(clientSocket,
"Test")
);
//System.out.println("Processed");
}
this.threadPool.shutdown();
不能得到任何簡單的權利?
也Task類,只接受一個插座,並寫入到它的輸出流
public class Task implements Runnable{
protected Socket clientSocket = null;
protected String serverText = null;
public Task(Socket clientSocket, String serverText) {
this.clientSocket = clientSocket;
this.serverText = serverText;
}
public void run() {
try {
InputStream input = clientSocket.getInputStream();
OutputStream output = clientSocket.getOutputStream();
long time = System.currentTimeMillis();
output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " +
this.serverText + " - " +
time +
"").getBytes());
output.close();
input.close();
System.out.println("Request processed: " + time);
} catch (IOException e) {
//report exception somewhere.
e.printStackTrace();
}
}
}
這裏是問題。 Chrome 無論何時我在Chrome中編寫localhost:9004,我都會多次在控制檯上看到(請求已處理:時間),即使我只是點擊了一次URL。
這怎麼可能? 。發生什麼情況是由於某種原因啓動了對服務器的多個請求,或者Java Executor框架出現故障,可能多次執行一次請求? 。我不相信任何的理由可以是真實的
火狐
當我打從FF的URL,請求處理的控制檯上,每次我打了服務器正常來一次。 (很少它確實表現得像鉻,像一些隨機的時刻,它顯示了兩個請求處理的消息對於單個URL命中)
定製的Java客戶端 當我打的URL從一個定製的Java客戶端應用程序,該服務器應用程序的控制檯窗口正確顯示每個請求的一個請求已處理標記。
我連打URL 10倍,極快的內部for循環中,我收到正確的服務器端
IE 一樣鉻10請求處理的消息。
你們可以請我提供一些有關情況的見解嗎? 。我對問題的長度表示歉意。
謝謝。
這裏分析瀏覽器行爲很重要。由於瀏覽器使用TCP/IP,所以需要知道瀏覽器是否等待某種確認。我不談論HTTP請求/響應,我指的是IP或傳輸層上正在發生的機制。 –
我想原因是瀏覽器並行啓動多個連接(也許測試不同的協議或preaching典型的資源或類似的東西)。 您是否試圖嗅探傳入的流量(例如,可能使用像wireshark這樣的工具來檢查瀏覽器和您的應用之間發生了什麼)? – Matthias
@Matthias。不,但我認爲它會提供見解。我目前正在下載該實用程序。謝謝 –