`

【源码学习】Mina笔记 (一)

阅读更多

        因最近准备了解Apache Vysper的源码,而vysper又依赖于Mina,所以又想重新看看mina。之所以说是重新看,是因为一两年前也有看过,不过也没做啥笔记,好些细节都忘记了,这次就边看边做笔记好了。

 

        Apache Vysper是Mina项目下的子项目,实现了大部分的XMPP协议(当前最新版本是0.7),而Mina是一个使用Java Nio来实现的高性能异步网络编程组件,自身基于事件驱动模型来开发。

 

        在Mina里面,最主要的就是NioSocketAcceptor,NioSocketConnector和NioProcessor,把握这几个类的实现就能从整体上把握mina的结构了。

        1) NioSocketAcceptor是用来编写服务器端程序的,它会间接创建一个实现了Runnable接口的Acceptor内部类,也会间接创建包含NioProcessor实例的处理池SimpleIoProcessorPool,接着由线程池调度Acceptor等待客户端的连接到来。当有客户端连接过来了,Acceptor开始处理,从SimpleIoProcessorPool中获取一个NioProcessor,开始和客户端进行真正的数据通讯。

        2) NioSocketConnector的原理和NioSocketAcceptor类似,但它是用来编写客户端程序的,它没有Acceptor,取而代之的是一个Connector内部类,当成功连接到服务器时,也会从处理池SimpleIoProcessorPool中分配一个NioProcessor来处理具体的数据通讯。

        3) 数据通讯方面,Mina有一个叫做filter chain的东西(主要看看DefaultIoFilterChain),读数据或写数据都会经过chain,以完成数据的编码和解码。

                a) 读取数据时,会从HeadFilter开始,经历中间的filter chain之后到达TailFilter,然后触发messageReceived方法来直接调用用户自定义的IoHandler。

                b) 写数据时会反过来,从TailFilter开始,经历中间的filter chain完成数据编码到达HeadFilter,把数据写到缓冲队列中,接着尝试唤醒selector,触发NioProcessor负责具体的数据(Write the pending requests)。

 

        大体的框架结构就是这样,nio和线程池是重点。当中还有好些巧妙的编码细节值得我去深入了解,后面再继续边看边写笔记吧~

 

        发布在 http://auzll.iteye.com

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics