网络编程基础:从BIO到NIO再到AIO(一)

BIO、NIO、AIO Java BIO 就是传统的 java io 编程,其相关的类和接口在 java.ioBIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器).​ 在上述的案例中,一个服务端只能接收一个客户端的通信请求,那么如果服务端需要处理很多个客户端的消息通信请求应该如何处理呢​ 在上述案例中:客户端的并发访问增加时。 阅读详情

网络编程基础:从BIO到NIO再到AIO

前言

为什么要学习 BIO、NIO、AIO?

在学习 Netty 之前,先理解 Java 的三种 IO 模型:

  • BIO:最基础的网络编程模型,理解网络通信原理
  • NIO:Netty 的底层实现,理解高性能网络编程
  • AIO:了解异步编程思想,拓展知识面

BIO、NIO、AIO 核心区别总结

总结

模型核心特点通俗比喻
BIO同步阻塞:调用后等待结果,线程被阻塞排队办业务,轮到你之前一直等
NIO同步非阻塞:调用后立即返回,需要轮询检查银行大堂经理,不断巡视哪个窗口有人
AIO异步非阻塞:调用后立即返回,结果通过回调通知外卖送达通知,到了自动打电话

BIO核心概念讲解

一、BIO 的三个角色

┌─────────────┐                    ┌─────────────┐
│   Server    │                    │   Client    │
│  (服务端)   │◀────── Socket ─────│  (客户端)   │
└─────────────┘                    └─────────────┘
     角色1          通信工具            角色2

1. Server(服务端)

  • 作用:等待客户端连接,处理客户端请求
  • 比喻:像餐厅,等待客人上门
  • 代码:MultiBioServer.java

2. Client(客户端)

  • 作用:主动连接服务端,发送请求
  • 比喻:像客人,主动去餐厅
  • 代码:SimpleBioClient.java

3. Socket(通信工具)

  • 作用,是通信工具
  • 作用:连接客户端和服务端,传输数据
  • 比喻:像电话线,连接两个人

二、BIO 是什么?

BIO = Blocking IO(阻塞式输入输出)

核心特点:

// 1. 阻塞等待连接
Socket socket = serverSocket.accept();  // 没客户端连接,就一直等(阻塞)

// 2. 阻塞读取数据
String message = reader.readLine();     // 没数据,就一直等(阻塞)

BIO 的作用:

  1. 实现网络通信:让两台电脑能互相发消息
  2. 简单易用:代码直观,适合入门学习
  3. 适合低并发:客户端少的场景(比如内部系统)

三、Socket 详解

Socket 是什么?

​ Socket = 网络通信的端点

客户端 Socket                    服务端 Socket
┌─────────────┐                ┌─────────────┐
│ InputStream │◀───── 数据 ─────│OutputStream │
│             │                │             │
│OutputStream │────── 数据 ────▶│ InputStream │
└─────────────┘                └─────────────┘

Socket 的两种类型:

类型作用使用场景
ServerSocket监听端口,接受连接服务端专用
Socket实际的通信通道客户端和服务端都用

四、关键 API 说明

API作用是否阻塞
ServerSocket.accept()等待客户端连接是
BufferedReader.readLine()读取一行数据是
PrintWriter.println()发送一行数据否
Socket.getInputStream()获取输入流否
Socket.getOutputStream()获取输出流否

五、BIO案例代码

/**
 * 最简单的 BIO 服务端
 * BIO 核心特点:阻塞式 IO
 * - accept() 会阻塞,等待客户端连接
 * - readLine() 会阻塞,等待客户端发消息
 */
