Web浏览器向定制Java服务器发送多个请求

3

作为一个大型项目的一部分,我不得不制作一个自定义的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类只接受一个socket,并写入它的输出流。

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框架的问题,例如执行了多次请求。但以上两种情况均不太可能。 Firefox表现: 当从Firefox浏览器打开该URL时,每次访问服务器时正确地显示了一个“Request Processed”。 自定义Java客户端表现: 从自定义Java客户端应用程序中打开URL时,服务器应用程序的控制台窗口会为每个请求正确地显示一个“Request Processed”标记。 IE表现: 与Chrome相同。
请提供有关此情况的见解。对于问题长度我表示歉意。

在编程中,分析浏览器行为非常重要。由于浏览器使用TCP/IP协议,因此需要了解浏览器是否等待某种确认。我不是在谈论HTTP请求/响应,而是指发生在IP或传输层的机制。 - Learn More
3
我猜测原因是浏览器会同时发起多个连接(可能是为了测试不同的协议、预缓存典型资源或其他类似的事情)。你是否尝试过嗅探传入的流量(例如,使用像Wireshark这样的工具检查浏览器和您的应用程序之间正在发生的情况)? - Matthias
不,我的建议是您需要考虑发送请求到服务器的客户端的行为。并基于此决定如何编写您的服务器代码。在这里,您无法更改浏览器行为,因此您必须进行分析。 - Learn More
@Matthias。我使用了Wireshark,并得到了一些答案。因此,我想特别感谢您让我更接近目标。Wireshark 显示源和目的地之间的交易数量与我的自定义服务器控制台窗口中所显示的完全相同。 - Muhammad Ahmed AbuTalib
1
很高兴听到这个好消息。所以至少你的服务器似乎是正常工作的。如果多个请求不会影响到您的服务器,您可能可以接受此操作。如果您只想要一个“有效”的请求,则必须对Chrome和IE发出的额外请求进行过滤。您究竟从浏览器尝试连接到服务器的哪个URL?使用http://还是不使用? - Matthias
显示剩余5条评论
1个回答

0

浏览器会发送多个请求以完成不同的目的。首先是您熟知的普通HTTP请求,然后是if-modified请求,该请求仅应获取标头,最后是用于网站图标的请求。

打印浏览器发送的实际请求可能会让您茅塞顿开。 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接