Apache MINA (3) NioSocketAcceptor初始化

上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。

服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。
IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话。两个子接口为IoAcceptor和IoConnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。Hello World例子里面实现的是基于TCP/IP协议的通讯,用了mina默认的实现类NioSocketAcceptor和NioSocketConnector。

首先从服务端的NioSocketAcceptor开始:

1. NioSocketAcceptor的父类为AbstractPollingIoAcceptor,很多实现是在父类中实现的。在构造此类的时候,同时也构造了NioProcessor类

NioSocketAcceptor

Java代码

  1. public NioSocketAcceptor() {
            super(new DefaultSocketSessionConfig(), NioProcessor.class);
            ((DefaultSocketSessionConfig) getSessionConfig()).init(
    }
    AbstractPollingIoAcceptor

Java代码

  1. protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
                Class<? extends IoProcessor<S>> processorClass) {
            this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass),
                    true);
    }  

SimpleIoProcessorPool

Java代码

  1. private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
    ......
    public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType) {
            this(processorType, null, DEFAULT_SIZE);
    }

初始化NioProcessor,个数为cpu个数+1,为每个IoProcessor初始化一个默认的Excutor

this.executor = Executors.newCachedThreadPool();

初始化cpu+1个放到private final IoProcessor<S>[] pool 中,用来处理NioSession,所以S为NioSession

Java代码

  1. public final class NioProcessor extends AbstractPollingIoProcessor<NioSession>…

2. 初始化完SimpleIoProcessorPool,回到AbstractPollingIoAcceptor的构造方法中,调用NioSocketAcceptor中的init()方法打开selector通道,完成NioSocketAcceptor的构造。

3. 然后在上一篇Hello World的例子中设置了SocketSessionConfig的readBufferSize;

接收数据的过滤器,例子中设置的是TextLineCodecFactory(按照行一行为一个单位读取数据);

实现IoHandlerAdapter来处理客户的请求。

4. 最后执行acceptor.bind(new InetSocketAddress(SERVER_PORT)),指定服务提供绑定的端口,同时执行AbstractPollingIoAcceptor中的bindInternal方法,

调用startupAcceptor()负责初始化内部线程类Acceptor,Acceptor主要负责轮询处理注册过连接事件的请求建立起连接,即整个监听的主线程,Acceptor会开一个Selector,用来监听NIO中的ACCEPT事件,调用NioSocketAcceptor中的open()方法来打开NIO的socketChinal

Java代码

  1. ......
    ServerSocketChannel channel = ServerSocketChannel.open();
    ......  

然后配制socket的一些基本属性,并注册此事件是可连接的事件

Java代码

  1. // This is a non blocking socket channel
           channel.configureBlocking(false);  
    
           // Configure the server socket,
           ServerSocket socket = channel.socket();  
    
           // Set the reuseAddress flag accordingly with the setting
           socket.setReuseAddress(isReuseAddress());  
    
           // and bind.
           socket.bind(localAddress, getBacklog());  
    
           // Register the channel within the selector for ACCEPT event
           channel.register(selector, SelectionKey.OP_ACCEPT);  

当接收到请求时调用accept()方法法处理接收连接,把SocektChannel绑定到NioSession中

Java代码

  1. @Override
    protected NioSession accept(IoProcessor<NioSession> processor,
            ServerSocketChannel handle) throws Exception {  
    
        SelectionKey key = handle.keyFor(selector);  
    
        if ((key == null) || (!key.isValid()) || (!key.isAcceptable()) ) {
            return null;
        }  
    
        // accept the connection from the client
        SocketChannel ch = handle.accept();  
    
        if (ch == null) {
            return null;
        }  
    
        return new NioSocketSession(this, processor, ch);
    }   

5. 绑定完成后唤醒NIO的selector开始接收请求

Java代码

  1. selector.wakeup();   

小结:

