標籤:netty
最近在學習netty相關知識,覺得《netty 權威指南》這本書還是挺好的,適合我這種初學者.加上netty本身內建的許多例子,學起來還是挺有興趣的.簡單記錄下,
一般伺服器代碼如下:
public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast( new ObjectEncoder(), new ObjectDecoder(ClassResolvers.cacheDisabled(null)), new ObjectEchoServerHandler(), new MyServerHandler()); } }); // Bind and start to accept incoming connections. b.bind(port).sync().channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
看過 《netty 權威指南》這本書, 下面的代碼應該比較容易懂,正如它的名字一樣,一個叫bossGroup(老闆),一個叫workerGroup(工人),bossGroup用於接受請求的線程組,workerGroup用於處理IO操作線程組,bossGroup收到請求之後叫workerGroup去處理,
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap 是一個啟動工具類,childHandler()方法用於往裡面加入處理channel的操作類,並初始化它們. ChannelPipeline用於鏈式管理內部的channel處理類.
b.bind(port).sync().channel().closeFuture().sync(); 這句話拆成下面兩句好理解點:
b.bind(port).sync() ; 線程同步阻塞等待伺服器綁定到指定連接埠,
...channel().closeFuture().sync() 成功綁定到連接埠之後,給channel增加一個 管道關閉的監聽器並同步阻塞,直到channel關閉,線程才會往下執行,結束進程。
netty 學習記錄一