分析Netty工作流程:
下面以Netty中Echo的例子进行流程跟踪,并简要的
服务器启动->客户端连接-> 服务器处理连接-> 服务器处理客户端数据<-> 客户端处理服务器数据
1:客户端连接:
我们直接看这行代码:
bootstrap.connect(new InetSocketAddress(host, port));
通过帮助类ClientBootstrap来连接服务器。
Debug源码进去发现最后是某个Channel类进行connect操作。
而这个Channel是如何来的呢?其实是从前面的 ChannelFactory和ChannelPipelineFactory得到的。
Channel.connect-> AbstractChannel.connect->Channels.connect(…);
Channels是Channel的帮助类,封装一些常用的操作。在封装操作时,基本都是触发事件。
这里发起一个connectd的Downstream的事件。
所有的事件都是丢给ChannelPipeline进行管理,ChannelPipeline使用了责任链模式来将事件传送给注册到Pipeline中的ChannelHandler,由ChannelHandler进行处理。如果遍历了所有的ChannelHandler后则交给ChannelSink进行处理,ChannelSink根据不同的事件进行不同的处理,对于connect事件,ChannelSink发送连接操作后则将该Channel注册到NioWorker中,以后的任何事件都通过NioWorker(封装selector的操作)来进行处理。
客户端连接的流程为:
ClientBootstrap.connect –>Channel.connect->
AbstractChannel.connect->Channels.connect(…) -> 发送connect事件-> ChannelSink->发起实际的连接操作->将Channel注册给Nioworker
2:服务器启动:
bootstrap.bind(…)-> 触发ServerSocketChannel.open()的事件
->捕捉open事件,channel.bind-> Channels.bind(…) -> 发起bind命令-> PipelineSink进行处理-> 使用socket进行bind,等待连接事件。
3: 服务器处理连接:
服务器启动后,NioServerSocketPipelineSink.Boss.run()在监听accept事件-> 捕捉到accept事件 -> 将NioWorker进行注册NioSocketChannel-> 向java.nio.SocketChannel注册op_read的监听。
4:客户端开始向服务器发送数据:
当客户端连接Server后,就会发起Connected的upstream事件->通过Pipeline进行处理-> SimpleChannelUpstreamHandler.handleUpstream()->EchoClientHandler.channelConnected()
5:服务器端接收并处理数据
接收数据:
NioWorker.run()->nioworker. processSelectedKeys()->Nioworker. Read()
将从SocketChannel读取的数据封装成ChannelBuffer ->发送upstream事件:fireMessageReceived(channel,buffer) –> 由注册到Pipeline中的Hanlder进行处理: EchoServerHandler. messageReceived(…)
发送数据:
e.getChannel().write(e.getMessage());->Channels.write()->
发起downstream事件-> NioServerSocketPipelineSink. handleAcceptedSocket()将向外写的事件放入Channel中,然后通过NioWorker.writeFromUserCode()进行发送。
6:客户端:客户端的流程和服务器端类似。
总结:
1: Netty将操作封装成事件,比如: 发起连接时,产生connect的downstream事件。连接完毕后,产生upstream的connect事件。
2:所有的事件都是放入Pipeline进行传送,传送的过程中可能被注册到pipeline中的Handler进行处理
3:在Pipeline传送完后,都必须都通ChannelSink进行处理。Sink默认处理了琐碎的操作,必须连接、读写等等。
4:Channels:几乎所有的操作都能在这里找到,当然Channels一般是发送事件
5:NioWorker: 处理IO事件的核心类,并承担了分发的责任。
分享到:
相关推荐
最适合入门的网络编程入门书,初学者必看
C++网络编程是计算机科学中的一个重要领域,它允许开发者创建能够通过网络进行通信的应用程序。这份"C++网络编程文档"涵盖了这一主题的广泛内容,旨在帮助程序员深入理解并掌握网络编程的基本概念和技术。 首先,...
《Linux网络编程》内容简介:Linux是目前最流行的开源操作系统,网络功能在Linux下占有核心的地位。《Linux网络编程》循序渐进地从应用层到Linux内核、从基本知识点到综合案例,向读者介绍如何在Linux下进行网络程序...
对于开发网游服务器的人开说,是本非常好的书,书中核心的学习部分还是SOCKET 套接口基本API相关的使用和注意细节,其他部分...网络游戏服务端编程其实针对网络底层所需要的技术点并不多,因此此书只需要针对性的学习。
java网络编程包括socket tcp/udp io/nio讲解 http协议 jdbc rmi java的安全框架等知识
好神奇的网盘 pan.baidu.com/s/14rAaUiTx_YQezyFle1MTqg?pwd=8fnd 提取码: 8fnd
网络编程111111111111
该资源是面向计算机网络编程的,利用套接字来进行处理的工程。
这本书是关于c#网络编程的,关于c#入门的书有很多,但是关于c#网络编程的并不多,很多教材中虽有涉及网络编程但都是泛泛而谈,很多理论概念掺杂在其中,让人很难理解,而这本不同,含有非常多的例子,从简到深,甚至...
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
WinSock网络编程经络 随书源码 本书专门讨论Windows网络编程技术。内容包括NetBIOS和Windows重定向器方法、Winsock方法、客户端远程访问服务器方法。
C/C++ 网络编程的基础知识,从 Socket 编程到高性能网络库的选择。首先,文章解释了 Socket 的基本概念及其在网络通信中的作用,包括 TCP 和 UDP 两种主要协议的区别和用法。接着,文章描述了 Socket 编程的典型工作...
linux网络编程 pdf # Linux网络编程基础 Linux网络编程是指在Linux操作系统上开发网络应用程序的过程。它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议...
网络编程课件,包括计算机网络基本知识点介绍 主要是windows socket编程技术
扫描版 超清百度网盘资源!!! 为初学者准备的网络编程! 韩国TCP/IP经典教程!... 本书针对网络编程初学者,面向具备C语言基础的套接字网络编程学习者,适合所有希望学习Linux和Windows网络编程的人。
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
unix 网络编程,带详细书签
linux网络编程
Windows 网络编程 概述 Windows 网络编程是指在 Windows 操作系统平台上进行网络编程的技术,涉及到 Windows Socket、网络协议、网络应用程序的开发等方面。 Windows 网络编程的主要目的是实现高性能的网络应用...
PyTorch生成对抗网络编程(畅销书《Python神经网络编程》作者最新力作!用PyTorch构建自己的生成对抗网络) by 塔里克·拉希德