Netty之BIO(同步阻塞IO)、PIO(伪异步阻塞IO)、NIO(异步非阻塞IO)、AIO(异步非阻塞IO)

本文介绍了Netty中BIO、PIO、NIO和AIO四种不同的IO模型。BIO是同步阻塞的,每次客户端请求都需要启动新线程,可能导致线程资源耗尽。PIO通过线程池管理客户端请求,但在读写时仍为阻塞。NIO引入多路复用器Selector,实现了非阻塞IO,降低了线程消耗。AIO则是真正的异步非阻塞IO,进一步简化了编程模型。并提供了Netty服务器和客户端的简单示例代码。
摘要由CSDN通过智能技术生成

学习书籍:Netty权威指南

多种IO方式的比较:

1、BIO(同步阻塞IO)

使用ServerSocket绑定IP地址和监听端口,客户端发起连接,通过三次握手建立连接,用socket来进行通信,通过输入输出流的方式来进行同步阻塞的通信

每次客户端发起连接请求,都会启动一个线程

线程数量:客户端并发访问数为1:1,由于线程是Java虚拟机中非常宝贵的资源,一旦线程数急剧增加,系统性能会急剧下降,导致线程栈溢出,创建新的线程失败,并最终导致宕机

所以在JDK1.4之前,人们想到了一种方法,即PIO方式

2、PIO(伪异步阻塞IO)

使用线程池来处理客户端的请求

客户端个数:线程池最大线程数=M:N,其中M远大于N

在read和write的时候,还是IO阻塞的,只是把每个线程交由线程池来控制管理

3、NIO(异步阻塞IO)

用NIO方式处理IO

使用多路复用器Selector来轮询每个通道Channel,当通道中有事件时就通知处理,不会阻塞

使用相当复杂


服务器实现模式为一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

4、AIO(真正的异步非阻塞IO)

NIO2.0引入了新的异步通道的概念,不需要使用多路复用器(Selector)对注册通道进行轮询即可实现异步读写,从而简化了NIO编程模型


使用Netty框架进行编程步骤

1、构建事件处理池

2、使用引导程序关联事件处理池、通道、事件处理器

3、绑定端口服务

4、等待操作完成

5、关闭事件处理池


几种IO的功能和特性对比



按照书上的例子码了一遍:

服务端:

[java]  view plain   copy
  print ?
  1. import io.netty.bootstrap.ServerBootstrap;  
  2. import io.netty.channel.ChannelFuture;  
  3. import io.netty.channel.ChannelInitializer;  
  4. import io.netty.channel.ChannelOption;  
  5. import io.netty.channel.EventLoopGroup;  
  6. import io.netty.channel.nio.NioEventLoopGroup;  
  7. import io.netty.channel.socket.SocketChannel;  
  8. import io.netty.channel.socket.nio.NioServerSocketChannel;  
  9.   
  10. public class NettyServer {  
  11.     public void bind(int port) throws Exception {  
  12.         EventLoopGroup bossGroup = new NioEventLoopGroup();  
  13.         EventLoopGroup workGroup = new NioEventLoopGroup();  
  14.         try {  
  15.             ServerBootstrap b = new ServerBootstrap();  
  16.             b.group(bossGroup, workGroup).channel(NioServerSocketChannel.class)  
  17.                     .option(ChannelOption.SO_BACKLOG, 1024)  
  18.                     .childHandler(new ChildChannelHandler());  
  19.             // 绑定端口,同步等待成功  
  20.             ChannelFuture f = b.bind(port).sync();  
  21.             // 等待服务端监听端口关闭  
  22.             f.channel().closeFuture().sync();  
  23.         } catch (Exception e) {  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值