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
- Mina基础概念二
- mina基础概念
- apache mina 基础类分析(二):AbstractService
- MINA学习笔记二_基础
- C# 基础概念【二】
- C++ 基础概念(二)
- c++基础概念<二>
- 密码学基础概念(二)
- 二、Docker基础概念
- Apache Mina学习笔记:Java NIO基础概念
- mina(二)
- MINA基础
- cocos2dx基础概念(二)
- Ros(二)ROS基础概念
- netty的基础概念二
- 密码学----基础概念(二)
- mina学习基础-入门实例-传输java对象(二)
- C#基础概念二十五问[转]
- HTML03—样式、BOX模型、背景色
- ArrayList循环遍历并删除元素的常见陷阱
- Android Vibrator类
- 防伪功能
- Android Monkey 压力测试 介绍
- Mina基础概念二
- 强强联手!HTC、联想要推出基于高通VRDK的一体机
- 全面梳理关系型数据库和 NoSQL 的使用情景
- Deepgreen & Greenplum DBA小白普及课之二(管理问题解答)
- node.js debug模块浅析及改进
- Spring boot 入门介绍
- git操作整合笔记
- Spring--依赖注入
- Android TextView类