netty学习总结(一)netty是什么?netty是一个异步的,事件驱动的网络编程框架。netty的技术基础netty是对Java NIO和Java线程池技术的封装netty解决了什么问题使用Java IO进行网络编程,一般一个用户一个线程,无法处理海量用户使用Java NIO进行网络编程,编程复杂性太高,如果没有深厚的NIO网络编程基础,写出的程序可能还不如Java IO写的程序至于Java AIO,目前还没有弄清楚其与netty孰优孰劣netty架构netty架构是基于Reactor和责任链模式进行设计的。reactor关于reactor的原理,参考“【NIO系列】——之Reactor模型”netty的reactor是多reactor多线程模型,其中reactor在netty中以eventloop的形式出现。责任链模式netty通过popeline将handler组装起来,通过向pipeline里添加handler来监听处理发生的事件。netty服务端编程模式// 用于监听客户端链接的eventloop池,一般只有一个eventloopNioEventLoopGroup bossGroup = new NioEventLoopGroup();// 用于处理客户端IO的eventloop池NioEventLoopGroup workGroup = new NioEventLoopGroup();// 辅助类,帮助初始化服务器ServerBootStrap bootstrap = new ServerBootStrap();bootstrap.group(bossGroup, workGroup) // bossGroup和workGroup可以是同一个 .channel(NioServerSocketChannel.class) // 设置服务端监听套接字的channel类型 .option(ChannelOption.SO_BACKLOG, 1024) // 设置监听套接字的参数 .handler(new LoggingHandler()) // 设置监听套接字的handler .childHandler(new ChannelInitializer<SocketChannel>(){ // 设置客户端套接字的handler public void initChannle(SocketChannel ch){ // 向pipleline中添加handler,用于处理客户端IO ch.pipeline().addLast(…); } });int port = 8080;try{ ChannelFuture f = bootstrap.bind(port).sync(); f.channel().closeFuture().sync();}catch(IOException e){ e.printStacktrac();}finally{ bossGroup.shutdownGracefully(); workGroup.shutdownGracefully();}netty客户端编程模型// 用于处理与服务端IO的eventloop池NioEventLoopGroup group = new NioEventLoopGroup();// 辅助类,帮助初始化客户端BootStrap bootstrap = new BootStrap();bootstrap.group(group) .channel(NioSocketChannel.class) // 设置客户端套接字的channel类型 .option(ChannelOption.NO_DELAY, true) // 设置客户端套接字的参数 .handler(new ChannelInitializer<SocketChannel>(){ // 设置客户端套接字的handler public void initChannel(SocketChannel ch){ // 向pipleline中添加handler,用于处理客户端IO ch.pipeline().addLast(…); } });String host = “127.0.0.1”;int port = 8080;try{ ChannelFuture f = bootstrap.connect(host, port).sync(); f.channel().closeFuture().sync();}catch(IOException e){ e.printStacktrac();}finally{ group.shutdownGracefully();}buffernetty认为Java NIO的Buffer太难用了,因此自己实现了一套Buffer。相比于Java NIO的netty的buffer不仅易用,而且还支持自动扩容。netty的buffer可以抽象为三个指针readIndex, writeIndex, limit.读buffer增加readIndex,写buffer会增加writeIndex,如果写的数据量超过limit,则会增加buffer容量。netty buffer也支持随机读写netty中buffer一般通过Unpooled工具类创建,有三大类buffer:在JVM堆上分配的buffer。优点是分配快速,易于回收,缺点是最终还是要将数据复制到直接缓存中直接缓冲区,直接通过系统调用malloc分配的内存,优点是减少数据移动,缺点是分配慢,回收麻烦组合缓冲区,即将不同种类的buffer进行封装,访问时就像访问一个buffer,可以通过这个方式对缓冲区进行划分,但是会增加访问时间handlerhandler分为处理入站事件的handler和出站事件的handler。通过实现相应的方法来监听相应的事件netty也提供了一些adapter类来减少开发者的工作量。入站handler入站事件一般是由外部触发的,如收到数据。基类为ChannelInboundHandler出栈handler出站事件由内部触发,如写数据基类为ChannelOutboundHandler