您现在的位置:主页 > 高级应用 > >

mina2.0.9教程之IoService接口



时间: 2015-06-18 10:08     来源 : cnicys      点击:

关键词: mina    mina教程    mina实例   


目录页:《mina2.0.9教程


IoService是创建服务的顶层接口,无论服务端还是客户端,都是从它继承实现的。在进入该篇前,建议先看下mina的架构流程图

本文来自www.itxxz.com



IoService提供了最基础的I/O 服务及I/O session的管理,在整个mina架构中地位举足轻重。

下面我们通过一张思维导图来看下IoService的作用:




主要作用

1、session 管理 : 创建、删除session、监测session 是否失效 copyright www.itxxz.com

2、过滤器链管理 :管理过滤器连,并且用户可以很方便的自定义创建过滤器 copyright www.itxxz.com

3、调用业务handler:在消息接收完成之后,调用业务handler进行处理 itxxz.com

4、统计管理: 统计消息发送量(发送对象、字节....) 本文来自www.itxxz.com

5、监听网络连接:一直监听绑定端口是否有新的链接

内容来自www.itxxz.com

6、数据传输: 管理 server端和 client 数据传输

itxxz.com

IoService 是 IoConnector's 和 IoAcceptor's  的父接口,他所定义的方法都是和I/O操作息息相关的,下面看下IoService定义了哪些方法,这些方法有些什么功能 内容来自www.itxxz.com




IoService定义的方法


TransportMetadata 官网:http://www.itxxz.com 
getTransportMetadata() 

本文来自www.itxxz.com

这个方法获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、apr 等。
 

itxxz.com

void

copyright www.itxxz.com

addListener(IoServiceListener listener) copyright www.itxxz.com

这个方法可以为IoService 增加一个监听器,用于监听IoService 的创建、活动、失效、空闲、销毁,具体可以参考IoServiceListener 接口中的方法,这为你参与IoService 的生命周期提供了机会。
 

itxxz.com

void IT学习者(www.itxxz.com)

removeListener(IoServiceListener listener)

itxxz.com

这个方法用于移除addListener的方法添加的监听器。
 

内容来自www.itxxz.com

boolean 官网:http://www.itxxz.com

isDisposing()

IT学习者(www.itxxz.com)

返回 isDisposed() 的状态,当且仅当 isDisposed() 方法被调用完毕才返回TRUE
 

IT学习者(www.itxxz.com)

boolean 官网:http://www.itxxz.com

isDisposed()

本文来自www.itxxz.com

返回service的状态,当且仅当service 的当前进程的所有资源已经释放完毕才返回 TRUE
  itxxz.com

void

本文来自www.itxxz.com

dispose()

copyright www.itxxz.com

这个方法用于释放service分配的资源,他可能要花费一些时间,用户应该调用 isDisposing() 和 isDisposed() 判断资源是否释放完成,当一个service被关闭的时候都应该调用该方法来进行资源释放
 

copyright www.itxxz.com

IoHandler

copyright www.itxxz.com

getHandler()

本文来自www.itxxz.com

返回当前进程serbice关联的handler

copyright www.itxxz.com

void IT学习者(www.itxxz.com)

setHandler(IoHandler handler) 内容来自www.itxxz.com

这个方法用于向IoService 注册IoHandler,同时有getHandler()方法获取Handler
 

内容来自www.itxxz.com

Map<Long,IoSession> 内容来自www.itxxz.com

getManagedSessions() itxxz.com

这个方法获取IoService 上管理的所有IoSession,Map 的key 是IoSession 的id。
  本文来自www.itxxz.com

int itxxz.com

getManagedSessionCount()

IT学习者(www.itxxz.com)

返回当前service 上绑定的session数量
  itxxz.com

IoSessionConfig

官网:http://www.itxxz.com

getSessionConfig()

内容来自www.itxxz.com

这个方法用于获取IoSession 的配置对象,通过IoSessionConfig 对象可以设置Socket 连接的一些选项。
  本文来自www.itxxz.com

 

IoFilterChainBuilder

本文来自www.itxxz.com

getFilterChainBuilder() 内容来自www.itxxz.com

返回当前service的拦截器连,用户可以在改链上添加自己的过滤器,在service绑定之前
 

IT学习者(www.itxxz.com)

void itxxz.com

setFilterChainBuilder(IoFilterChainBuilder builder) itxxz.com

定义service的拦截器链

内容来自www.itxxz.com

DefaultIoFilterChainBuilder

官网:http://www.itxxz.com

getFilterChain() itxxz.com

返回当前service默认的那个filterchain,是getFilterChainBuilder() 快捷方式
 

copyright www.itxxz.com

boolean 内容来自www.itxxz.com

isActive() IT学习者(www.itxxz.com)

当前service是否在活动
  IT学习者(www.itxxz.com)

long

IT学习者(www.itxxz.com)

getActivationTime() copyright www.itxxz.com

返回这个service 被激活现在的时间,也就是service存活了多久.  如果这个service 不是活动状态咋返回它最好一次活动的时间
 

itxxz.com

Set<WriteFuture> 本文来自www.itxxz.com

broadcast(Object message) 官网:http://www.itxxz.com

向所有注册了的session 广播消息
 

itxxz.com

 

void IT学习者(www.itxxz.com)

setSessionDataStructureFactory(IoSessionDataStructureFactory sessionDataStructureFactory) 官网:http://www.itxxz.com

   

 向新注册的service 放一些初始化的数据
 

本文来自www.itxxz.com

int

本文来自www.itxxz.com

