十三、Mina-基于JAVA-NIO的网络通讯框架

Mina是什么

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


Apache MINA 2是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步API,可以使用TCP/IPUDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 2可以作为开发网络应用程序的一个良好基础。Mina API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。


  

MINA 设计架构

  

1、Mina 整体架构

 

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

 

2、Mina各个组件

 

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

 

 

上面这个图说明了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端实现:

 

 

Clint端实现:

 

 

  

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是一样的,这里就不在赘述。

 如果不清楚Filter的原理,可以参考这里

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

1、  日志记录

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

3、  SSL处理

等等。

 

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

 

目前已有过滤器有:

 

 

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

 

 

7、IoHandler说明

 

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

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

猜你喜欢

转载自blog.csdn.net/u010285974/article/details/80559316