Mina 的全称是 Multipurpose Infrastructure for Network Applications ,是用于开发高性能和高可用性的网络应用程序的基础框架。
通过使用 Mina 框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。
框架经常使用以下几个类:
NioSocketAcceptor 类用于创建服务端监听;NioSocketConnector 类用于创建客户端连接;IoSession 类用来保存会话属性和发送消息;IoHandlerAdapter 类用于定义业务逻辑。
public static void main(String[] args) throws Exception {
int PORT = 6789;
IoAcceptor acceptor = new NioSocketAcceptor();
// 注册filter
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
// 注册你的业务处理类
acceptor.setHandler( new TimeServerHandler() ); // TimeServerHandler 请查看org.apache.mina.example.gettingstarted.timeserver包
// 配置参数
acceptor.getSessionConfig().setReadBufferSize( 2048 );
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
// 让Acceptor在绑定的地址侦听
acceptor.bind( new InetSocketAddress(PORT) );
}
程序运行后,可以通过 telnet 连接到 6789 端口,测试一下 TimeServerHandler 类的功能。
基本的流程如下:
User -> IoService -> IoProcessor -> IoFilter -> IoFilter -> IoHandler
对象 <- 对象 <- 对象 <- 对象 <- 对象 <- 对象
以下是框架核心接口的简单说明:
org.apache.mina.core.service.IoService 接口:
它是 IoAcceptor 和 IoConnector 的父接口,是框架所有功能的总接口。
它有一个实现类 AbstractIoService ,它有一个 Executor 来处理事件,还有一个 AtomicInteger 确保 ID 的唯一。
org.apache.mina.core.service.IoAcceptor 接口:
它用于绑定 IP 和端口,接收客户端的连接请求,同时会触发相应的事件给 IoHandler 去处理。
它有一个实现类 AbstractIoAcceptor ,是基本功能的实现,此类承继了 AbstractIoService 类。
AbstractIoAcceptor 有一个子类 AbstractPollingIoAcceptor<S extends AbstractIoSession, H> ,轮询的方式处理会话和服务器端 socket 连接。
上面介绍的 NioSocketAcceptor 类就是 AbstractPollingIoAcceptor<S extends AbstractIoSession, H> 的子类。
AbstractIoAcceptor 有一个子类 AbstractPollingConnectionlessIoAcceptor<S extends AbstractIoSession, H> ,处理数据报文的传输。
org.apache.mina.core.service.IoConnector 接口:
它用于连接服务器指定的 IP 和端口,发送客户端的连接请求,同时会触发相应的事件给 IoHandler 去处理。
它有一个实现类 AbstractIoConnector ,是基本功能的实现,此类承继了 AbstractIoService 类。
AbstractIoConnector 有一个子类 AbstractPollingIoConnector<T extends AbstractIoSession, H> ,轮询的方式处理会话和客户端 socket 连接。
上面介绍的 NioSocketConnector 类就是 AbstractPollingIoConnector<S extends AbstractIoSession, H> 的子类。
org.apache.mina.core.service.IoProcessor<S extends IoSession> 接口:
它负责实际的 IO 操作。
它有一个实现类 SimpleIoProcessorPool<S extends AbstractIoSession> ,负责管理具体的会话。
它有一个实现类 AbstractPollingIoProcessor<S extends AbstractIoSession>,轮询的方式的 IO 操作。
org.apache.mina.core.service.IoHandler 接口:
负责处理所有被框架触发的事件,这些事件是 IoProcessor 发出来的,并且同一个 IoProcessor 负责处理多个会话。
它有一个默认的实现类 IoHandlerAdapter ,只是用适配器模式简单的封装。
org.apache.mina.core.service.IoServiceListener 接口:
它继承 java.util.EventListener 接口,负责监听 IoService 相关的事件。
和它相关的有一个类 IoServiceListenerSupport ,负责将 IoService 和对应监听器整合到一起,方便使用。
org.apache.mina.core.session.IoSession 接口:
它表示通信双端的连接,与底层的传输类型无关。
org.apache.mina.core.session.IoSessionConfig 接口:
它表示会话的配置信息,包含读缓冲区大小、会话数据吞吐量、计算吞吐量时间间隔、指定会话端的空闲时间和写请求的超时时间等等。
org.apache.mina.core.session.IoSessionInitializer<T extends IoFuture> 接口:
它定义了一个回调函数,可以通过 AbstractIoService 类的 initSession 方法作为参数使用。
org.apache.mina.core.session.IoSessionRecycler 接口:
它负责回收不再使用的会话。
它有一个实现类 ExpiringSessionRecycler ,用于回收超时失效的会话。
org.apache.mina.core.session.IoEvent 类:
它实现了 Runnable 接口,表示一个事件或请求,它根据事件类型向会话的过滤器链上的监听者发出信号。
org.apache.mina.core.session.IoEventType 枚举:
它定义了事件的类型。
以上只是底层结构的说明,实现机制还需要从上层的具体类的调用进行分析。