您的位置:首页 > 运维架构 > Apache

Apache MINA框架

2015-11-24 21:44 676 查看
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA
所支持的功能也在进一步的扩展中。目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

MINA的几个重要接口:

IoServiece :这个接口在一个线程上负责套接字的建立,拥有自己的 Selector,监听是否有连接被建立。

IoProcessor :这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的 Selector,这是与我们使用 JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个 Selector,也就是不区分 IoService与 IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用
IoHandler。

IoAccepter :相当于网络应用程序中的服务器端,它继承自IoServiece,并进行了扩展。

IoConnector :相当于客户端,它继承自IoServiece,并进行了扩展。

IoSession :当前客户端到服务器端的一个连接实例。

IoHandler :这个接口负责编写业务逻辑,也就是接收、发送数据的地方。这也是实际开发过程中需要用户自己编写的部分代码。

IoFilter :过滤器用于悬接通讯层接口与业务层接口,这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的 encode与 decode是最为重要的、也是你在使用 Mina时最主要关注的地方。

MINA的基础架构图:



下面是使用Mina实现TCP的一个小例子:

TCPServer.java

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.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
* @description:Mina 实现TcpServer
* @date:(2015-11-22 下午3:46:23)
* @author
* @version v1.0
* @since v1.0
*
*        Modified history
*
*        Modified date: Modifier user: description:
*
* */
public class TcpServer{

public static void main(String[] args) throws IOException {

IoAcceptor acceptor=new NioSocketAcceptor();
//设置缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
//设置通道10秒内没有任何操作将处于空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//使用字符串编码
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(
Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue()
,LineDelimiter.WINDOWS.getValue())));
//设置业务处理逻辑
acceptor.setHandler(new MyIOHandler());
acceptor.bind(new InetSocketAddress(9123));

}

}
MyIOHandler.java

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
* @description:主要是一些业务逻辑,如发送,接收消息
* @date:(2015-11-24 上午9:37:02)
* @author Administrator
* @version v1.0
* @since v1.0
*
* Modified history
*
*    Modified date:
*    Modifier user:
*    description:
*
* */
public class MyIOHandler extends IoHandlerAdapter{

/**
* 当有异常发生时触发
* */
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {

super.exceptionCaught(session, cause);
session.close(true);
}

/**
* 有新连接是触发
* */
@Override
public void sessionOpened(IoSession iosession) throws Exception {

System.out.println("session open for " + iosession.getRemoteAddress());
}

/**
* 连接被关闭是触发
* */
@Override
public void sessionClosed(IoSession iosession) throws Exception {

System.out.println("session closed from " + iosession.getRemoteAddress());
}

/**
* 收到来自客户端的消息
*/
@Override
public void messageReceived(IoSession iosession, Object message)
throws Exception {

String str=message.toString();
System.out.println("The message received is [" + str + "]");
if(str.endsWith("quit")){
iosession.close(true);
}

}

}
启动服务,在dos窗口中telnet 127.0.0.1 9123

输入:Helllo,MINA.

控制台将输出:

session open for /127.0.0.1:55344

The message received is [hello MINA]

Mina实现TCP客户端:

MyCient.java

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoConnector;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
* @description:MINA 实现TCP 客户端
* @date:(2015-11-24 下午10:06:43)
* @author Administrator
* @version v1.0
* @since v1.0
*
* Modified history
*
*    Modified date:
*    Modifier user:
*    description:
*
* */
public class MyCient {

public static void main(String[] args) {

IoConnector connector=new NioSocketConnector();
connector.setConnectTimeoutMillis(30000);
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));
connector.connect(new InetSocketAddress("127.0.0.1", 9123));

}

}
ClientHandler.java

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
* @description
* @date:(2015-11-24 下午10:14:04)
* @author Administrator
* @version v1.0
* @since v1.0
*
* Modified history
*
*    Modified date:
*    Modifier user:
*    description:
*
* */
public class ClientHandler extends IoHandlerAdapter{

private String values;

public ClientHandler(String values){
this.values=values;
}

@Override
public void sessionOpened(IoSession session) throws Exception {
session.write(values);
}

}
运行TCPServer,java,MyClient.java

server端控制台输出:

session open for /127.0.0.1:56992

The message received is [你好!]

The message received is [ 大家好!]

参考文档:
http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/ http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: