案例对照

  1. 在Netty中使用OIO ```java public void start() throws InterruptedException { final EchoServerHandler serverHandler = new EchoServerHandler(); // 创建EventLoopGroup EventLoopGroup group = new OioEventLoopGroup();

    try {

    1. // 创建ServerBootstrap
    2. ServerBootstrap b = new ServerBootstrap();
    3. b.group(group).channel(OioServerSocketChannel.class) // 指定所使用的的OIO传输Channel
    4. .localAddress(new InetSocketAddress(port)) // 使用指定的端口设置套接字地址
    5. // 添加一个EchoServerHandler到子Channel的ChannelPipeline
    6. .childHandler(new ChannelInitializer<SocketChannel>() {
    7. @Override
    8. protected void initChannel(SocketChannel ch) throws Exception {
    9. // EchoServerHandler被标注为@Sharaable,所以我们可以总是使用同样的实例
    10. // 这里对于所有的客户端连接来说,都会使用同一个EchoServerHandler,因为其被标注为@Sharable。
    11. ch.pipeline().addLast(serverHandler);
    12. }
    13. });
    14. // 异步地绑定服务器;调用sync()方法阻塞等待知道绑定完成
    15. ChannelFuture f = b.bind().sync();
    16. // 获取Channel的CloseFuture,并且阻塞当前线程直到它完成
    17. f.channel().closeFuture().sync();

    } finally {

    1. // 关闭EventLoopGroup,释放所有资源
    2. group.shutdownGracefully().sync();

    }

}

  1. 2. OIO传输策略修改为NIO
  2. ```java
  3. public void start() throws InterruptedException {
  4. final EchoServerHandler serverHandler = new EchoServerHandler();
  5. // 创建EventLoopGroup
  6. EventLoopGroup group = new NioEventLoopGroup();
  7. try {
  8. // 创建ServerBootstrap
  9. ServerBootstrap b = new ServerBootstrap();
  10. b.group(group).channel(NioServerSocketChannel.class) // 指定所使用的的NIO传输Channel
  11. .localAddress(new InetSocketAddress(port)) // 使用指定的端口设置套接字地址
  12. // 添加一个EchoServerHandler到子Channel的ChannelPipeline
  13. .childHandler(new ChannelInitializer<SocketChannel>() {
  14. @Override
  15. protected void initChannel(SocketChannel ch) throws Exception {
  16. // EchoServerHandler被标注为@Sharaable,所以我们可以总是使用同样的实例
  17. // 这里对于所有的客户端连接来说,都会使用同一个EchoServerHandler,因为其被标注为@Sharable。
  18. ch.pipeline().addLast(serverHandler);
  19. }
  20. });
  21. // 异步地绑定服务器;调用sync()方法阻塞等待知道绑定完成
  22. ChannelFuture f = b.bind().sync();
  23. // 获取Channel的CloseFuture,并且阻塞当前线程直到它完成
  24. f.channel().closeFuture().sync();
  25. } finally {
  26. // 关闭EventLoopGroup,释放所有资源
  27. group.shutdownGracefully().sync();
  28. }
  29. }

对比可以发现,整体的代码结构是没有变化的,唯一变化的区在在于EventLoopGroup的实现以及指定了通道创建时指定了不同的类

  1. // 创建EventLoopGroup
  2. EventLoopGroup group = new OioEventLoopGroup();
  3. b.group(group).channel(OioServerSocketChannel.class)
  4. // 创建EventLoopGroup
  5. EventLoopGroup group = new NioEventLoopGroup();
  6. b.group(group).channel(NioServerSocketChannel.class)