http://blog.csdn.net/anxpp/article/details/52108238

Java NIO框架Netty简单使用 http://blog.csdn.net/anxpp/article/details/52108238



关闭
异步赠书:9月重磅新书升级,本本经典       【观点】:程序员应该如何积累财富?       程序员9月书讯       节后荐书:Python、PyQt5、Kotlin(评论送书)
 

Java NIO框架Netty简单使用

  3866人阅读  评论(3)  收藏  举报
  分类:
编程语言—————Java———(43) 

目录(?)[-]

  1. 1服务端
  2. 2客户端
  3. 3用于计算的工具类
  4. 4测试
  5. 5更多

转载请注明出处:http://blog.csdn.net/anxpp/article/details/52108238,谢谢!

    之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架。

    Netty是业界最流行的NIO框架之一,具有良好的健壮性、功能、性能、可定制性和可扩展性。同时,它提供的十分简单的API,大大简化了我们的网络编程。

    同Java IO介绍的文章一样,本文所展示的例子,实现了一个相同的功能。

1、服务端

    Server:

[java]  view plain  copy
 print ?
  1. package com.anxpp.io.calculator.netty;  
  2. import io.netty.bootstrap.ServerBootstrap;  
  3. import io.netty.channel.ChannelFuture;  
  4. import io.netty.channel.ChannelInitializer;  
  5. import io.netty.channel.ChannelOption;  
  6. import io.netty.channel.EventLoopGroup;  
  7. import io.netty.channel.nio.NioEventLoopGroup;  
  8. import io.netty.channel.socket.SocketChannel;  
  9. import io.netty.channel.socket.nio.NioServerSocketChannel;  
  10. public class Server {  
  11.     private int port;  
  12.     public Server(int port) {  
  13.         this.port = port;  
  14.     }  
  15.     public void run() throws Exception {  
  16.         EventLoopGroup bossGroup = new NioEventLoopGroup();  
  17.         EventLoopGroup workerGroup = new NioEventLoopGroup();  
  18.         try {  
  19.             ServerBootstrap b = new ServerBootstrap();  
  20.             b.group(bossGroup, workerGroup)  
  21.              .channel(NioServerSocketChannel.class)  
  22.              .option(ChannelOption.SO_BACKLOG, 1024)  
  23.              .childOption(ChannelOption.SO_KEEPALIVE, true)  
  24.              .childHandler(new ChannelInitializer() {  
  25.                  @Override  
  26.                  public void initChannel(SocketChannel ch) throws Exception {  
  27.                      ch.pipeline().addLast(new ServerHandler());  
  28.                  }  
  29.              });  
  30.             ChannelFuture f = b.bind(port).sync();  
  31.             System.out.println("服务器开启:"+port);  
  32.             f.channel().closeFuture().sync();  
  33.         } finally {  
  34.             workerGroup.shutdownGracefully();  
  35.             bossGroup.shutdownGracefully();  
  36.         }  
  37.     }  
  38.     public static void main(String[] args) throws Exception {  
  39.         int port;  
  40.         if (args.length > 0) {  
  41.             port = Integer.parseInt(args[0]);  
  42.         } else {  
  43.             port = 9090;  
  44.         }  
  45.         new Server(port).run();  
  46.     }  
  47. }  

    ServerHandler:

[java]  view plain  copy
 print ?
  1. package com.anxpp.io.calculator.netty;  
  2. import io.netty.buffer.ByteBuf;  
  3. import io.netty.buffer.Unpooled;  
  4. import io.netty.channel.ChannelHandlerContext;  
  5. import io.netty.channel.ChannelInboundHandlerAdapter;  
  6. import java.io.UnsupportedEncodingException;  
  7. import com.anxpp.io.utils.Calculator;  
  8. public class ServerHandler extends ChannelInboundHandlerAdapter {  
  9.     @Override  
  10.     public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException {  
  11.         ByteBuf in = (ByteBuf) msg;  
  12.         byte[] req = new byte[in.readableBytes()];  
  13.         in.readBytes(req);  
  14.         String body = new String(req,"utf-8");  
  15.         System.out.println("收到客户端消息:"+body);  
  16.         String calrResult = null;  
  17.         try{  
  18.             calrResult = Calculator.Instance.cal(body).toString();  
  19.         }catch(Exception e){  
  20.             calrResult = "错误的表达式:" + e.getMessage();  
  21.         }  
  22.         ctx.write(Unpooled.copiedBuffer(calrResult.getBytes()));  
  23.     }  
  24.     @Override  
  25.     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {  
  26.         ctx.flush();  
  27.     }  
  28.     /** 
  29.      * 异常处理 
  30.      */  
  31.     @Override  
  32.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {  
  33.         cause.printStackTrace();  
  34.         ctx.close();  
  35.     }  
  36. }  

2、客户端

    Client:

[java]  view plain  copy
 print ?

你可能感兴趣的:(http://blog.csdn.net/anxpp/article/details/52108238)