传统的IO模型

本文详细介绍了同步阻塞IO模型的基本原理及工作流程。通过Java示例代码展示了一个典型的同步阻塞服务器如何处理客户端连接及读取数据的过程。在该模型中,服务器线程会在等待客户端连接和读取数据时被阻塞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 同步阻塞IO(Blocking IO):即传统的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();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值