Netty是Java的一種能提供異步事件驅動網絡編程框架,Netty提供了簡潔強大的API,能極大提升開發穩定可靠網絡服務器和客戶端程序的效率。java
以建立一個服務端舉例說明編程
public class TimeServer { public void bind(int port) throws Exception { // 1.配置服務端的NIO線程組 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); //2.配置參數 b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChildChannelHandler()); // 3.綁定端口,同步等待成功 ChannelFuture f = b.bind(port).sync(); //4. 等待服務端關閉 f.channel().closeFuture().sync(); } finally { //5.優雅退出,釋放線程池資源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } private class ChildChannelHandler extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel arg0) throws Exception { arg0.pipeline().addLast(new TimeServerHandler()); } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { int port = 8080; if (args != null && args.length > 0) { try { port = Integer.valueOf(args[0]); } catch (NumberFormatException e) { // 採用默認值 } } new TimeServer().bind(port); } }
從上面的代碼例子來看啓動服務端有5個步驟服務器
Netty網絡框架目前普遍的應用在各個領域中,那麼爲何不用Java原生的NIO來開發呢。具體緣由以下:網絡
Netty的客戶端就是單線程的NIO模型這裏就不討論,Netty的服務端的線程模型以下多線程
如上圖AcceptorSelector線程的職責就是輪詢客戶端鏈接事件,若是輪詢到客戶端鏈接,將鏈接後的IO操做委託給IOSelector線程池操做。框架
Netty同時支持Reactor的單線程、多線程和主從多線程模型可經過配置線程個數和是否共享線程來實現。異步
Netty官方demo推薦使用主從多線程模型,試想若是IOSelector和AcceptorSelector使用同一個Selector來輪詢,若是單個Selector處理大量的客戶端的Acceptor和IO事件,出現某個操做很是損耗性能,將直接拖垮整個系統的Acceptor和IO事件處理能力。ide