从上一篇文章中知道,IoService出于MINA体系中的底层。IoService将会帮你维护网络交互,接受消息,发送消息,管理Sessions,管理连接Connections等等。

IoService  是一个接口,服务端的IoAcceptor和客户端的IoConnector均继承了该接口。下面我们将分为以下几个部分介绍IoService

1. IoService Introduction

2. IoService Details

3. IoAcceptor

4. IoConnector

IoService Introduction

IoService在MINA中提供了基本的I/O 服务并且管理I/O 会话。它是在MINA体系中最重要的模块之一,Ioservice的实现及子接口,大部分操作的是底层的I/O操作。

如上图,IoService有很多的职能:

1. sessions的管理: 创建和删除sessions, 检查session的空闲状态

2. 过滤连的管理: 管理过滤连,允许用户改变filter chain

3. 回调:当有消息抵达时调用IOHandler

4. 统计管理:统计更新消息的发送次数

5. 监听管理:Manages the Listeners a suer can set up

6. 传输管理: 处理服务端和客户端之间数据的传输

IoService接口提供了以下方法:

1. getTransportMetaData()--该方法返回IoAcceptor,IoConnector在运行时的元数据,包括运营商名称,连接的类型等

2. addListener()--该方法为IoService添加一个IoServiceListener来侦听指定的事件

3. removeListener()--该方法从IoService中移除指定的IoServiceListener

4. isDisposing()--该方法返回IoService是否正在停止

5. isDisposed()--该方法返回IoService是否已经停止

6. dispose()--该方法用于释放IoService分配的所有资源

7. getHandler()--获取该IoService所分配的IoHandler

8. setHandler()--返回分配给该IoService的IoHandler

9. getManagedSessions()--返回当前被IoService管理的所有Session的Map集合

10. getManagedSessionCount()--返回当前被IoService管理的所有Session的大小

11. getSessionConfig()--获取session的配置类

12. getFilterChainBuilder()--返回FilterChain Builder,用于向已创建的session中加入新的Filter

13. setFilterChainBuilder()--为IoService定义一个Filter Chain Builder

14. getFilterChain()--获取当前的Filter Chain

15. isActive()--返回IoService是否处于活动状态

16. getActivationTime()--返回IoServcie被激活的时间

17. broadcast()--将消息发送给所有被管理的Sessions

18. setSessionDataStructureFactory()--

19. getScheduledWriteBytes()--返回将要被发送的字节数

20. getScheduledWriteMessages()--返回将要被发送的消息数

21. getStatistics()--为IoService返回IoServiceStatistics对象

IoService Details

IoService被两个最重要的接口实现,分别是IoAcceptor, IoConnector。为了创建一个Server,需要实现IoAcceptor接口,为了创建一个Clinent,需要实现IoConnector接
口。

IoAcceptor

  该接口的命名由来是因其方法accept(),负责创建client和server之间的connection,服务端server接受connection请求。另外,我们可能命名这个接口为“Server”(在即将

到来的MINA3.0中)。
  
  实现该接口的类有:

 
1. NioSocketAcceptor:无阻塞(non-blocking)面向socket连接的IoAcceptor

  2. NIoDatagramAcceptor: 无阻塞(non-blocking) 面向udp连接的IoAcceptor

  3. AprSocketAcceptor:阻塞(blocking)socket连接的IoAcceptor,基于APR

  4. VmPipeSocketAcceptor:in-VM IoAcceptor

下图展示IoAcceptor继承关系图

1. creation:创建

    选择一个IoAcceptor类型,选择的依据是基于选择通讯的协议

public TcpServer() throws IOException {
// Create a TCP acceptor
IoAcceptor acceptor = new NioSocketAcceptor(); // Associate the acceptor to an IoHandler instance (your application)
acceptor.setHandler(this); // Bind : this will start the server...
acceptor.bind(new InetSocketAddress(PORT));

    System.out.println("Server started...");
}

2. disposal : 关闭

IoAcceptor可通过调用dispose()来停止,该服务将会在当所有的sessions都被处理后停止。
// Stop the service, waiting for the pending sessions to be inactive
acceptor.dispose();

同样你也可以通过传送一个参数true给dispose来实现等待所有线程正确执行完成后停止该service。

// Stop the service, waiting for the processing session to be properly completed
acceptor.dispose( true );

3. status:状态

你可通过调用一下方法获取IoAcceptor(IoService)的状态

1. isActive() -  当IoService能接收请求时返回true

2. isDisposing()- 如果dispose()方法被调用则返回true, 但并不表示IoService已经停止了(有可能有些sessions还在被处理)

3. isDisposed()  - 如果dispose(true)方法被调用并且执行的线程已经完成时则返回true

4. 管理IoHandler

