Mina基础概念二

来源:互联网 发布:js正则替换指定字符串 编辑:程序博客网 时间:2024/05/22 03:37

Mina API

1、IoService:这个接口是服务端 IoAcceptor、客户端 IoConnector 的抽象,提供 IO 服务和管理 IoSession 的功能

2、IoAcceptor:可以多次调用 bind()方法(或者在一个方法中传入多个 SocketAddress 参数)同时监听多个端口。 

3、ConnectFuture connect(SocketAddress remoteAddress,SocketAddress localAddress)方法,用于与 Server 端建立连接,第二个参数如果不传递则使用本地的一个随机端口访问 Server 端。这个方法是异步执行的,同样的,也可以同时连接多个服务端。 

4、IoSession 这个接口用于表示 Server 端与 Client 端的连接,IoAcceptor.accept()的时候返回实例。 它有几个方法:write、close、setAttribute等

5、IoHandler一系列API
如果你每隔一段时间,发送一些数据,那么 sessionCreated()方法只会在第一次调用,但是 sessionOpened()方法每次都会调用。  对于 TCP 来说,sessionOpened()是在连接被建立之后调用,你可以在这里执行一些认证操作、发送数据等。 消息发送成功之后,调用messageSent()。 接收到消息时调用方法messageReceived(),一般情况下,message 是一个 IoBuffer 类,如果你使用了协议编解码器,那么可以强制转换为你需要的类型。

connectFuture等

在 Mina 的很多操作中,你会看到返回值是 XXXFuture,实际上他们都是 IoFuture 的子类,主要的子类有 ConnectFuture、 CloseFuture 、 ReadFuture 、 WriteFuture 。看到这样的返回值,这个方法就说明是异步执行的,这个接口的大部分操作都和 java.util.concurrent.Future 接口是类似的,比如awaitUninterruptibly() , 一般我们常用 awaitUninterruptibly()方法可以等待异步执行的结果返回。  研究下他的API中addListener方法,他是异步执行的,与awaitUninterruptibly()对比下,后者是异步转同步,连接过程中会阻塞在那里。

关于TCP连接的关闭

无论在客户端还是服务端,IoSession 都用于表示底层的一个 TCP 连接,那么你会发现无论 是Server端还是Client端的IoSession调用close()方法之后,TCP连接虽然显示关闭, 但主线程仍然在运行,也就是 JVM 并未退出,这是因为 IoSession 的 close()仅仅是关闭了 TCP 的连接通道, 并没有关闭 Server 端、Client 端的程序。你需要调用 IoService 的 dispose() 方法停止 Server 端、Client 端。 

mina执行流程


从Mina 执行流程图可以看出,在 IoProcessor 与 IoHandler 之间可以有很多的过滤器,这种设计方式为你提供可插拔似的扩展功能提供了非常便利的方式,目前的 Apache CXF、Apache Struts2 中的拦截器也都是一样的设计思路。Mina 中的 IoFilter 是单例的,IoService 实例上会绑定一个 DefaultIoFilterChainBuilder 实例, DefaultIoFilterChainBuilder会把使用内部的EntryImpl类把所有的过滤器按照顺序连在一起,组成一个过滤器链。无论是哪个方法,要注意必须在实现时调用参数 nextFilter 的同名方法,否则,过滤器链的执行将被中断,IoHandler 中的同名方法一样也不会被执行。

下面我们完整的综述一下 Mina 的工作流程:
(1.) IoService 这个接口在一个线程上负责套接字的建立,拥有自己的 Selector,监听是否有连接被建立。 
(2.) IoProcessor:这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是 说它也拥有自己的 Selector,这是与我们使用 JAVA NIO 编码时的一个不同之处, 通常在 JAVA NIO 编码中,我们都是使用一个 Selector,也就是不区分 IoService 与 IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在 IoService 上 的过滤器,并在过滤器链之后调用 IoHandler。
(3.) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、 数据的编码(write 方向)与解码(read 方向)等功能,其中数据的 encode 与 decode 是最为重要的、也是你在使用 Mina 时最主要关注的地方。 

设置日志的输出级别,默认是debug

LoggingFilter lf = new LoggingFilter(); lf.setSessionOpenedLogLevel(LogLevel.ERROR);acceptor.getFilterChain().addLast("logger", lf); 

(4.) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。 

参考:Mina_2.0中文参考手册V1.0.pdf