当前位置:

首页 > 编程开发 > Java的IO模型和Netty框架:介绍与比较

Java的IO模型和Netty框架:介绍与比较

IObit Uninstaller 15 Pro
IObit Uninstaller 15 Pro

IObit Uninstaller 是一款专为 Win 平台设计的软件卸载工具,卸载干净彻底。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

立即下载
¥29
Windows 2026-08-22
正版软件 Windows Uninstaller 卸载清理工具

什么是Netty异步,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠的网络IO程序主要针对在TCP协议下,面向Clients端的高并发应用本质是一个NIO框架,适用于服务器通讯等场景异步:发送请求无需等待响应,程式接着往下走。事件驱动:一个连接事件或者断开事件,或者读事件或者写事件,发生后的后续处理。Netty典型应用:高性能rpc框架用来远程服务(过程)调用,比如Dubbo。游戏行业,页面数据交互。大数据领域如Hadoop高性能通讯和序列化组件(AVRO)。IO模型简单理解就是用什么通道去进行数

本文目录

      什么是Netty

      • 异步,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠的网络IO程序

      • 主要针对在TCP协议下,面向Clients端的高并发应用

      • 本质是一个NIO框架,适用于服务器通讯等场景

      异步:发送请求无需等待响应,程式接着往下走。

      事件驱动:一个连接事件或者断开事件,或者读事件或者写事件,发生后的后续处理。

      Java的IO模型和Netty框架:介绍与比较

      Netty典型应用:

      • 高性能rpc框架用来远程服务(过程)调用,比如Dubbo。

      • 游戏行业,页面数据交互。

      • 大数据领域如Hadoop高性能通讯和序列化组件(AVRO)。

      IO模型

      简单理解就是用什么通道去进行数据发送和接收。

      BIO:一个连接一个线程,连接不做任何事会造成不必要的线程开销。适用于连接数目较小且固定的架构。

      Java的IO模型和Netty框架:介绍与比较

      NIO:服务端一个线程(也可以多个),维护一个多路复用器。由多路复用器去处理IO线程。适用于连接数目多且较短的架构

      Java的IO模型和Netty框架:介绍与比较

      AIO:异步非阻塞,还未得到广泛应用。适用于连接数目多且连接较长的架构。

      BIO

      BIO编程简单流程

      • 服务端创建启动ServerSocket

      • 客户端启动Socket对服务器进行通信,默认服务器会对每一个客户创建一个线程。

      • 客户端发出请求后,先咨询线程是否有响应,如果没有则等待或者拒绝。

      • 如果有响应,则等待请求结束后,再继续执行。(阻塞)

      BIO简单实例

      public class BIOserver {
          public static void main(String[] args) throws IOException {
              // 为了方便直接用了Executors创建线程池
              ExecutorService service = Executors.newCachedThreadPool();
              //指定服务端端口
              ServerSocket serverSocket = new ServerSocket(6666);
              System.out.println("服务器启动");
              while(true){
                  //阻塞等待连接
                  Socket socket = serverSocket.accept();
                  System.out.println("连接到一个客户端");
                  //每个连接对应一个线程
                  service.execute(new Runnable() {
                      @Override
                      public void run() {
                          try {
                              handler(socket);
                          }catch (Exception e){
                              e.printStackTrace();
                          }
                      }
                  });
              }
          }
          public static void handler(Socket socket) throws IOException {
              System.out.println("Thread:"+Thread.currentThread().getId());
              byte[] bytes = new byte[1024];
              InputStream inputStream = socket.getInputStream();
              while (true){
                  //阻塞等待读取
                  int n = inputStream.read(bytes);
                  if(n!=-1){
                      System.out.println(new String(bytes,0,n));
                  }else {
                      break;
                  }
              }
              socket.close();
          }
      }

      测试:使用windows的telnet

      Java的IO模型和Netty框架:介绍与比较

      使用 ctrl+]

      Java的IO模型和Netty框架:介绍与比较

      Java的IO模型和Netty框架:介绍与比较

       可以在服务端控制台看到,已经读取到发送的数据

      Java的IO模型和Netty框架:介绍与比较

      NIO

      三大核心部分:Channel(可类比Socket),Buffer,Selector

      大概是这个样子。客户端和Buffer交互,Buffer和Channel是一对一的关系。Selector选择操作Channel(事件驱动,如果Channel有事件发生,Selector才去选择操作。)

      Java的IO模型和Netty框架:介绍与比较

      Buffer

      Buffer基本使用

      ByteBuffer使用场景较为广泛。

      buffer就是一个内存块,所以说nio是面向块/缓冲,底层是数组。数据读写是通过buffer。可以使用方法flip切换读写。

      public class BufferNio {
          public static void main(String[] args) {
              //创建buffer容量为5个int
              IntBuffer buffer = IntBuffer.allocate(5);
              //放数据
              buffer.put(1);
              buffer.put(2);
              buffer.put(3);
              buffer.put(4);
              buffer.put(5);
              //读写切换
              buffer.flip();
              //取数据
              //内部维护一个索引,每次get索引都会往后边移动
              while(buffer.hasRemaining()){
                  System.out.println(buffer.get());
              }
          }
      }

      Buffer四个主要属性

      // Invariants: mark <= position <= limit <= capacity
          private int mark = -1;
          private int position = 0;
          private int limit;
          private int capacity;

      mark:标记,很少改变

      position:下一个要被读元素的位置,为下次读写做准备

      limit:缓冲器当前的终点,不能对缓冲区极限意外的区域读写,可变。

      capacity:不可变,创建时指定的最大容量。

      上边出现了读写切换的方法flip,我们看下源码,可以看出来通过改变属性实现可读可写的。

      public final Buffer flip() {
              limit = position;
              position = 0;
              mark = -1;
              return this;
          }

      可以通过啊更改limit或者position来实现你想要的操作。参数自己决定

      buffer.limit(2);
              buffer.position(1);

      Channel

      可读可写,上接Selector,下连Buffer。

      当客户端连接ServerSocketChannel时,创建客户端自己的SocketChannel。

      本地文件写案例

      public class ChannelNio {
          public static void main(String[] args) throws IOException {
              String str = "少壮不努力,老大徒伤悲";
              //创建输出流
              FileOutputStream os = new FileOutputStream("D:\\xxxxxxxxxxxxxxxxxxx\\a.txt");
              //获取FileChannel
              FileChannel channel = os.getChannel();
              //创建缓冲
              ByteBuffer buffer = ByteBuffer.allocate(1024);
              //把字符串放入缓冲区
              buffer.put(str.getBytes());
              //反转ByteBuffer
              buffer.flip();
              //将ByteBuffer写入到FileChannel
              channel.write(buffer);
              //关闭流
              os.close();
          }
      }

      图示理解

      Java的IO模型和Netty框架:介绍与比较

      本地文件读案例

      public class ChannelNio {
          public static void main(String[] args) throws IOException {
              FileInputStream is = new FileInputStream("D:\\xxxxxxxxxxxxxxxxxxx\\a.txt");
              FileChannel channel = is.getChannel();
              ByteBuffer buffer = ByteBuffer.allocate(1024);
              channel.read(buffer);
              System.out.println(new String(buffer.array()));
              is.close();
          }
      }

      本地文件拷贝案例

      方法一

      public class ChannelNio {
          public static void main(String[] args) throws IOException {
              FileInputStream is = new FileInputStream("D:\\xxxxxxxxxxxxxxxxxxx\\a.txt");
              FileChannel channel = is.getChannel();
              ByteBuffer buffer = ByteBuffer.allocate(1024);
              FileOutputStream os = new FileOutputStream("D:\\xxxxxxxxxxxxxxxxxxx\\b.txt");
              FileChannel osChannel = os.getChannel();
              while (true){
                  buffer.clear();
                  int i = channel.read(buffer);
                  if(i==-1){
                      break;
                  }
                  buffer.flip();
                  osChannel.write(buffer);
              }
              is.close();
              os.close();
          }
      }

      方法二

      public class ChannelNio {
          public static void main(String[] args) throws IOException {
              FileInputStream is = new FileInputStream("D:\\xxxxxxxxxxxxxxxxxxx\\HELP.md");
              FileChannel channel = is.getChannel();
              FileOutputStream os = new FileOutputStream("D:\\xxxxxxxxxxxxxxxxxxx\\HELP222.md");
              FileChannel osChannel = os.getChannel();
              osChannel.transferFrom(channel,0,channel.size());
              is.close();
              os.close();
          }
      }

      Selector

      用一个线程处理多个客户端连接。可以检测多个注册通道的事件,并作出相应处理。不用维护所有线程。

      Java的IO模型和Netty框架:介绍与比较

      Selector可以获得被注册的SocketChannel的一个SelectionKey集合,然后监听select,获得有事件发生的SelectionKey,最后通过SelectionKey获得通道进行相应操作,完成业务。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java io
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

      即将离开本站
      您即将前往第三方网站,请确认是否继续?