当一个IoService(IoAcceptor)被实例化后,可增加或获取IoHandler。调用方法:setHandler(IoHandler) 或 getHandler()

5. 管理Filter Chain

如果想管理过滤器链,可通过调用方法getFilterChain():

// Add a logger filter
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());
如果想在将Filter Chain 在将它设置给IoService之前创建,可以通过以下方法实现:

// Add a logger filter
DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();
chain.addLast("logger", new LoggingFilter()); // And inject the created chain builder in the service
acceptor.setFilterChainBuilder(chain);

IoConnector

和我们必须实现IoAcceptor接口实现服务器一样,必须用IoConnector接口实现客户端。
实现该接口的类如下:
1. NioSocketConnector:无阻塞(no-blocking)面向socket连接的IoConnector

2. NIoDatagramConnector:无阻塞(no-blocking)面向Udp连接的IoConnector

3. AprSocketConnector:阻塞(blockiing)面向socket连接的IoConnector, 基于APR

4. ProxyConnector:支持代理的IoConnector

5. SerialConnector:支持串行传输的IoConnector

6. VmPipeConnector:in-VM IoConnector

下图为IoConnector 继承关系图

    
以上就是IoService部分内容,下一篇讲述IoSession。

MINA学习之IoService的更多相关文章

  1. 【MINA学习笔记】—— 1.体系结构分析[z]

    前言 Apache的MINA框架是一个早年非常流行的NIO框架,它出自于Netty之父Trustin Lee大神之手.虽然目前市场份额已经逐渐被Netty取代了,但是其作为NIO初学者入门学习框架是非 ...

  2. MINA学习汇总

    MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA ...

  3. mina学习

    长连接表示一旦建立了链接,就可以长时间的保持双方的通讯,例如: socket链接,推送平台. 短链接表示建立链接,完成数据的交换之后,就断开链接,例如: http链接. mina 框架是对socket ...

  4. mina学习(一)

    Mina:是一个帮助用户开发高性能和高伸缩性网络应用程序的框架 学习地址链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html ...

  5. Mina学习之---mina整体流程介绍

    现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...

  6. Mina学习之IoFilter

    IoFilter 是MINA中的一个核心结构,扮演了非常重要的角色.IoFilter在IoService和IoHandler过滤了所有的I/O 事件和请求.如果你有做个web项目的经验,则很类似于we ...

  7. MINA学习之体系介绍

    基于MINA应用程序结构图: 我们可以看出,MINA是应用程序(客户端或服务端)和底层基于TCP,UDP等通讯协议的网络层之间的粘合剂.而且各个模块之间是相互独立的,你只需要在MINA体 系基础上设计 ...

  8. mina学习总结

    一.简介: Apache Mina Server 是一个网络通信应用框架,Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步 IO 默认使用 ...

  9. NIO框架Mina学习

    前言: 找了篇文章看了看,nio框架数Mina用的最多! 代码: 服务端: package com.mina; import java.net.InetSocketAddress; import ja ...

随机推荐

  1. javaScript & jquery完美判断图片是否加载完毕

    好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...

  2. IOS多线程之NSThread

    参考:http://blog.csdn.net/totogo2010/article/details/8010231 1 简介 NSThread: 优点:NSThread 比其他两个轻量级 缺点:需要 ...

  3. 树莓派上搭建基于Python+web.py+fastcgi+lighttpd的网站

    最近在网上淘了一个树莓派,什么是树莓派?这里是他的官方网站你可以去看看. 简单的说就是一块使用了ARM11的CPU,具有256MB或512MB内存的具有两个USB接口,一个RJ45接口,HDMI输出和 ...

  4. HDU 1394 Minimum Inversion Number 线段树

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...

  5. bzoj2427: [HAOI2010]软件安装

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  6. 【原】jQuery编写插件

    分享一下编写设置和获取颜色的插件,首先我将插件的名字命名为jquery.color.js.该插件用来实现以下两个功能1.设置元素的颜色.2.获取元素的颜色. 先在搭建好如下编写插件的框架: ;(fun ...

  7. iOS开发 - NSBundle, NSDevice, NSLocale

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  8. java 资料收集

    java中线程队列BlockingQueue的用法 为什么jdk中把String类设计成final? 深入浅出单实例Singleton设计模式

  9. int 占一个机器字长

    int与short int是不一样的. C++标准规定,int占一个机器字长.在32位系统中int占32位,也就是4个字节, 而在老式的16位系统中,int占16位,即2个字节. 而C++标准中只限制 ...

  10. Chapter 32:动态规划一 总结

    今天做了四道dp题,分数306. 就从我的做题顺序开始讲.. 首先是第四题,明显的记录模数DP,很快打出来了. 后来做完之后回来拍第四题,也没有什么问题,就AC了. 然后是第三题,我的性子真是太急了, ...