学习Apache Mina

Mina的几个重要接口:

IoAcceptor 相当于网络应用程序中的服务器端

IoConnector相当于客户端

IoSession当前客户端到服务器端的一个连接实例

IoHandler业务处理逻辑

IoFilter过滤器用于悬接通讯屋接口和业务层接口

IoService是应用程序的入口,相当于我们前面据说的IoAcceptor,后者是前者的扩展接口。IoService可以添加多个IoFilter,这些IoFilter符合责任链模式并由IoProcessor线程负责调用。IoAcceptor还提供绑定某个通讯端口及取消绑定的接口。Mina提供了Socket通讯方式,基于数据提出报文通讯的DatagramAcceptor,基于管道通讯的VmPipeAcceptor,基于串口通讯接入方式以及你自行实现IoService接口的自定义的通讯方式。上图中最右端的IoHandler是业务处理模块。在业务处理类中我们不需要关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写Handler类就是使用Mina开发网络应用的重心所在,其它的通讯方面的细节问题都由Mina来帮我们处理。为了简化Handler类,Mina提供了IoHandlerAdapter类,该类仅仅是实现了IoHandler接口,并不做任何处理。


一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):


void exceptionCaught(IoSession session, Throwable cause)
//当接口中其他方法抛出异常未被捕获时触发此方法


void messageReceived(IoSession session, Object message)
//当接收到客户端的请求信息后触发此方法.


void messageSent(IoSession session, Object message)
//当信息已经传送给客户端后触发此方法.


void sessionClosed(IoSession session)
//当连接被关闭时触发,例如客户端程序意外退出等等.


void sessionCreated(IoSession session)
//当一个新客户端连接后触发此方法.


void sessionIdle(IoSession session, IdleStatus status)
//当连接空闲时触发此方法.


void sessionOpened(IoSession session)
//当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

上图中的IoFilter是IoService和IoHandler之间的桥梁,你可以用它来实现所有你想实现的过滤器方法。

IoHandler中有一个方法是messageReceive,该方法的第二个参数是Object类型,哪这个具体类型就是由IoFilter来决定的。

比如我们添加一个new ProtocolCodecFilter(new TextLineCodecFactory()),就是将来自客户端输入的信息转换成一行行的文本后传递给IoHandler,因此在IoHandler中可以直接将msg对象强制转换成String对象。如果我们不提供任何过滤器,则第二个参数的类型就是一个byte的缓冲区,对应的类是org.apache.mina.common.ByteBuffer。Mina自身带有一些常用的过滤器,如LoggingFilter(日志记录),BlachListFilter(黑名单过滤),CompressionFilter(压缩),SSLFilter(SSL加密)等。

 

Mina除了可以用来开发网络服务端应用程序,还可以使用IoConnector来连接各样的网络服务程序。

 

-------------------------我是分隔线-------------------------------------

Mina采用非阻塞通讯模式:

 a)NIO设计背后的基石:反应器模式 :用于事件多路分离和分派的体系结构模式。反应器模式的核心功能如下:

     将事件多路分用

     将事件分派到各自相应的事件处理程序

b)NIO的非阻塞I/O机制是围绕选择器和通道构建的。

         选择器类(Selector)是Channel的多路复用器。Selector类将传入客户机请求多路分用并将它们分派到各自的请示处理程序。

         通道类(Channel)表示服务器和客户机之间的一种通讯机制,一个通道负责处理一类请示/事件。

         NIO是基于事件的IO架构,最基本的思想是:有事件我会通知你,你再去做与此事件相关的事情。而且NIO的主线程只有一个,不像传统的模型,需要多个线程以应对客户端请示,也减轻了JVM的工作量。

 c)当Channel注册到Selector以后,经典的调用方法如下:

while(condition){
  int n = selector.select(TIMEOUT);
  if(n==0) continue;
  for(Iterator it = selector.selectedKeys().iterator();it.hasNext();){
    if(key.isAcceptable()) doAcceptable(key);
    if(key.isConnectable())doConnectable(key);
    if(key.isValid() && key.isReadable()) doReadable(key);
    if(key.isValid() && key.isWritable())   doWritable(key);
     it.remove();
}
}

 NIO有一个主要的类Selector,该类类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事,当有事件发生时,它会通知我们,传回一组SelectKey,我们读取这些key,就会获取我们刚刚注册过的socketchannel然后我们从这个Channel中读取数据,接着我们就处理这些数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值