先来一段JAVA创建ServerSocket的方法
public class TCPAccept {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket accept = serverSocket.accept();
System.out.println("获取到连接");
System.out.println(Thread.currentThread().getName()+" id:"+Thread.currentThread().getId());
InputStream inputStream = accept.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes,0, read));
}
}
}
}
开启服务。用telnet进行连接。
然后ctrl + ]
当我再开一个命令窗口连接服务器的时候。
发现服务器是没有反应的。发生了堵塞。
当我断开第一个连接。第二个连接才能正常的执行。
为此我直到主线程肯定在某个调用中等待,导致其他想创建服务的连接堵塞,同样基于BIO模型,来一个请求要创建一个线程来处理。我想找到到底是哪个方法造成我的线程堵塞。
代码变成如图
为此我直到现在主线程在 serverSocket.accept()中等待客户端请求。
当我发起请求后,主线程并没有堵塞,而是再次执行了一次while循环,回到了serverSocket.accept();至此我直到造成堵塞主线程堵塞,导致新连接不是它。
加了这段代码,结果不变。
唯有在调用inputStream.read()的时候。线程才会被堵塞。点进方法内部基于实现类SocketInputSteam一个本地方法导致线程堵塞