一、Netty執行流程和回撥機制實戰
阿新 • • 發佈:2018-12-10
netty的執行流程機制,我們先通過程式碼案例直接熟悉上手,後面然後拆開分別詳細深入剖析,及相關核心程式碼的原始碼解析;
我們使用gradle:
compile group: 'io.netty', name: 'netty-all', version: '4.1.29.Final'
package com.zhurong.netty.test1; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * Description: * User: zhurong * Date: 2018-09-19 21:20 */ public class TestServer { public static void main(String[] args) throws InterruptedException { //接收連線 EventLoopGroup bossGroup = new NioEventLoopGroup(); //連線傳送給work EventLoopGroup workerGroup = new NioEventLoopGroup(); try{ ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class). childHandler(new TestServerInitializer()); ChannelFuture channelFuture = serverBootstrap.bind(8899).sync(); channelFuture.channel().closeFuture().sync(); }catch (Exception e){ e.printStackTrace(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } }
package com.zhurong.netty.test1; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpServerCodec; /** * Description: * User: zhurong * Date: 2018-09-19 21:29 */ public class TestServerInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("httServerCodec",new HttpServerCodec()); pipeline.addLast("testHttpServerHandler",new TestHttpServerHandler()); } }
package com.zhurong.netty.test1; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.*; import io.netty.util.CharsetUtil; import java.net.URI; /** * Description: * User: zhurong * Date: 2018-09-19 21:33 */ public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { try{ if(msg instanceof HttpRequest){ System.out.println("開始執行成功"); HttpRequest httpRequest = (HttpRequest) msg; System.out.println("請求方法名:"+httpRequest.method().name()); URI uri = new URI(httpRequest.uri()); if("/favicon.ico".equals(uri.getPath())){ System.out.print("請求ico"); return; } ByteBuf content = Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content); response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes()); ctx.writeAndFlush(response); } }catch (Exception e){ e.printStackTrace(); } } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("channel channelActive"); super.channelActive(ctx); } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { System.out.println("channel channelRegistered"); super.channelRegistered(ctx); } @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { System.out.println("channel channelUnregistered"); super.channelUnregistered(ctx); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.out.println("channel channelInactive"); super.channelInactive(ctx); } @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println("channel handlerAdded"); super.handlerAdded(ctx); } }