Apache Mina是一个可以帮助用户开发高性能和高伸缩性网络应用程序的框架。它经过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。html
Mina包的简介:java
org.apache.mina.core.buffer | 用于缓冲区的IoBuffer |
org.apache.mina.core.service org.apache.mina.transport.* |
用于提供链接的service |
org.apache.mina.core.session | 用于提供两端状态的session |
org.apache.mina.core.filterchain org.apache.mina.filter.* |
用于拦截全部IO事件和请求的filter chain和各种拦截器(在IoService和IoHandler之间) |
org.apache.mina.handler.* | 用于处理IO事件的handler |
org.apache.mina.core.future | 用于实现异步IO操做的 future |
org.apache.mina.core.polling | 用于实现IO轮询的的polling |
org.apache.mina.proxy.* | 用于实现代理的proxy |
先介绍Mina几个重要接口:apache
MIINA架构图服务器
在图中的模块链中,IoService 即是应用程序的入口,至关于咱们前面代码中的 IoAccepter,IoAccepter 即是 IoService 的一个扩展接口。IoService 接口能够用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通信端口以及取消绑定的接口。网络
IoAcceptor acceptor = new SocketAcceptor();
上面代码中,至关于咱们使用了 Socket 通信方式做为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通信的 DatagramAccepter 以及基于管道通信的 VmPipeAccepter。另外还包括串口通信接入方式,目前基于串口通信的接入方式已经在最新测试版的 MINA 中提供。你也能够自行实现 IoService 接口来使用本身的通信方式。session
而在上图中最右端也就是 IoHandler,这即是业务处理模块。在业务处理类中不须要去关心实际的通信细节,只管处理客户端传输过来的信息便可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,至关于 MINA 已经帮你处理了全部的通信方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不作任何处理。数据结构
一个 IoHandler 接口中具备以下一些方法(摘自 MINA 的 API 文档):多线程
前面咱们提到 IoService 是负责底层通信接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 做何用途呢?答案是你想做何用途均可以。可是有一个用途倒是必须的,那就是做为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是全部 Java 对象的基础,那到底谁来决定这个消息究竟是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,咱们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的做用是未来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,所以咱们能够在 messageReceived 中直接将 msg 对象强制转换成 String 对象。架构
而若是咱们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.core.buffer.IoBuffer。虽然你也能够将解析客户端信息放在 IoHandler 中来作,但这并非推荐的作法,使原来清晰的模型又模糊起来,变得 IoHandler 不仅是业务处理,还得充当协议解析的任务。框架
MINA自身带有一些经常使用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。
简单地来说,就分为三层:
客户端的通讯过程:
IoFilterChain做为消息过滤链
客户端通讯过程 IoSession贯穿整个通讯过程的始终
建立服务器
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaTimeServer { // 定义监听端口 private static final int PORT = 6488; public static void main(String[] args) throws IOException { // 建立服务端监控线程 IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 设置日志记录器 acceptor.getFilterChain().addLast("logger", new LoggingFilter()); // 设置编码过滤器 acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 指定业务逻辑处理器 acceptor.setHandler(new TimeServerHandler()); // 设置端口号 acceptor.bind(new InetSocketAddress(PORT)); // 启动监听线程 acceptor.bind(); } }
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; /** * 服务器端业务逻辑 */ public class TimeServerHandler extends IoHandlerAdapter { /** * 链接建立事件 */ @Override public void sessionCreated(IoSession session){ // 显示客户端的ip和端口 System.out.println(session.getRemoteAddress().toString()); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); } /** * 消息接收事件 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { String strMsg = message.toString(); if (strMsg.trim().equalsIgnoreCase("quit")) { session.close(true); return; } // 返回消息字符串 session.write("Hi Client!"); // 打印客户端传来的消息内容 System.out.println("Message written : " + strMsg); } @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { System.out.println("IDLE" + session.getIdleCount(status)); } }
客户端
import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketConnector; public class MinaTimeClient { public static void main(String[] args){ // 建立客户端链接器. NioSocketConnector connector = new NioSocketConnector(); connector.getFilterChain().addLast("logger", new LoggingFilter()); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 设置链接超时检查时间 connector.setConnectTimeoutCheckInterval(30); connector.setHandler(new TimeClientHandler()); // 创建链接 ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.2.109", 6488)); // 等待链接建立完成 cf.awaitUninterruptibly(); cf.getSession().write("Hi Server!"); cf.getSession().write("quit"); // 等待链接断开 cf.getSession().getCloseFuture().awaitUninterruptibly(); // 释放链接 connector.dispose(); } }
import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class TimeClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { String content = message.toString(); System.out.println("client receive a message is : " + content); } public void messageSent(IoSession session, Object message) throws Exception { System.out.println("messageSent -> :" + message); } }
http://my.oschina.net/ielts0909/blog?catalog=253154
http://www.blogjava.net/mikechen/archive/2012/03/15/371938.html
http://dxf1122.blog.163.com/blog/static/54041004200931371414356/
http://blog.sina.com.cn/s/blog_7abc61de0100sdoi.html
http://mina.apache.org/mina-project/documentation.html
http://wenku.baidu.com/view/b9af67c34028915f804dc292.html
http://wenku.baidu.com/view/46800bce0508763231121232.html
http://wenku.baidu.com/view/5ccc7935b90d6c85ec3ac6e7.html