您的位置:首页 > 编程语言

从代码实现角度来分析mina

2012-05-07 16:49 363 查看
       前段时间因为工作中用到了mina,最近几天有些闲下来了,所以认真的研究了下mina的实现,主要针对的是TCP/IP通讯的场景。

mina基于java nio的select多路复用的机制,其底层实现linux下对应epoll,windows下对应iocp。

      典型服务端实现过程:

1.创建acceptor对象NioSocketAcceptor,这个实例持有包含了大小为CPU核数+1 的 NioProcessor数组 的SimpleIoProcessorPool 。默认的newCachedExecutor线程池,打开已个选择器Selector。对应的serverSocketChannel向选择器注册,监听网络连接事件。

2. 这个SimpleIoProcessorPool创建一个默认的newCachedExecutor线程池,数组中的所有Processor实例共享这个线程池。

3.通过acceptor.bind()函数,由线程池执行异步任务。该任务循环的堵塞在selector.select()方法中。

4.当有客户端连接的时候。select()返回,接受连接,创建NioSession对象,session持有acceptor,processor,socketChannel,SelectedKey等所有相关对象的引用。

     session的属性SimpleIoProcessorPool从中轮询取出一个NioProcessor,把它放到session的attributes中,同时这个NioProcessor会将这个session也保存到自己的

    newSessions队列中(queue)。执行异步任务processor的selector.select();NioProcessor在构造以及init()的时候分别创建选择器,以及将session的scoketChannel向该选择器注册OP_READ事件。将acceptor设置的一堆filter加入到session的IoFilterChain中。将这个session加入到processor的managedSession中,并执行session的IoFilterChain的

sessionCreated和sessionOpened函数。当有读写事件的时候,select()返回,分别调用filterChain的messageReceived()和messageSent();

以上是mina工作流程的一点总结,下次争取写的更详细些。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息