public class MultiBioServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(7397);
        System.out.println("服务端启动,等待客户端连接...");
        // 循环接受客户端连接
        while (true) {
            // 等待客户端连接(阻塞)
            Socket clientSocket = serverSocket.accept();
            System.out.println("新客户端连接:" + clientSocket.getRemoteSocketAddress());
            // 为每个客户端创建一个线程处理
            new Thread(new ClientHandler(clientSocket)).start();
        }
    }

    /**
     * 客户端处理器(每个客户端一个线程)
     */
    static class ClientHandler implements Runnable {
        private Socket socket;
        public ClientHandler(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            try {
                // 获取输入输出流
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), "UTF-8")
                );
                PrintWriter writer = new PrintWriter(
                    new OutputStreamWriter(socket.getOutputStream(), "UTF-8"),
                    true
                );
                // 发送欢迎消息
                writer.println("欢迎连接到 BIO 服务器!");
                // 循环读取客户端消息
                String message;
                while ((message = reader.readLine()) != null) {
                    System.out.println("[" + socket.getRemoteSocketAddress() + "] 说:" + message);
                    // 回复客户端
                    writer.println("服务端已收到:" + message); 
                    // 如果客户端发送 "bye",结束连接
                    if ("bye".equalsIgnoreCase(message)) {
                        System.out.println("[" + socket.getRemoteSocketAddress() + "] 断开连接");
                        break;
                    }
                }
                // 关闭资源
                reader.close(); writer.close(); socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 * 最简单的 BIO 客户端
 * 
 * 功能:连接服务端,发送消息,接收回复
 */
public class SimpleBioClient {

    public static void main(String[] args) throws IOException {
        // 1. 连接服务端(IP + 端口)
        Socket socket = new Socket("127.0.0.1", 7397);
        System.out.println("已连接到服务端:" + socket.getRemoteSocketAddress());
        // 2. 获取输入流(读取服务端消息)
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(socket.getInputStream(), "UTF-8")
        );
        // 3. 获取输出流(发送消息给服务端)
        PrintWriter writer = new PrintWriter(
            new OutputStreamWriter(socket.getOutputStream(), "UTF-8"),
            true  // true 表示自动 flush
        );
        // 4. 读取服务端的欢迎消息
        String welcome = reader.readLine();
        System.out.println("服务端说:" + welcome);
        // 5. 从控制台读取用户输入,发送给服务端
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入消息(输入 bye 退出):");
        while (true) {
            // 读取用户输入
            String input = scanner.nextLine();
            // 发送给服务端
            writer.println(input);
            // 读取服务端回复
            String response = reader.readLine();
            System.out.println("服务端回复:" + response);
            // 如果输入 bye,退出
            if ("bye".equalsIgnoreCase(input)) {
                break;
            }
        }
        // 6. 关闭资源
        scanner.close(); reader.close();writer.close(); socket.close();
        System.out.println("已断开连接");
    }
}

BIO,NIO,多路复用,AIO BIO,NIO,多路复用,AIO 概念理解 IO流程 三大IO模型的解释 总结 BIO,NIO,多路复用,AIO 概念理解 同步和异步 关注点在于处理机制,同步在于等待上一条语句调用后的返回结果才继续,异步在于事件响应回调机制,语句调用后直接返回,等触发事件之后,自动调用写好的回调函数 阻塞非阻塞 关注点在于线程是否挂起 阻塞在于得到结果之前会挂起线程,非阻塞在于不会... 阅读详情

相关推荐

Netty(一)——BIO、NIO、AIO

         在工作中,无论什么项目我们都会用到网络传输,tomcat等server服务器、Dubbo等Rpc协议框架、Redis等NOsql数据库、各种MQ的中间件等等。这篇文章是学习《Netty权威指南》后的总结,从Java基础的BIO、NIO、AIO进行学习。         在说JavaIO以前,先看看unix提供的5种IO模型:         1,阻塞IO模型:    ...

学会改变自己——才能突破 1311

BIO、NIO、AIO详解

一、Java的I/O演进之路 Java共支持3种网络编程的I/O模型:BIO、NIO、AIO BIO: 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 NIO: 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理 AIO: 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求

hxt的博客 2万+

火星遥感数据的获取与处理工具安装详解

有关火星遥感影像数据的那些事...

FengYingLuo的博客 5576

面试官:BIO、NIO、AIO是什么,他们有什么区别?

面试官:BIO、NIO、AIO是什么,他们有什么区别?

真正的大师永远怀着一颗学徒的心 9948

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

Conformal LEC逻辑等价性检查介绍和参考脚本

