作为一个更大项目的一部分,我不得不制作一个自定义的 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 时,我都会在控制台上多次看到 (Request Processed : time) ,即使我只是点击了一次 URL。
这怎么可能?. 发生的情况是由于某种原因向服务器发起了多个请求,或者 Java Executor 框架在这里出现故障,可能多次执行一个请求左右?. 我不相信任何一个原因都是真的
火狐
当我从 FF 中点击 url 时,每次我点击服务器时,Request Processed 都会在控制台上正确出现一次。(它的行为很少像 chrome 一样,就像在某些随机时刻一样,它显示单个 URL 命中的两条 Request Processed 消息)
定制 Java 客户端 当我从定制的 Java 客户端应用程序中点击 URL 时,服务器应用程序的控制台窗口正确显示每个请求的一个请求已处理标记。
我什至点击了 10 次 URL,在 for 循环中速度极快,并且我在服务器端正确收到了 10 条请求处理消息
IE 与 chrome 相同。
各位大神能不能给我介绍一下情况?. 我为这个问题的长度道歉。
谢谢你 。