详解即时通讯开发框架Netty 4.x之Channel和Pipeline
Channel概念与java.nio.channel概念一致,用以连接IO设备(socket、文件等)的纽带。Netty 4.x之后的Channel变化较大,官方的唬人的说法是无法通过简单的关键字替换进行迁移。用得较多应该是:ChannelHandler接口重新设计,换了个较为清晰的名字;write不会主动flush。由于笔者3.x、4.x都没用过,所以也无法深入理解版本的变化了。
Channel的IO类型主要有两种:非阻塞IO(NIO)以及阻塞IO(OIO);数据传输类型有两种:按事件消息传递(Message)以及按字节传递(Byte);适用方类型也有两种:服务器(ServerSocket)以及客户端(Socket)。还有一些根据传输协议而制定的的Channel,如:UDT、SCTP等。
Netty按照类型逐层设计相应的类。最底层的为抽象类AbstractChannel,再以此根据IO类型、数据传输类型、适用方类型实现。类图可以一目了然,
Netty的Channel Pipeline实现原理分析
从AbstractChannel分析,它提供了一些IO操作方法,read、write等,Channel仅仅做了一个封装,方法中将参数直接传递给了Channel的Pipeline成员的相应方法。
Pipeline则是Channel里面非常重要的概念。从数据结构的角度,它是一个双向链表,每个节点均是DefaultChannelHandlerContext对象;从逻辑的角度,它则是netty的逻辑处理链,每个节点均包含一个逻辑处理器(ChannelHandler),用以实现网络通信的编/解码、处理等功能。
Pipeline的链表上有两种handler,Inbound Handler和Outbound handler。从Netty内部IO线程接读到IO数据,依次经过N个Handler到达最内部的逻辑处理单元,这种称之为Inbound Handler;从Channel发出IO请求,依次经过M个Handler到达Netty内部IO线程,这种称之为Outbound Handler。内部代码实现流程则是:Head -> Tail (Inbound),Tail -> Head (Outbound)。
逻辑处理器ChannelHandlerInvoker介绍
ChannelPipeline仅仅只是逻辑处理的流程,真正逻辑处理器则是ChannelHandlerInvoker。在获得链表节点后,节点会调用自己的invoker成员执行(invoke)逻辑。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询
public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
DefaultChannelHandlerContext next = findContextOutbound();
next.invoker.invokeWriteAndFlush(next, msg, promise);
return promise;
}
在DefaultChannelHandlerInvoker中只有一个成员(executor),执行逻辑的过程中,Invoker会先判断当前运行线程是否是executor,如果是则直接运行相应方法,不是则启动子线程运行相应方法。
executor继承自EventExecutor,同时,该对象实现类一般而言也是实现EventLoop接口。EventLoop的实现体现了Netty 4.x的IO线程模型,非常重要,后面再详细解析。
至此,上面简单总结了Channel以及Pipeline的处理流程。Channel.write -> ChannelPipeline.write -> ChannelHandlerContext.write -> ChannelHandlerInvoker.write -> ChannelHandler.write。在这个过程中,我也是捡简单的、流程性的代码总结,像EventLoop、EventExecutor这种核心部分并没有深入总结,压后再详细解说。
qq_16887631: 前两天才集成了GoEasy提供的Android websocket sdk,简单好用
起嘛名啊: 对于带外公开访问,无需用户登录的网站,345用不了吧
CSDN-Ada助手: 非常感谢您分享这篇关于私有化部署的博客,这对政企单位来说确实具有很大的意义。我们鼓励您继续深入探讨相关技术,为更多人提供好的解决方案。我们建议您写一篇“基于Docker的容器化部署在企业级应用中的实践”,讲解如何在实际应用中使用Docker进行容器化部署,加速项目的交付和迭代。期待您的精彩分享! 2023年博客之星「城市赛道」年中评选已开启(https://activity.csdn.net/creatActivity?id=10470&utm_source=blog_comment_city ), 博主的原力值在所在城市已经名列前茅,持续创作就有机会成为所在城市的 TOP1 博主(https://bbs.csdn.net/forums/blogstar2023?typeId=3152981&utm_source=blog_comment_city),更有丰厚奖品等你来拿~。
故渊at: “客户根据http协议书浏览网址时,电脑浏览器和集群服务器是密文传送。”http是明文传输吧?
Passerby_Wang: 写得也太详细了吧,学到了好多 也欢迎博主来我这里指点一二呀