ServerSocket的accept方法,在页面发起一次请求后,不会执行请求后阻塞,而是再次执行一次代码,执行2遍后再阻塞。
相关代码
public static void main(String[] args) {
try {
String str = "";
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
InputStream stream = socket.getInputStream();
byte[] bytes = new byte[2048];
stream.read(bytes);
OutputStream outputStream = socket.getOutputStream();
outputStream.write(str.getBytes());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
debug测试
通过debug模式测试,服务端启动后在accept处阻塞,在浏览器里使用localhost:8080发起请求,阻塞取消,执行完后面的代码后,不会再次阻塞,而是继续执行一次,第二次执行的时候bytes里的数据都是空的,之后再才在accept处进行阻塞。
accept的阻塞原理是什么,是通过什么情况判断才会进行阻塞?
accept表示接收一个连接,当有客户端连接进来时,就会被唤醒。否则,将会阻塞。
具体的底层实现没必要去看,这个和操作系统的实现有关