3 . 双向链表第 3 33 个元素 Handler 类型 : 其 Handler 是 HttpServerHandler 类型的对象, 也就是为 ChannelPipeline 添加的 HTTPServerHandler 业务逻辑处理器 ;
① 第 3 33 个元素 Handler 类型 : HttpServerHandler ;
② HTTPServerHandler 类结构 : 其中 HTTPServerHandler 继承 SimpleChannelInboundHandler<HttpObject> ;
public class HTTPServerHandler extends SimpleChannelInboundHandler\<HttpObject\>
③ 对应的向管道添加 HTTPServerHandler 处理器的代码 :
new ChannelInitializer<SocketChannel>() {// 创建通道初始化对象 @Override protected void initChannel(SocketChannel ch) throws Exception { // 该方法在服务器与客户端连接建立成功后会回调 // 获取管道 ChannelPipeline pipeline = ch.pipeline(); // 为管道加入 HTTP 协议的编解码器 HttpServerCodec, // codec 中的 co 是 coder 编码器的意思, dec 是 decoder 解码器的意思 // 第一个字符串是编解码器的名称 pipeline.addLast("HttpServerCodec" , new HttpServerCodec()); // 本次示例核心代码 --------------------------------------------- // 为管道 Pipeline 设置处理器 Hanedler pipeline.addLast("HTTPServerHandler", new HTTPServerHandler()); // 本次示例核心代码 --------------------------------------------- // 管道初始化完成 System.out.println("管道初始化完成!"); } }
4 . 双向链表第 4 44 个元素 : 第四个元素也是双向链表的结尾 , 类型是与链表头元素类型一致 , 是 DefaultChannelPipeline ;
① 第 4 44 个元素类型 : DefaultChannelPipeline ;
② next 为空 : 其 next 为空 , 说明该元素就是双向链表的结尾 ;
四、 数据入站与出站
1 . 双向链表对应的数据入站与出栈操作 :
① 链表中数据传递 : 在双向链表中 , 将数据按照两个方向进行传递 , 分别是入站和出站操作 ;
② 入站数据 : 从链表的表头 , 传递数据到链表尾部 , 将数据逐个 Handler 传递 , 每个链表元素中的 Handler 对数据都进行对应的处理 ;
③ 出站数据 : 从链表的尾部 , 向表头传递数据 , 经过每个 Handler 都对数据进行相应的处理 ;
以上面的代码示例为例进行解析
2 . 示例中的入站操作 :
① 初始化双向链表 : 客户端请求服务器端资源 , 客户端请求到来后 , 先初始化该 ChannelHandlerContext 双向链表 , 分别放入 ChannelInitializer , HttpServerCodec , HTTPServerHandler 三个 ChannelHandler 通道处理器 ;
② 数据解码 : 客户端请求数据 , 先传入 HttpServerCodec 服务器编解码器中进行处理 , 这里需要将数据解码 ;
③ 业务逻辑 : 然后将 HttpServerCodec 输出的数据 , 输入到用户自定义的 HTTPServerHandler 中进行处理 ;