Java 为什么serverScoket.accept()只对一个请求执行多次
我正在学习《tomcat是如何工作的》这本书,发现了一件让我大吃一惊的事情。我将代码简化如下:Java 为什么serverScoket.accept()只对一个请求执行多次,java,multithreading,sockets,tomcat,serversocket,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(); } c
public class Boot {
public static void main(String[] args) {
ServerDemo server = new ServerDemo();
try {
server.start();
System.in.read();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Boot
类是主类,用于引导此应用程序,ServerDemo
类是一个简化的服务器,它侦听8080端口,并在浏览器的请求到达时打印信息。
现在的问题是:我想当我从浏览器发出请求时,它会执行
socket = serverSocket.accept();
然后只打印一次信息,然后线程阻塞自身,因为接受方法等待下一个请求
但是实际情况是,线程多次打印关于请求的信息(可能是3,4..)
这是一个执行:
输入:
输出:
--receive request from client----13
--receive request from client----13
--receive request from client----13
我的预期输出:
--接收来自客户机的请求----编号
小结:我无法理解一个请求为什么要打印几次,这意味着接受方法执行几次 可能是您的浏览器尝试了一些不同的方法让您做出响应,因为您刚刚关闭了它们的连接。尝试改用
curl
或wget
。
–ug_可能是您的浏览器尝试了一些不同的方法让您做出响应,因为您刚刚关闭了它们的连接。尝试改用
curl
或wget
。
–ug_u可能是您的浏览器尝试了一些不同的方法让您做出响应,因为您刚刚关闭了它们的连接。请尝试改用
curl
或wget
。@ug\u是的,当客户端未收到响应时,它将重试。正确。您的问题是基于浏览器正在发出一个请求的假设,而实际上它没有。可能是您的浏览器尝试了一些不同的方法让您响应,因为您刚刚关闭了它们的连接。请尝试改用curl
或wget
。@ug\u是的,当客户端未收到响应时,它将重试。正确。您的问题基于浏览器正在发出一个请求的假设,而实际上它没有发出请求。
http://localhost:8080/index
--receive request from client----13
--receive request from client----13
--receive request from client----13