Apache Mina快速入门

Mina是什么

Mina是一个基于NIO的网络框架,使用它编写程序时,可以专注于业务处理,而不用过于关心IO操作。不论应用程序采用什么协议(TCP、UDP)或者其它的,Mina提供了一套公用的接口,来支持这些协议。目前可以处理的协议有:HTTP, XML, TCP, LDAP, DHCP, NTP, DNS, XMPP, SSH, FTP… 。从这一点来说,Mina不仅仅是一个基于NIO的框架,更是一个网络层协议的实现。

 

MINA 设计架构

1、Mina 整体架构

1525858935-5352-201506

开发程序时,只需要在Mina的基础上,使用Mina的API就可以了。

2、Mina各个组件

在使用Mina时,可以在Server端使用,也可以在Client端使用。并且它们都使用了同样的架构。

1525858935-7752-201506

 

上面这个图说明了Mina的处理大致流程。从这个图上也可以看出,大致包括了3个部分:

·IoService:执行实际的IO操作。

·IoFilter Chain:将数据进行过滤或者转换为期望的数据结构,反之亦然。

·IoHandler:实际的业务操作。

 

所以如果想要使用Mina编写程序,只需要下列3步即可:

·创建IoService。

·添加IoFilter到FilterChain

·编写处理业务逻辑的IoHandler

 

3、server端示例

定义一个IOHandler:

package com.fjn.frame.mina.timetest;

import java.util.Date;

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 exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        cause.printStackTrace();
    }

    @SuppressWarnings("deprecation")
    @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));
    }
}

接下来就是使用Mina了:

package com.fjn.frame.mina.timetest;

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 = 9123;

    public static void main(String[] args) throws IOException {
        // 创建IoService
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 添加Filter:
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        acceptor.getFilterChain().addLast(
                "codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                        .forName("UTF-8"))));
        // 设置Handler
        acceptor.setHandler(new TimeServerHandler());
        // 其它配置
        acceptor.getSessionConfig().setReadBufferSize(2048);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        
        // 启动服务
        acceptor.bind(new InetSocketAddress(PORT));
    }
}

运行上面程序后,可以在cmd(或者使用终端)上使用下面命令测试。

telnet 127.0.0.1 9123

4、IoService说明

编写网络程序,一般都分为Server/Clinet。Mina为Server端程序提供的IoService实现是IoAcceptor,为客户端提供的实现是IoConnector。

Server端实现:

1525858940-5815-201506

 

Clint端实现:

1525858935-9984-201506

5、IoSession说明

Session,这个词都不陌生。在Web开发中有Session的概念,在Hibernate中有Session的概念。Session就是对连接会话的封装,存储一些状态信息。同样在Mina中也有Session的概念。

在Mina会为每一个连接创建session,并存储在内存中,直到与Client之间连接断开。

UDP协议是无连接的,这样成立吗?在Java NIO的API中有DatagramChannel、SocketChannel。所以Mina的NioSession中,就将封装了Channel。

 

6、IoFilter说明

 

过滤器的作用,以及它的运行原理,开发过Web应用程序的人应该都是知道的。IoFilter的原理与Web应用中的Filter是一样的,这里就不在赘述。

使用过滤器可以做哪些事情呢?

1、  日志记录

2、  根据协议对数据进行编码、解码。

3、  SSL处理

上面示例中的TextLine协议过滤器,就是将用户请求数据解码成一行一行的数据。

目前已有过滤器有:

1525858935-9773-201506

当然了,也可自定义Filter了。

7、IoHandler说明

IoHandler是在最后一个Filter中调用的。主要实现的方法是messageReceived。

就是写你接收到数据后要处理的业务逻辑。

 

更多帮助:http://mina.apache.org/mina-project/quick-start-guide.html

Leave a Comment

 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |