netty是一个异步的,事件驱动的网络编程框架。html
netty是对Java NIO和Java线程池技术的封装java
使用Java IO进行网络编程,通常一个用户一个线程,没法处理海量用户
使用Java NIO进行网络编程,编程复杂性过高,若是没有深厚的NIO网络编程基础,写出的程序可能还不如Java IO写的程序
至于Java AIO,目前尚未弄清楚其与netty孰优孰劣react
netty架构是基于Reactor和责任链模式进行设计的。编程
关于reactor的原理,参考“【NIO系列】——之Reactor模型”
netty的reactor是多reactor多线程模型,其中reactor在netty中以eventloop的形式出现。bootstrap
netty经过popeline将handler组装起来,经过向pipeline里添加handler来监听处理发生的事件。api
// 用于监听客户端连接的eventloop池,通常只有一个eventloop NioEventLoopGroup 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(); }
// 用于处理与服务端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(); }
netty认为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:网络
handler分为处理入站事件的handler和出站事件的handler。经过实现相应的方法来监听相应的事件
netty也提供了一些adapter类来减小开发者的工做量。多线程
入站事件通常是由外部触发的,如收到数据。
基类为ChannelInboundHandler
出站事件由内部触发,如写数据
基类为ChannelOutboundHandler