Netty网络编程七:Netty之Http协议栈开发详解

一:概述

http协议是属于应用层的一个协议,是目前使用最多的通过浏览器可直接交互的一个协议,但是其存在一些缺点比如同步阻塞,以及每次请求需要一个线程处理,非常消耗线程资源。
而Netty的Http协议栈,是基于Netty进行开发的,所以会有Netty的特点它是异步非阻塞的,所以在性能上也会有提升。

二:案例

看之前写的另一篇博客:
https://blog.csdn.net/qq_22871607/article/details/79286688

主要注意点:

public void start(){
        // boss 是处理客户端连接的线程池
        // worker 是处理从客户端连接转发过来的IO数据的读写线程池
        NioEventLoopGroup boss = new NioEventLoopGroup();
        NioEventLoopGroup worker = new NioEventLoopGroup();
        try{
            // ServerBootstrap 对外一个便利创建服务端,Builder建造者设计模式
            ServerBootstrap sb = new ServerBootstrap();
            // 绑定线程池
            sb.group(boss,worker)
                    // 绑定channel 服务端绑定NioServerSocketChannel,此实现jdk的ServerSocketChannel
                    .channel(NioServerSocketChannel.class)
                    // 绑定服务端相关参数,可添加绑定多个参数
                    .option(ChannelOption.SO_BACKLOG, 1024) //指定此套接口排队的最大连接个数
                    // IO事件处理类,主要处理IO事件的读写
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            // req
                            pipeline.addLast(new HttpRequestDecoder());
                            // 将多个消息转换为单一的FullHttpRequest或者FullHttpResponse,原因是HTTP解码器在每个HTTP消息中生成多个消息对象
                            pipeline.addLast(new HttpObjectAggregator(65535));
                            pipeline.addLast(new HttpResponseEncoder());
                            // 支持异步发送大的码流(例如文件传输),但不占用过多的内存,防止内存溢出
                            pipeline.addLast(new ChunkedWriteHandler());
                            pipeline.addLast(new NettyHttpServerHandler());

                        }
                    });
            // 绑定端口,同步等待成功
            ChannelFuture cf = sb.bind(port).sync();
            System.out.println("服务已启动.................监听端口:" + port);
            // 等待服务器监听端口关闭
            cf.channel().closeFuture().sync();
        }catch (Exception e){
            // 优雅关闭线程资源
            boss.shutdownGracefully();
            worker.shutdownGracefully();
        }
    }

流程是:
1、对传送过来的请求解码为http请求,通过netty定义的解码器HttpRequestDecoder进行解码
2、通过HttpObjectAggregator,将多个消息转换为单一的FullHttpRequest或者FullHttpResponse,原因是HTTP解码器在每个HTTP消息中生成多个消息对象
3、通过HttpResponseEncoder消息编码器将返回即响应客户端的消息转为 http的响应方式
4、如果是进行大文件传输,可以通过ChunkedWriteHandler支持异步发送大的码流(例如文件传输),但不占用过多的内存,防止内存溢出
5、最后通过自定义handler来处理 http请求

文章中案例代码:https://download.csdn.net/download/qq_22871607/11072379

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值