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

时间:2013-08-01 06:36:39

标签: java multithreading threadpoolexecutor

我不得不将自定义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 与铬相同。

请问您能否就情况向我提供一些见解? 。我为这个问题的长度道歉。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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