Apache MINA (3) NioSocketAcceptor初始化

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。 服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来

上一篇博客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 等,在下一篇文章中会再做进一步的分析接收到最终的处理请求的过程。

相关文章
|
4月前
|
消息中间件 数据采集 编解码
apache mina
apache mina
43 0
|
12月前
|
网络协议 Java API
Apache Mina高性能通信框架研究邮件列表.
Apache Mina高性能通信框架研究邮件列表.
61 0
|
分布式计算 关系型数据库 MySQL
Apache Oozie -安装部署-配置文件修改 &amp; 数据库、war 包初始化|学习笔记
快速学习 Apache Oozie -安装部署-配置文件修改 &amp; 数据库、war 包初始化
Apache Oozie -安装部署-配置文件修改 &amp; 数据库、war 包初始化|学习笔记
|
Apache 编解码 网络协议
|
Java Apache 数据格式
Apache Mina使用手记(一)
Apache Mina使用手记(一) 分类: JAVA 2009-03-11 20:17 6069人阅读 评论...
1078 0
|
编解码 监控 Java
Apache Mina使用手记(二)
Apache Mina使用手记(二) 分类: JAVA 2009-03-11 21:28 8707人阅读 评论...
1303 0

热门文章

最新文章

推荐镜像

更多