【问题标题】:Web browsers send multiple request to custom Java serverWeb 浏览器向自定义 Java 服务器发送多个请求
【发布时间】:2013-08-01 22:45:18
【问题描述】:

作为一个更大项目的一部分,我不得不制作一个自定义的 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 时,我都会在控制台上多次看到 (Request Processed : time) ,即使我只是点击了一次 URL。

这怎么可能? .发生的情况是由于某种原因向服务器发起了多个请求,或者 Java Executor 框架在这里出现故障,可能多次执行一个请求左右? .我不相信任何一个原因都是真的

火狐

当我从 FF 中点击 url 时,每次我点击服务器时,Request Processed 都会在控制台上正确出现一次。 (它的行为很少像 chrome 一样,就像在某些随机时刻一样,它会针对单个 URL 命中显示两条 Request Processed 消息)

自定义 Java 客户端 当我从定制的 java 客户端应用程序中点击 URL 时,服务器应用程序的控制台窗口为每个请求正确显示一个 Request Processed 标记。

我什至点击了 10 次 URL,在 for 循环中速度极快,我在服务器端正确收到了 10 条请求处理消息

IE 与铬相同。

你们能提供一些关于这种情况的见解吗? .对于问题的长度,我深表歉意。

谢谢。

【问题讨论】:

  • 这里分析浏览器行为很重要。由于浏览器在 TCP/IP 上工作,因此需要知道浏览器是否等待某种确认。我不是在谈论 HTTP 请求/响应,我指的是发生在 IP 或传输层上的机制。
  • 我猜原因是浏览器正在并行启动多个连接(可能测试不同的协议或预缓存典型资源或类似的东西)。您是否尝试过嗅探传入的流量(例如,可能使用像 wireshark 这样的工具来检查浏览器和您的应用程序之间发生了什么)?
  • @Matthias 。不,但我认为它会提供见解。我目前正在下载该实用程序。谢谢
  • @LearnMore 。所以你认为这是正常的,我继续申请?
  • 好吧,我很高兴听到这个消息。所以至少你的服务器似乎工作正常。如果多个请求不会打扰您的服务器,您可能可以接受这个。如果您只想要一个“有效”请求,您必须以某种方式过滤 Chrome 和 IE 所做的额外请求。您正在尝试将哪个网址从浏览器连接到您的服务器?有 http:// 还是没有?

标签: java multithreading threadpoolexecutor


【解决方案1】:

浏览器出于不同目的发送了多个请求。对于你所知道的普通 HTTP 请求,然后是一个 if-modified 请求,它应该只抓取头部,最后是一个对网站图标的请求。

打印出浏览器发送的实际请求可能会启发你。 ;)

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2021-03-30
    • 2022-01-12
    • 2019-03-30
    • 2012-12-20
    • 2015-09-29
    • 2021-07-15
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多