通过解析 NioSocketAcceptor的构造方法,bind()等代码大概了解了mina服务端初始化相关的一些信息,同时涉及了mina框架相关的IoProcessor IoSession IoServiceListener 等,在下一篇文章中会再做进一步的分析接收到最终的处理请求的过程。

时间: 2024-10-30 12:47:01

Apache MINA (3) NioSocketAcceptor初始化的相关文章

Apache Mina通信框架架构与应用

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步 IO 默认使用的是 JAVA NIO 作为底层支持)操作的编程模型.从官网文档"MINA based Application Architecture"中可以看到Mina作为一

【APACHE MINA2.0开发之一】搭建APACHE MINA框架并实现SERVER与CLIENT端的简单消息传递!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/apache-mina/831.html Hibernate系列学习阶段到此结束了,那么紧接着进入Apache Mina的开发学习,很多童鞋在微薄和QQ中疑问Himi为什么突然脱离游戏开发了,嘿嘿,其实可能更多的童鞋已经看出来了,Himi在偏向服务器Server端开发了,Hibernate.MySQL等都是为了Server端Mina开发而做的

Apache Mina 2.x 超详实例

最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架. 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序:它提供了一个抽象的.事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/

Apache Mina使用手记(二)

Apache Mina使用手记(二) 分类: JAVA 2009-03-11 21:28 8707人阅读 评论(4) 收藏 举报 minaapachelog4jexceptionslf4jmicrosoft  Mina主要是作为服务器端底层框架来实现数据处理,它的实现很简单,如下例所示: package com.gftech.mytool.mina; import java.io.IOException; import java.net.InetSocketAddress; import jav

Apache Mina使用手记(三)

Apache Mina使用手记(三) 分类: JAVA 2009-03-13 20:10 12752人阅读 评论(0) 收藏 举报 minaapacheexceptionsessionlog4jslf4j 在上一篇中,通过一个简单的例子,得以管中窥豹,了解了Mina的基本编写方法.在MinaTimeServer演示程序中,我们添加了两个过滤器,一个是日志过滤器LoggingFilter,一个是文本编解码过滤器.前者实现日志信息的自动处理,后者实现对按行读写的文本数据的编码和解码. 其中Loggi

Apache Mina使用手记(四)

Apache Mina使用手记(四) 分类: JAVA 2009-03-13 20:46 13809人阅读 评论(19) 收藏 举报 minaapacheexceptionsessionstringbyte 上一篇中,我们介绍了如何在mina中编写自己的日志过滤器,这一篇我们自己实现一个编解器. 实际应用当,很多应用系统应用的都不是标准的web service或XML等,比如象中国移动/联通/电信的短信网关程序,都有自己不同的协议实现,并且都是基于TCP/IP的字节流.Mina自带的编解码器实现

Apache MINA (2) Hello World!

了解完Apach MINA的一些基本概念Apache MINA (1) 简介 ,开始进入MINA相关的代码学习,以一个简单HelloWorld程序开始,完成客户端与服务端之间的通讯. 准备工作: org.apache.mina 版本4.0 org.slf4j 1.6.1 (Simple Logging Facade for Java)mina所使用的日志框架,该版本是与mina4.0匹配的版本. 我是用maven管理项目依赖的,使用apache-maven-3.0.4 IDE:IntelliJ

使用 Apache MINA 2 开发网络应用

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.Apache MINA 2 可以作为开发网络应用程序的一个良好基础.下面将首先简单介绍一下 Apache MINA 2. Apache MINA 2 介绍 Apache MINA 是 Apache 基金会的一个开源项目,目前最新的版本是 2.0.0-RC1.本文中使用的版本是 2.0.0-M6.下面首

解决 Missing artifact org.apache.mina:mina-core:bundle:2.0.9

Maven 项目中引用了 MINA 的依赖,包如下错误: Missing artifact org.apache.mina:mina-core:bundle:2.0.9 依赖 项目引入的 MINA 依赖如下: <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>${version.mina}</ve