头图

阻塞IO的概念
阻塞IO(Blocking IO)是一种IO操作模式。在这种模式下,当一个IO操作(如读、写)执行时,如果不能立即完成操作,程序会暂停执行,直到操作完成。简单来说,阻塞IO会使调用线程等待IO操作的完成,无法继续处理其他任务。
特点

简单性:编程模型简单,易于理解和实现。
线程阻塞:IO操作会导致线程阻塞,等待IO操作完成。
适用场景:适用于连接数较少且每个连接需要较长时间处理的场景,以字节为传输单位。

阻塞IO的Java示例
下面是一个使用Java进行阻塞IO操作的简单示例。这段代码展示了如何使用ServerSocket和Socket进行阻塞IO操作。
代码示例
服务端代码
java 代码解读复制代码public class TCPServer {

public static void main(String[] args) throws IOException {  
    System.out.println("服务的启动...");  
    System.out.println("开始监听9999端口");  
    ServerSocket ss = new ServerSocket(9999);  
    while (true){  
        // 等待客户端连接  
        Socket accept = ss.accept();  
        // 处理客户端请求  
        InputStream is = accept.getInputStream();  
        byte[] b = new byte[10];  
        is.read(b);  
        String clientIP = accept.getInetAddress().getHostAddress();  
        System.out.println(clientIP + "说:" + new String(b));  
        // 回复客户端消息  
        OutputStream os = accept.getOutputStream();  
        os.write("Echo".getBytes());  
        // 关闭  
        accept.close();  
    }  
}  

}

客户端代码
java 代码解读复制代码public class TCPClient {

public static void main(String[] args) throws IOException {  
    while (true){  
        //创建socket对象  
        Socket s = new Socket("127.0.0.1", 9999);  
        OutputStream os = s.getOutputStream();  
        System.out.println("请输入:");  
        Scanner sc = new Scanner(System.in);  
        String input = sc.nextLine();  
        os.write(input.getBytes());  
        //获得服务端的响应  
        byte[] b = new byte[1024];  
        int len = s.getInputStream().read(b);  
        System.out.println("服务端回复:" + new String(b, 0, len));  
        //关闭连接  
        s.close();  
    }  
}  

}

运行说明

启动服务端:首先编译并运行TCPServer。服务端会在9999端口上监听客户端连接。
启动客户端:然后编译并运行TCPClient。客户端会连接到服务端,并可以输入消息发送到服务端。
交互:客户端发送的每条消息,服务端会接收并返回一个“Echo”响应。

总结
阻塞IO适用于简单的网络应用,但在高并发场景下效率较低,因为每个连接会占用一个线程,可能导致线程资源耗尽。为了解决高并发问题,可以使用非阻塞IO(如NIO)或异步IO技术。

转载来源:https://juejin.cn/post/7390686791776862235


运维社
12 声望4 粉丝