• Netty入门(三)之web服务器


    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    Netty入门(三)之web服务器

    阅读前请参考

    • Netty入门(一)之webSocket聊天室
    • Netty入门(二)之PC聊天室

    有了前两篇的使用基础,学习本文也很简单!只需要在前两文的基础上稍微改动即可!

    Maven依赖

    <!-- Netty -->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.22.Final</version>
    </dependency>
    

    一:启动类

    关于启动类,需要我们做的就是自定义端口以及继承ChannelInitializer类。

    /**
     * Netty服务器启动
     * Create by yster@foxmail.com 2018-05-04
     **/
    public class HttpServerStartup {
        public void startup() {
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workGroup = new NioEventLoopGroup();
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(bossGroup, workGroup);
                b.channel(NioServerSocketChannel.class);
                b.childHandler(new MyServerInitializer());    //继承重写类
                Channel ch = b.bind(8888).sync().channel();    //自定义端口
                ch.closeFuture().sync();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //优雅的退出程序
                bossGroup.shutdownGracefully();
                workGroup.shutdownGracefully();
            }
        }
    
    }  
    

    二:信道初始化

    /**
     * 信道初始化
     * Create by yster@foxmail.com 2018-05-04
    **/
    public class MyServerInitializer extends ChannelInitializer<SocketChannel> {
        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();  
            /** 
             * http-request解码器 
             * http服务器端对request解码 
             */  
            pipeline.addLast("decoder", new HttpRequestDecoder());  
            /** 
             * http-response解码器 
             * http服务器端对response编码 
             */  
            pipeline.addLast("encoder", new HttpResponseEncoder());  
            pipeline.addLast("deflater", new HttpContentCompressor());  
            pipeline.addLast("handler", new MyServerChannelHandler());  
        }
    }
    

    值得一提的是,上面信道的处理对post请求而言不太方便获取参数。

    三:绑定处理程序中的信道

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    /**
     * 绑定处理程序中的简单通道
     * Create by yster@foxmail.com 2018-05-04
     **/
    @Sharable
    public class MyServerChannelHandler extends SimpleChannelInboundHandler<HttpObject> {
    
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg){
            if (msg instanceof HttpRequest) {
               //request response都已经获取到!
               ByteBuf byteBuf = Unpooled.copiedBuffer("Hello".getBytes()); 
               DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,HttpResponseStatus.OK,byteBuf);
               ctx.channel().writeAndFlush(response);
            }
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            ctx.channel().close();
            cause.printStackTrace();
        }
    
    }
    

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

  • 相关阅读:
    Java实现 LeetCode 799 香槟塔 (暴力模拟)
    Java实现 LeetCode 799 香槟塔 (暴力模拟)
    ASP.NET中使用Entity Framework开发登陆注册Demo
    ASP.NET中使用Entity Framework开发登陆注册Demo
    ASP.NET中使用Entity Framework开发登陆注册Demo

    requirejs
    转一个网址,canvas用法
    这是个排序,摘的,记一下
    今天面前端哦 2015 08 27
  • 原文地址:https://www.cnblogs.com/onblog/p/13043560.html
Copyright © 2020-2023  润新知