一:概述
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