getScheduledWriteMessages()

内容来自www.itxxz.com

返回信息数量 (这里的信息时在内存等待socket向外写的)
  itxxz.com

IoServiceStatistics

copyright www.itxxz.com

getStatistics()

内容来自www.itxxz.com

返回service的 IoServiceStatistics 对象.

IT学习者(www.itxxz.com)

 

本文来自www.itxxz.com

IoService的实现

IoService 在mina中时一个很重要的接口,同时呢它又被两个接口所继承,分别是 IoAcceptor 和 IoConnector,分别代表了 服务端和客户端的连接,所有我们在建立server和client的时候必须要实现两个接口或者是继承他们的实现类或适配器类 copyright www.itxxz.com

IoAcceptor
 

copyright www.itxxz.com

  主要负责在server和client之间建立一个新的连接或者是接收client发送的请求,据说在mina3.0 中会将这个接口命名为 Server。有时候我们可能不是基于某一种协议开发我们的应用,可能会用到多种协议开发(TCP/UDP...),那么这时候mina就为我们提供了很多其他的一些实现,用于不用的需求 本文来自www.itxxz.com

IoAcceptor 有如下几个实现类 官网:http://www.itxxz.com

  NioSocketAcceptor :     非阻塞的server端的Socket 内容来自www.itxxz.com

  NioDatagramAcceptor: 非阻塞的server端的Socket  (基于UDP协议)

官网:http://www.itxxz.com

  AprScoketAcceptor  : 基于APR阻塞式的socket itxxz.com

  VmPipeScoketAcceptor  :基于管道的Socket

官网:http://www.itxxz.com


下面来具体看下他们的类关系图


IoConnector

官网:http://www.itxxz.com

  IoConnector 是用于client端的一些方法定义,在写client端的时候必须实现改接口或者其实现类 内容来自www.itxxz.com

同样mina也为我们提供了默认实现类(想见mina api文档): IT学习者(www.itxxz.com)

  NioScoketConnector : 非阻塞的client端的Socket 内容来自www.itxxz.com

  NioDatagramConnector: 基于UDP协议 非阻塞的client端的Socket copyright www.itxxz.com

  AprScoketConnector :基于Apr的scoket itxxz.com

  ProxyConnector :提供代理的scoket

copyright www.itxxz.com

  SerialScoket : 提供多个端口连接的scoket

copyright www.itxxz.com

  VmPipeConnector:基于管道的socket
 

copyright www.itxxz.com

类关系图



官网:http://www.itxxz.com


IoAcceptor 创建服务端
  官网:http://www.itxxz.com

 首先在server端的时候要尽早的确立自己用哪种方式进行创建,基于那种协议进行开发,这样可以开始建立server了

IT学习者(www.itxxz.com)

(1) 建立server
  IT学习者(www.itxxz.com)

  1. public TcpServer() throws IOException {  
  2.     // 创建一个 TCP acceptor  
  3.     IoAcceptor acceptor = new NioSocketAcceptor();  
  4.   
  5.     // 为这个 accerptor 绑定一个用于业务处理的Hanlder实例

 

copyright www.itxxz.com

  1. acceptor.setHandler(this);  
  2. // 绑定一个端口用于监听client 请求
本文来自www.itxxz.com

  1. acceptor.bind(new InetSocketAddress(PORT));  

如果使用的是UDP协议你可以这样

官网:http://www.itxxz.com


 
本文来自www.itxxz.com

  1. IoAcceptor acceptor = new NioDatagramAcceptor();  

本文来自www.itxxz.com

(2)关闭连接 copyright www.itxxz.com

通过调用dispose() 方法来释放资源( 只为所有挂起的session处理完毕之后就释放资源)
 

本文来自www.itxxz.com

  1. acceptor.dispose();  // 已经标注为过期的  

内容来自www.itxxz.com


通过调用dispose(true)方法释放资源(等待每隔个线程上的session都完整的执行完毕之后才进行资源释放)
  IT学习者(www.itxxz.com)

  1. acceptor.dispose( true ) // 推荐使用这种方法  

(3) IoService 状态

itxxz.com

可通过 isActive()、isDisposed()、isDisposing() 来获取IoService的状态
  官网:http://www.itxxz.com

(4)绑定业务操作的hanlder 本文来自www.itxxz.com

在接收完client传送过来的数据之后,可以用sethandler() 这个方法绑定了的业务类进行操作
 

内容来自www.itxxz.com

(5)过滤器

itxxz.com

可以获取一些mina提供的默认的过滤器,并在过滤器链的末尾开端等加上一些自定义的过滤器
 

copyright www.itxxz.com

 
 
  1. DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
本文来自www.itxxz.com


 
 
  1. chain.addLast("logger"new LoggingFilter());
内容来自www.itxxz.com


以上方式为在进入service之后才加的过滤器的,有时候我们想在进入IoService之前就加上Filter,那么可以这样

  1. // Add a logger filter  
  2. DefaultIoFilterChainBuilder chain = new DefaultIoFilterChainBuilder();  
  3. chain.addLast("logger"new LoggingFilter());
内容来自www.itxxz.com
  1. // 为service创建一个过滤器   
  2. acceptor.setFilterChainBuilder(chain);






文章除注明转载外,均为IT学习者原创或编译
欢迎任何形式的转载,但务必请以超链接形式注明出处
本文出自:cnicys
链接地址:http://blog.csdn.net/cnicys/article/details/8529964



微信公众号:喝咖啡的螃蟹

喝咖啡的螃蟹
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-->