博客
关于我
Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
阅读量:791 次
发布时间:2023-02-15

本文共 1238 字,大约阅读时间需要 4 分钟。

数据流编程是一种编程范式,其核心特征包括无穷数据源和数据流向的特性。无穷数据源意味着我们无法预估需要处理的数据量,也无法确定数据何时会产生。而数据流向则强调了数据传递的有序性。这些特性使得数据流编程在处理实时系统和高并发场景中尤为重要。

在网络编程中,客户端与服务器之间的数据传递通常需要通过三次握手建立传输通道,并绑定特定的端口进行数据传输。传统的做法是频繁地建立和销毁连接,这种方式在高并发场景下效率较低。为此,开发了长连接的方式来减少连接的建立频率,而Channel接口正是用来实现这一目标的。

Netty框架自定义了自己的Channel接口,称为ChannelPipeline,旨在更好地与其框架集成。ChannelPipeline充当了一个功能聚合的操作对象,统一管理网络IO操作,包括读写、连接管理等功能。

JDK中的NIO类库提供了两种Channel实现:SocketChannel和ServerSocketChannel。前者用于客户端,后者用于服务器端。Channel接口本身是一个SPI接口,通过继承和实现具体的功能类来扩展其功能。

为了提高效率,Channel内部引入了Unsafe接口,它专门用于处理网络读写操作。Unsafe类是一个内部接口,主要由Channel的读写线程使用,不应由用户代码直接调用。它的名字"Unsafe"反映了其潜在的并发操作特性。

Channel注册到EventLoop的多路复用器时,需要确保线程安全。通过判断当前线程是否是EventLoop线程,避免并发操作问题。若当前线程属于EventLoop线程,直接执行注册逻辑;否则,将Channel作为Runnable丢入EventLoop线程池任务队列中等待处理。

Channel的绑定操作(bind)用于将Channel绑定到对应的Socket。对于服务端,是绑定监听端口;对于客户端,是指定本地绑定Socket地址。写操作(write)则负责将消息添加到ChannelOutboundBuffer中,并通过flush方法将消息写入Channel。

ChannelPipeline作为ChannelHandler的容器,负责事件的分发和预处理。通过责任链模式,ChannelHandler可以对IO事件进行拦截和处理。消息在ChannelPipeline中从HeadHandler开始,依次传递到各个ChannelHandler,任何Handler都可以中断消息的传递。

ChannelPipeline的核心作用是将网络IO事件转化为应用逻辑处理事件。通过EventDriven方式,避免了监听者列表过长带来的性能问题。这种方式不仅效率高,还支持灵活的事件拦截。

总的来说,Channel和ChannelPipeline是Netty框架中核心的网络操作抽象类和事件驱动机制。通过ChannelPipeline实现了网络IO事件的处理和应用逻辑的耦合,使得开发更加高效和灵活。

转载地址:http://utcfk.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0065---WebSocket长连接开发4
查看>>
Netty工作笔记0066---Netty核心模块内容梳理
查看>>
Vue基本使用---vue工作笔记0002
查看>>
Netty工作笔记0068---Protobuf机制简述
查看>>
Netty工作笔记0069---Protobuf使用案例
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0071---Protobuf传输多种类型
查看>>
Netty工作笔记0072---Protobuf内容小结
查看>>
Netty工作笔记0073---Neety的出站和入站机制
查看>>
Netty工作笔记0074---handler链调用机制实例1
查看>>
Netty工作笔记0075---handler链调用机制实例1
查看>>
Netty工作笔记0076---handler链调用机制实例3
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0078---Netty其他常用编解码器
查看>>
Netty工作笔记0079---Log4j整合到Netty
查看>>
Netty工作笔记0080---编解码器和处理器链梳理
查看>>
Netty工作笔记0081---编解码器和处理器链梳理
查看>>
Netty工作笔记0082---TCP粘包拆包实例演示
查看>>
Netty工作笔记0083---通过自定义协议解决粘包拆包问题1
查看>>