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
输入:Helllo,MINA.
控制台将输出:
session open for /127.0.0.1:55344
The message received is [hello MINA]
Mina实现TCP客户端:
MyCient.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
所支持的功能也在进一步的扩展中。目前正在使用 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
相关文章推荐
- Apache的用户认证
- sun.misc.BASE64加解密跟Apache的commons-codec加解密区别以及改造兼容Apache
- Apache Shiro
- apache 自定义404错误页面
- Apache Tiles的基本使用
- Apache Stratos探究:结合Mock IaaS,简单的跑一遍Apache Stratos 4.1.0
- 使用linux计划任务自动拉起停止的通达OA服务apache和mysql服务
- 使用linux计划任务自动拉起停止的通达OA服务apache和mysql服务
- piwik流量统计系统搭建(apache2.4+piwik+mysql5.6+php5.6.14)
- RHEL的Apache配置(基于ip&端口&域名的虚拟主机和认证)
- apache相关配置
- Apache Ignite——新一代数据库缓存系统
- win8系统下 配置apache2.4+mod_wsgi4.4+django1.8.6+python3.4
- Apache三种多路处理模块
- log4j xml配置详解
- apache虚拟主机的配置,一个IP绑定多个域名
- 编译安装apache
- Apache mina,Netty的起源和历史
- eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.4.3解决方案
- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter与org.apache.struts.dispatcher.FilterDispatcher是什么区别?