`
384444165
  • 浏览: 259348 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入阅读Mina源码(3) —— Mina之IOAdapter(二)

阅读更多

(接:深入阅读Mina源码(3) —— Mina之IOAdapter(一))

 

4. AbstractPollingIoAcceptor

 

     这个类在org.apache.mina.core.polling,这个包一共有四个类,这个类就可以代表整个包的内容了,细致说一下,之后就不再深入介绍这个包了。从名字可以看出包里面的类主要完成轮询。

     AbstractPollingIoAcceptor主要完成了AbstractIoAcceptor定义的实际实现方法,如unbind0、bindInternal、dispose0,另外下方了一些更细致的accept、open、select、colse方法让子类实现,也清晰的可以看出它主要为Socket提供父类的一些实现,同时也有了NIO的影子。

     看一下AbstractPollingIoAcceptor的属性字段,可以看到

 

 

/** A lock used to protect the selector to be waked up before it's created */
    private final Semaphore lock = new Semaphore(1);

    private final IoProcessor<S> processor;

    private final boolean createdProcessor;

    private final Queue<AcceptorOperationFuture> registerQueue = new ConcurrentLinkedQueue<AcceptorOperationFuture>();

    private final Queue<AcceptorOperationFuture> cancelQueue = new ConcurrentLinkedQueue<AcceptorOperationFuture>();

    private final Map<SocketAddress, H> boundHandles = Collections.synchronizedMap(new HashMap<SocketAddress, H>());

    private final ServiceOperationFuture disposalFuture = new ServiceOperationFuture();

    /** A flag set when the acceptor has been created and initialized */
    private volatile boolean selectable;

    /** The thread responsible of accepting incoming requests */
    private AtomicReference<Acceptor> acceptorRef = new AtomicReference<Acceptor>();

    protected boolean reuseAddress = false;

    /**
     * Define the number of socket that can wait to be accepted. Default
     * to 50 (as in the SocketServer default).
     */
    protected int backlog = 50;
 

    这个类讲下去确实有种无从下手的感觉,这里注意一个acceptorRef是处理请求的AtomicReference类型的Acceptor,Acceptor是一个用于接收客户端请求,里面代码比较多,但是我感觉此部分是整个类比较关键的实现部分,需要仔细读一下,但是实在不太好讲,这里可以同样只关注整体,不关注细节,包括processor一些方法的内部完成。我只总结一个流程:

 

 

    主要的两个方法把父类中的注释写一下,方便理解,看了注释再看代码就比较容易想明白了:

 

    bindInternal:Starts the acceptor, and register the given addresses

    unbind0:Implement this method to perform the actual unbind operation.

 

 

5. NioSocketAcceptor

 

    终于,到这个最终的类了,我们也将要看到作为NIO部分我们最希望看到的一系列东西。看到导入的一堆java.nio.channels.*感觉好舒服,马上整个流程的谜底既要揭开了。代码非常少,更欣慰。

 

 

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);
}
 

 

    可以看到这里已经和Nio包内的方法对应起来了,实现的内容也相对比较简单是Nio包的一个事例一样。

    既然不复杂只是Nio包内的内容的话,我们就来看一下这一串流程是怎么运行下来的,也是NioSocketAcceptor能只是简单的利用Nio已有的功能实现Nio的Acceptor的原因。

 

    回顾一下实际使用的时候是调用的:acceptor.bind(new InetSocketAddress(SERVER_PORT)),指定服务提供绑定的端口。

    通过上面那么多的分析,我们知道了同时执行了AbstractPollingIoAcceptor中的bindInternal方法, 其中调用startupAcceptor(),因为是第一次,就负责初始化了内部线程类Acceptor。

    Acceptor主要负责轮询处理注册过连接事件的请求建立起连接,即整个监听的主线程,Acceptor会开一个Selector,用来监听NIO中的ACCEPT事件,调用NioSocketAcceptor中的open()方法来打开NIO的socketChannel(在AbstractPollingIoAcceptor的registerHandles方法调用,即前面图中的第二步,这里才真正的把Selector设为OP_ACCEPT)。

 

 

protected ServerSocketChannel open(SocketAddress localAddress) throws Exception {
        // Creates the listening ServerSocket
        ServerSocketChannel channel = ServerSocketChannel.open();

        boolean success = false;

        try {
            // 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);
            success = true;
        } finally {
            if (!success) {
                close(channel);
            }
        }
        return channel;
}
 

 

 

6. final

 

    感觉第一次阅读整个开源框架,还有些把握不住主线和方法,使得整个博文我看起来也有点杂乱无章的感觉,但希望有助于一步步看代码的嘶吼帮助下理解和把握整体逻辑吧。接下来几天还要考试,又要好哈复习了,抽了一晚上时间弄完了这部分代码,感觉两次看代码中间时间间隔太长是有很大影响了,还是应该连续的看一部。好了,不多说了,希望有帮助,复习去了,几天后继续阅读下一部分代码。

 

 

分享到:
评论

相关推荐

    apache-mina源码

    通过阅读和分析`apache-mina-2.0.16`的源码,我们可以深入理解MINA的设计思想,学习如何构建高效的网络服务,并能根据自己的需求定制和扩展MINA的功能。对于想要从事网络编程或系统架构设计的开发者来说,研究MINA...

    MINA源码与例子

    通过阅读源码,你可以深入了解MINA的设计思想和实现细节,例如如何实现非阻塞I/O、过滤器链的工作原理、以及如何自定义协议编码解码器等。 学习MINA源码可以帮助你: 1. **理解网络编程**:MINA是基于Java NIO实现...

    MINA源码分析,内涵类的讲解

    在这个“MINA源码分析,内涵类的讲解”中,我们将深入探讨MINA的核心组件和设计模式,以便更好地理解和利用这个强大的框架。 首先,我们需要了解MINA的基础架构。MINA的核心是`IoService`接口,它定义了服务端和...

    Mina源码解析

    在深入解析Mina源码的过程中,我们可以从以下几个关键知识点入手: 1. **Mina的过滤器机制实现**: Mina的核心设计理念之一是过滤器链(Filter Chain),它借鉴了Servlet的过滤器模型。每个过滤器都可以在数据传输...

    Mina2源码分析

    ### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...

    mina2.0源码svn地址

    ### mina2.0源码svn地址解析与详细介绍 #### 一、Mina2.0简介 Mina(Multi-threaded IO Network ...对于希望深入研究Mina2.0内部实现机制或者基于Mina2.0进行二次开发的朋友来说,这无疑是一笔宝贵的财富。

    mina 源码

    在分析"apache-mina-2.0.4"源码时,我们可以深入理解其设计理念、架构以及核心组件。 1. **MINA的设计理念** MINA的核心理念是异步非阻塞I/O,它利用Java NIO(New I/O)库来实现高效的网络通信。通过非阻塞I/O,...

    mina源码+例子mina-2.0.0-M6.zip

    2. **分析源码**:通过阅读MINA的源码,了解其内部处理流程,如读写事件的处理、过滤器链的工作方式等。 3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **...

    MINA 2.0.9源码

    通过阅读MINA 2.0.9的源码,你可以了解如何实现高效的网络通信,包括事件驱动的设计模式、多线程处理、数据包的拆分和组合,以及如何利用过滤器链实现复杂的功能。此外,源码分析还能帮助你掌握如何自定义Filter和...

    Mina 框架源码解析-构建简单通信程序

    本篇文章将深入解析Mina框架的源码,通过构建一个简单的心跳通信程序,来理解其核心机制。 首先,我们来看一下心跳通信的基本概念。在分布式系统中,心跳机制是保持连接状态和检测网络故障的重要手段。心跳包是周期...

    Mina 1.1.7 示例源码(apache.mina.example)

    在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含了一系列的示例项目,可以帮助开发者快速上手并深入理解Mina。 1. **Mina...

    mina新手教程源码 mina+springboot+idea最简单的案例。

    mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...

    Java mina2源码

    通过深入研究Mina2的源码,我们可以了解到如何优化网络通信性能,如何处理大规模并发连接,以及如何设计和实现自己的网络协议。源码分析还能帮助我们理解Java的多线程、并发控制和事件驱动编程等高级特性,提升我们...

    mina2 源码 mina

    对于有经验的开发者,深入源码可以提供对MINA内部机制的洞察,从而更好地优化和定制自己的网络服务。 总之,Apache MINA2是一个强大的网络应用框架,它的源码和实例是宝贵的教育资源,有助于提升Java网络编程能力,...

    JAVA mina 框架源码

    深入研究Mina源码,我们可以学习到以下关键知识点: 1. **事件驱动模型**:Mina基于事件驱动模型,当网络事件发生时,如数据到达或连接建立,会触发相应的事件处理器,使得程序响应及时高效。 2. **异步编程**:...

    mina框架源码及jar包

    在本压缩包"apache-mina-2.0.4"中,包含的是Mina框架的源码和jar包,这为开发者深入理解Mina的工作机制以及自定义功能提供了便利。 **Mina框架的核心概念:** 1. **I/O模型**:Mina基于NIO(Non-blocking I/O)...

    apache-mina-2.0.4.rar_apache mina_mina

    在深入研究Apache Mina的源码之前,了解其核心组件是必要的: 1. **Filter Chain**:Mina的核心设计模式之一是过滤器链。每个连接都有一系列过滤器,它们按照顺序处理入站和出站事件。过滤器可以实现特定功能,如...

    Mina 2.0快速入门与源码解析

    ### Mina 2.0快速入门与源码解析 #### Mina 2.0 快速入门 Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得...

    apache下的mina框架的源码

    通过阅读源码,你可以了解MINA如何实现这些功能,并学习如何自定义过滤器以满足特定需求。例如,你可以看到如何创建一个新的过滤器来实现数据压缩,或者如何实现一个自定义的协议解码器。此外,MINA的异步IO机制使得...

    Mina2.0框架源码剖析

    本文将对Mina2.0框架进行源码层面的剖析,以便深入理解其工作原理。 首先,让我们从`MinaTimeServer.java`这个示例代码开始。在这个例子中,我们看到一个简单的TCP服务器,它监听在特定端口上的连接,并处理来自...

Global site tag (gtag.js) - Google Analytics