- 同步阻塞IO(Blocking IO):即传统的IO模型
同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞。
如图所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作。
用户线程使用同步阻塞IO模型的阻塞点为两处:
1. 等待客户端接入:Socket socket=serverSocket.accept()
2. 读取客户端输入流: socket.getInputStream()
服务端阻塞等待客户端接入;
等待read将socket中的数据读取到buffer后,才继续处理接收的数据;
整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class AIOServer {
public static void main(String[] args){
try {
ServerSocket serverSocket=new ServerSocket(10000);
while (true){
System.out.println("server is running ,accept client message ......");
Socket socket=serverSocket.accept();
System.out.println("server is running ,get client message");
handleMessage(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void handleMessage(Socket socket){
InputStream inputStream= null;
try {
inputStream = socket.getInputStream();
byte[] bytes=new byte[1024];
while (true){
int i=inputStream.read(bytes);
if (i!=-1){
String message=new String(bytes,0,i);
System.out.print(message);
}else{
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}