学习书籍: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的功能和特性对比
按照书上的例子码了一遍:
服务端:
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
-
- public class NettyServer {
- public void bind(int port) throws Exception {
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup, workGroup).channel(NioServerSocketChannel.class)
- .option(ChannelOption.SO_BACKLOG, 1024)
- .childHandler(new ChildChannelHandler());
-
- ChannelFuture f = b.bind(port).sync();
-
- f.channel().closeFuture().sync();
- } catch (Exception e) {