简介
- 概念:在同步阻塞IO模型中,程序用IO调用开始,直到系统调用返回,在这段时间内,进程是阻塞的。直到返回成功后,应用程序开始处理用户空间的缓存区数据。
- 理解: 我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞。
过程
特点
- 优点:程序开发简单,便于实现,也容易理解,在阻塞等待数据期间,用户线程挂起,不占用CPU资源
- 缺点:处理效率低,对于服务器的资源有要求,需要为每一个连接的IO配备一个线程,在高并发应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切换开销会十分巨大
应用
简单实现
- 服务器
public class MyBIOServer {
static class SocketHandler extends Thread{
private Socket socket;
public SocketHandler(){};
public SocketHandler(Socket socket){
this.socket = socket;
}
@Override
public void run(){
InputStream inputStream = null;
OutputStream outputStream = null;
Scanner scanner = new Scanner(System.in);
try {
while (true){
inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println("客户端"+socket.getRemoteSocketAddress()+"发送的数据为: "+new String(bytes,0,len));
String s = scanner.next();
outputStream = socket.getOutputStream();
outputStream.write(s.getBytes());
outputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(1111));
System.out.println("服务器已启动...");
while (true){
Socket socket = serverSocket.accept();
System.out.println("与客户端"+socket.getRemoteSocketAddress()+"连接建立成功...");
SocketHandler socketHandler = new SocketHandler(socket);
socketHandler.start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 客户端
public class MyBIOClient {
public static void main(String[] args) {
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
Scanner scanner = new Scanner(System.in);
try {
socket = new Socket();
System.out.println("客户端已启动...");
socket.connect(new InetSocketAddress("127.0.0.1",1111));
System.out.println("与服务器"+socket.getRemoteSocketAddress()+"连接建立成功...");
while (true){
String s = scanner.next();
outputStream = socket.getOutputStream();
outputStream.write(s.getBytes());
outputStream.flush();
inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println("服务器"+socket.getRemoteSocketAddress()+"发送的数据为: "+new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}