我不得不将自定义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中编写localhost:9004时,我都会在控制台上多次看到(请求已处理:时间),即使我只点击了一次URL。
这怎么可能? 。发生了什么事情是由于某种原因启动了对服务器的多个请求或者Java Executor框架在这里可能多次执行一个请求? 。我不相信其中任何一个原因都是真的
火狐
当我从FF点击网址时,每当我点击服务器时,控制台上的请求已正确进行一次。 (很少它的行为像chrome一样,就像在一些随机的时刻,它显示了两个请求处理的消息,用于单个URL命中)
自定义Java客户端 当我从定制的java客户端应用程序中点击URL时,服务器应用程序的控制台窗口正确显示每个请求的一个Request Processed标记。
我甚至点击了URL 10次,在for循环中非常快,我在服务器端正确收到了10条Request Processed消息
IE 与铬相同。
请问您能否就情况向我提供一些见解? 。我为这个问题的长度道歉。
谢谢。
答案 0 :(得分:0)
浏览器为不同目的发出了多个请求。对于您知道的普通HTTP请求,然后有一个if-modified请求,它应该只抓取标题,最后有一个网站图标请求。
打印出浏览器发送的实际请求可能会启发您。 ;)