Web浏览器向自定义Java服务器发送多个请求
作为一个更大项目的一部分,我不得不制作一个定制的java线程池服务器 我遇到了一个问题,它伤害了我大脑中的神经元,因为至少有一整晚 我所做的很简单(遵循在线资源)。我有一个暂时的循环,它永远循环。发出一个请求,它接受该请求并将其发送到线程池(Java executor framework) 再简单不过了,对吧 同样,Task类只接受一个套接字,并写入它的输出流Web浏览器向自定义Java服务器发送多个请求,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,作为一个更大项目的一部分,我不得不制作一个定制的java线程池服务器 我遇到了一个问题,它伤害了我大脑中的神经元,因为至少有一整晚 我所做的很简单(遵循在线资源)。我有一个暂时的循环,它永远循环。发出一个请求,它接受该请求并将其发送到线程池(Java executor framework) 再简单不过了,对吧 同样,Task类只接受一个套接字,并写入它的输出流 public class Task implements Runnable{ protected Socket clientS
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时,我会在控制台上多次看到(请求处理:time),即使我只点击了一次URL
这怎么可能呢。发生的情况是,由于某种原因启动了对服务器的多个请求,或者Java Executor框架出现故障,可能是多次执行一个请求。我不相信这两个理由都是真的
Firefox
当我点击FF中的url时,每次点击服务器时,控制台上都会出现一次正确处理的请求。(它很少表现得像chrome,就像在一些随机时刻一样,它只显示一个URL点击的两条请求处理消息)
自定义Java客户端
当我点击定制java客户端应用程序的URL时,服务器应用程序的控制台窗口正确地显示了每个请求的一个请求处理标记
我甚至点击了10次URL,在for循环中速度惊人,在服务器端我正确地收到了10条请求处理消息
IE
和铬一样
你们能给我提供一些关于情况的见解吗。我为问题的长度道歉
多谢各位 浏览器出于不同目的发送了多个请求。对于您所知道的普通HTTP请求,有一个if-modified请求,它应该只抓取头,最后是对web站点图标的请求
打印出浏览器发送的实际请求可能会对您有所启发。;) 在这里,分析浏览器行为很重要。由于浏览器在TCP/IP上工作,因此需要知道浏览器是否等待某种确认。我不是说HTTP请求/响应,我指的是发生在IP或传输层上的机制。我想原因是浏览器正在并行启动多个连接(可能测试不同的协议或预编译典型的资源或类似的东西)。您是否尝试过嗅探传入流量(例如,可能使用wireshark之类的工具来检查浏览器和应用程序之间的情况)?@Matthias。不,但我认为它会给人以深刻的见解。我目前正在下载该实用程序。Thanks@LearnMore . 那么你认为这是正常的吗?我会继续申请吗?很高兴听到这个消息。因此,至少您的服务器似乎工作正常。如果多个请求不影响您的服务器,您可能可以接受这一点。如果你只需要一个“有效”的请求,你就必须以某种方式过滤Chrome和IE的额外请求。您正试图将哪个url从浏览器连接到服务器?有http://还是没有?
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();
}
}
}