mina 基础二
MINA 基本应用框架
如上图所示,mina 封装了底层数据传输交互的细节,我们在mina之上便不需要考虑网络层的具体实现。
下图为MINA 各组件的功能
广义的说MINA 应用分为3层 :
- I/O Service 执行实际的I/O 操作
- I/O Filter Chain ( Filters/Transforms bytes into desired Data Structures and vice-versa) 执行双向的过滤,将数据转换为所需的数据类型
- I/O Handler 处理业务逻辑
所以创建一个Mina 应用我们必须要做的是 :
- 创建一个I/O service 可以从mina 提供的service( *Acceptor)中选取,或者自己创建
- 创建Filter Chain Choose from already existing Filters or create a custom Filter for transforming request/response
- 创建I/O Handler
下面看一个官方给的简单的TCP Server列子 : Time server 位于 源码包 中 apache-mina-2.0.9\src\mina-example\src\main\java\org\apache\mina\example\gettingstarted
1.创建一个java 工程
2.添加 mina-core 包 ,添加SLF4J 1.3.0 或更高版本 jdk 版本要求1.5 以上
2.创建类 MinaTimeServer
public class MinaTimeServer {
public static void main( String[] args ) throws IOException { IoAcceptor acceptor = new NioSocketAcceptor(); // 创建I/O service acceptor.getFilterChain().addLast( "logger", new LoggingFilter() ); // 添加过滤器 acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); acceptor.setHandler( new TimeServerHandler() ); // 设置 I/O Handler acceptor.getSessionConfig().setReadBufferSize( 2048 ); acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); acceptor.bind( new InetSocketAddress(PORT) ); }
private static final int PORT = 9123;
}
业务逻辑处理类
public class TimeServerHandler extends IoHandlerAdapter { @Override public void exceptionCaught( IoSession session, Throwable cause ) throws Exception { cause.printStackTrace(); // 当链接发生异常的时候调用该方法 对于大多数应用程序只需打印异常信息就够了 } @Override public void messageReceived( IoSession session, Object message ) throws Exception { String str = message.toString(); // 接受客户端发来的数据 进行处理 if( str.trim().equalsIgnoreCase("quit") ) { session.close(); // 关闭连接 return; } Date date = new Date(); session.write( date.toString() ); System.out.println("Message written..."); } @Override public void sessionIdle( IoSession session, IdleStatus status ) throws Exception { System.out.println( "IDLE " + session.getIdleCount( status )); // 通道 空闲时调用 既超过指定的时间里没有读写操作的时候调用 } }
ip + 端口号 建立TCP链接 建立连接之后 随便输入 ,都会返回当前时间 ,输入quit 关闭链接。
看起来很简单嘛,终于有了一段代码了,可是还有很多疑问啊!
譬如 如何选择一个Acceptor ,应该添加什么样的FilterChain 呢?
Session 是啥?
IoHandlerAdaper 里面的方法都是干啥的?
赶紧看下章
文章参考 :
http://mina.apache.org/mina-project/userguide/ch2-basics/application-architecture.html
http://mina.apache.org/mina-project/userguide/ch2-basics/client-architecture.html
http://mina.apache.org/mina-project/userguide/ch2-basics/server-architecture.html