分为三个产品:Conformal L、Conformal XL、Conformal GXL。L是功能性检查,XL支持复杂数据通路的综合和APR优化,GXL支持定制的stdcell和定制memory的检查。Cadence Conformal Equivalence Checker,就是常说的LEC,可以用来验证RTL、门级网表、甚至spice网表的逻辑等价性。do文件是conformal的脚本文件,可以由综合工具(RTL Compiler/Genus)自己产生(write_do_lec),也可以手写。

NanDigits的博客 7257

BIO、NIO、AIO 有什么区别?

BIO、NIO、AIO 有什么区别? BIO:线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。 NIO:线程发起IO请求,立即返回;内核在做好IO操作的准备之后,通过调用注册的回调函数通知线程做IO操作,线程开始阻塞,直到操作完成。 AIO:线程发起IO请求,立即返回;内存做好IO操作的准备之后,做IO操作,直到操作完成或者失败,通过调用注册的回调...

ConstXiong 2万+

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络,自然离不开网络准入(NAC),这就涉及到交换机的一些安全测试,于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击,那么下面提到的各种攻击方式,自然是建立在交换机安全配置之上来说的。我们通过h3c官方提供的《H3C 交换机安全加固手册》和《安全配置指导》,从这两份手册可以看出交换机支持的安全配置非常多,基本已经覆盖了各种我们熟知局域网攻击。下面就挑几个典型的攻击方式进行演示。 arp欺骗 【一>所有资源获取&lt

kali_Ma的博客 1万+

BIO,NIO,AIO的区别

BIO,NIO和AIO是Java网络编程的三种模型 BIO:同步并阻塞,服务实现模式为一个连接对应一个线程,即客户端发送一个连接,服务端要有一个线程来处理。如果连接多了,线程数量不够,就只能等待,即会发生阻塞。 NIO:同步非阻塞,服务实现模式是一个线程可以处理多个连接,即客户端发送的连接都会注册到多路复用器上,然后进行轮询连接,有I/O请求就处理 AIO:异步非阻塞,引入了异步通道,采用的是proactor模式,特点是:有效的请求才启动线程,先有操作系统完成在通知服务端 应用场景: BIO:

qxy_1218的博客 1万+

【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型

文章目录1. 引言2. Brinson单期归因模型2.1 模型框架2.2 公式推导3. Brinson多期归因模型3.1 模型框架3.2 公式推导4. Brinson模型的应用场景4.1 基金组合归因4.2 基金经理能力刻画4.3 大类资产配置应用5. 模型的实现与实证案例研究写在最后 1. 引言 在 2. Brinson单期归因模型 2.1 模型框架 wp wb rp 组合收益:wp rp 择股收益:wb rp rb 择时收益:wp rb 基准收益:wb rb 2.2 公式推

Mikey_Sun的博客 1万+

使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像

本文详细介绍了在NPU环境下进行模型推理性能测试的完整流程。首先配置了测试所需的环境和设备信息,包括Python 3.10.9和3.11.6版本、测试脚本和镜像文件。然后分步骤说明了镜像制作过程:创建特权容器、安装Python 3.10.9、配置VLLM环境,并详细描述了测试容器的启动方法。最后提供了镜像打包和使用指南,包括如何加载镜像、启动容器、运行测试脚本(以DeepSeek-32B模型为例)以及更换测试模型的步骤。整个过程涉及环境变量配置、权限设置和服务启动等关键操作。

m0_50105717的博客 1015

AIO,BIO,NIO详解

一、基本概念 IO:阻塞IO BIO:同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需要启动一个线程进行处理,如果这个链接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO:同步非阻塞IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。用户进程也需要时不时的询...

不务正业随手记 6737

1篇2章1节:在 Mac 上安装 Python,从环境检查到工具配置的完整指南

Python 是当今最流行的高级编程语言之一,广泛应用于数据分析、人工智能、自动化脚本和 Web 开发。虽然 macOS 曾自带 Python,但从 macOS 12.3 开始,系统不再默认提供可直接使用的版本,因此需要手动安装。本文将详细讲解如何在 Mac 上安装最新版本的 Python,如何验证安装是否成功,以及如何配置 IDLE 和 Python Launcher 等工具,为日常开发和学习打下坚实基础。即便你是完全的新手,也能按步骤完成环境搭建。

