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