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 应用我们必须要做的是 : 

  1. 创建一个I/O service   可以从mina 提供的service( *Acceptor)中选取,或者自己创建
  2. 创建Filter Chain   Choose from already existing Filters or create a custom Filter for transforming request/response
  3. 创建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

posted @ 2015-03-23 14:52  杨牧远  阅读(212)  评论(0编辑  收藏  举报