为什么serverScoket.accept()只执行一次请求几次

时间:2016-12-28 07:21:07

标签: java multithreading sockets tomcat serversocket

我正在学习这本书 tomcat的工作方式并找到让我大吃一惊的东西。我简化了如下代码:

public class Boot {
    public static void main(String[] args) {
        ServerDemo server = new ServerDemo();
        try {
            server.start();
            System.in.read();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
   }
}
public class ServerDemo implements Runnable {
    private ServerSocket serverSocket = null;
    public void run() {
        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                System.out.println("--receive request from client----"+
                    Thread.currentThread().getId());
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void start() {
        try {
            serverSocket = new ServerSocket(8080);
            Thread thread = new Thread(this);
            thread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Boot类是 Main class 并用于启动此应用程序,ServerDemo类是一个简化的服务器,可以监听 8080 端口和将在浏览器的请求到达时打印信息。 现在问题是:我认为当我从浏览器发出请求时会执行

socket = serverSocket.accept();

然后打印信息仅一次,然后由于accept method等待下一个请求而自行阻止线程。

真实的是线程打印信息几次:(可能3,4 ..)关于请求。

这是一个执行: 输入:

http://localhost:8080/index

输出:

--receive request from client----13
--receive request from client----13
--receive request from client----13

我的预期输出:

- 接收来自客户的请求----号码

摘要:我无法弄清楚一个请求为什么打印几次,这意味着接受方法执行多次。

1 个答案:

答案 0 :(得分:0)

您的浏览器可能尝试了一些其他操作来使您响应,这是因为您刚刚关闭了它们的连接。尝试改用curlwget。                     –ug _