入门1Netty(1):介绍框架闲话编程Contents入门 .................................................................................................... 1核心概念基本原理 ............................................................................................... 2与、是一个高性能的异步事件驱动的网络应用框架,本质上是对进行了高层的抽象,使得可以轻松的创建服务器和客户端,极大简化了诸如和套接字的操作。入门核心概念中的一些核心概念:Channel对应到EventLoop用来控制流、多线程处理以及并发ChannelFuture用来实现异步通知ECHO server最简单的例子是构建一个,发过来什么同样返回什么。首先需要实现一个,定义如何处理消息:public class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // handler需要去释放msg对象(引用计数) // 这里不用去手动release msg,因为writeAndFlush里面已经处理了 ctx.writeAndFlush(msg); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}然后利用ServiceBootStrap来启动public class EchoServer { private final int port; 基本原理2 public EchoServer(int port) { this.port = port; } public void run() throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new EchoServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = bootstrap.bind(port).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws InterruptedException { new EchoServer(9999).run(); }}基本原理EventLoop与Server Channel、Channel其运行原理如图:左边只有一个,代表服务器上监听某个端口的套接字,所以实际上也只需要一个就可以了右边代表建立的客户端连接,每一个连接都对应到一个,当有很多个连接的时候,这些连接是会共享其中的的。ChannelPipeline每次建立连接的时候,都会调用ChannelInitializer,这个类负责安装一些自定义的ChannelHandler到ChannelPipeline中。实际上的程序可能对应到多个入站 基本原理3和出站的,它们的执行顺序是由它们被添加的顺序所决定的,类似这样:ChannelHandler又有很多的类型,比如:编码器和解码器例如ByteToMessageDecoder、ProtobufEncoder等SimpleChannelInboundHandler<T>,用来处理简单的逻辑比如收到消息后完成业务逻辑,只需要实现其中的void channelRead0(ChannelHandlerContext ctx, I msg)方法即可Bootstrap前面使用ServerBootstrap类来启动了服务器上的监听,如果是客户端程序可以使用Bootstrap类来完成。一个比较明显的区别就是,客户端程序只需要一个EventLoopGroup而服务端通常会需要两个。