MD Code 850

一文搞懂Java BIO、NIO、AIO的核心区别

简单应用、低并发场景,选 BIO 足够,编程成本低;高并发网络编程场景,选 NIO,多路复用能大幅提升性能;高并发且 IO 操作耗时较长的场景,选 AIO,异步通知能最大化利用线程资源。掌握这三种 IO 模型的核心区别,能帮助我们在实际开发中做出更合理的技术选型,写出更高效的 Java 程序。

2301_79892101的博客 2358

100天精通Python(数据分析篇)——第53天:初识pandas模块_基础介绍

一、初始pandas 1. 什么是pandas? 2. 为什么要学习pandas? 3. pandas的优势 4. 下载安装pandas 二、Pandas的数据类型 1. Series 2. DataFrame

努力让自己发光,对的人才能迎着光而来 17万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

BIO、NIO与AIO

I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:**BIO、NIO、AIO** 1 每当接收到一个Socket连接就会创建一个新的线程,线程的竞争以及上下文切换会影响性能;2 每个线程都会占用栈空间和CPU资源;3 并不是每个socket都进行IO操作,无意义的线程处理(即使客户端没有消息,服务端的线程也会阻塞等待);

weixin_42828342的博客 1718

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVAIO模型之NIO、BIO、AIO

IO模型 io模型就是各种数据使用相应通道进行发送和接收。Java共支持三种网络编程IO模式 BIO、NIO、AIO BIO (Blocking IO) 同步阻塞模型,一个客户端连接对应一个处理线程。 缺点 IO代码里read是阻塞操作,如果连接不做读写操作会导致线程阻塞,浪费资源 如果读写很多,会导致服务器线程过多,压力太大。 应用场景 BIO适用于连接数目较小且固定的架构,这种方式对服务器资源的要求比较高,但是程序简单易理解。 示例代码 /** * 服务端 * @author 风信子 */

Zev_java的博客 1421

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java IO 模型之 BIO、NIO、AIO 详解

在 Java 编程中,IO(Input/Output)操作是非常常见的操作,它涉及到文件读写、网络通信等方面。Java 提供了各种类来支持这些操作。本文将从 IO 的基础知识讲起,逐步深入,介绍 Java IO 的各个方面。Java IO(Input/Output)是 Java 语言中用于读写数据的 API,它提供了一系列类和接口,用于读取和写入各种类型的数据。

流华追梦的专栏 2117

详解BIO,NIO,AIO

详解BIO,NIO,AIO

m0_66220639的博客 1258

面试官:BIO、NIO、AIO 的区别是什么?

这是个网络编程的面试题:在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。自己的理解:也就是必须一件一件事做,等前一件做完了才能做下一件事 (提交请求->等待服务器处理->处理完返回 这个期间客户端浏览器不能干任何事 )官方:使用同步IO时,Java自己处理IO读写。

2401_85910670的博客 1147

BIO、NIO、AIO的区别?

Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。

西京刀客 1256

BIO,NIO,AIO 简要总结

文章目录BIO,NIO,AIO 总结1. BIO (Blocking I/O)1.1 传统 BIO1.2 伪异步 IO1.3 代码示例1.4 总结2. NIO (New I/O)2.1 NIO 简介2.2 NIO的特性/NIO与IO区别1)Non-blocking IO(非阻塞IO)2)Buffer(缓冲区)3)Channel (通道)4)Selectors(选择器)2.3 NIO 读数据和写数据...

VicterTian的博客 1732

Java的BIO、NIO、AIO模型

NIO方式适用于连接数目多且连接比较短(轻操作) 的架构, 比如聊天服务器, 弹幕系统, 服务器间通讯,编程比较复杂, JDK1.4 开始支持。2、channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理。同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到。1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源。同步阻塞模型,一个客户端连接对应一个处理线程。

weixin_42037190的博客 1048
上一篇: 设计模式---行为型模式(三)
下一篇: 网络编程基础:从BIO到NIO再到AIO(二)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值