1.MINA 框架简介
MINA (Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA 框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA 框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA 框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。
MINA 框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。
2.MINA 框架的常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方法 定义
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发
3.环境准备
- 首先到官方网站下载最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html 。下载之前先介绍一下 MINA 的两个版本:1.0.x 适合运行环境为 JDK1.4,1.1.x 适合 JDK1.5 的版本,两者的编译环境都需要 JDK1.5。JDK1.5 已经是非常普遍了,本文中使用 1.1.7 版本的 MINA,编译和运行所需的文件是 mina-core-1.1.7.jar。
- 下载 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出,而 MINA 本身并不附带此项目包,请到http://www.slf4j.org/download.html 地址下载 slf4j 包,slf4j 项目解压后有很多的文件,本例中只需要其中的 slf4j-api-1.5.3.jar 和 slf4j-simple-1.5.3.jar 这两个 jar 文件。如果没有这两个文件就会导致启动例子程序的时候报 org/slf4j/LoggerFactory 类没找到的错误。
- 当然要求机器上必须装有 1.5 或者更新版本的 JDK。
- 最好你应该选择一个顺手的 Java 开发环境例如 Eclipse 或者 NetBeans 之类的,可以更方便的编码和调试,虽然我们的最低要求只是一个简单的文本编辑器而已。
4.编写代码并测试
- import java.io.IOException;
-
import java.net.InetSocketAddress;
-
import java.nio.charset.Charset;
-
-
import org.apache.mina.common.ByteBuffer;
-
import org.apache.mina.common.IoAcceptor;
-
import org.apache.mina.common.SimpleByteBufferAllocator;
-
import org.apache.mina.filter.LoggingFilter;
-
import org.apache.mina.filter.codec.ProtocolCodecFilter;
-
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
-
import org.apache.mina.transport.socket.nio.SocketAcceptor;
-
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
-
-
public class MinaTimeServer {
-
-
private static final int PORT = 9123;
-
-
public static void main(String[] args) throws IOException {
-
-
ByteBuffer.setUseDirectBuffers(false);
-
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
-
-
IoAcceptor acceptor = new SocketAcceptor();
-
-
SocketAcceptorConfig cfg = new SocketAcceptorConfig();
-
-
cfg.getSessionConfig().setReuseAddress( true );
-
cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
-
cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
-
-
acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);
-
System.out.println("MINA Time server started.");
- }
- }
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.common.SimpleByteBufferAllocator;
import org.apache.mina.filter.LoggingFilter;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
public class MinaTimeServer {
private static final int PORT = 9123;
public static void main(String[] args) throws IOException {
//设置buffer
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
//定义acceptor
IoAcceptor acceptor = new SocketAcceptor();
//定义config
SocketAcceptorConfig cfg = new SocketAcceptorConfig();
//设置config,加入filter
cfg.getSessionConfig().setReuseAddress( true );
cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
//加入port handler cfg
acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);
System.out.println("MINA Time server started.");
}
}
- import java.util.Date;
-
-
import org.apache.mina.common.IdleStatus;
-
import org.apache.mina.common.IoHandlerAdapter;
-
import org.apache.mina.common.IoSession;
-
import org.apache.mina.common.TransportType;
-
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
-
-
public class TimeServerHandler extends IoHandlerAdapter {
-
public void exceptionCaught(IoSession session, Throwable t) throws Exception {
- t.printStackTrace();
- session.close();
- }
-
-
public void messageReceived(IoSession session, Object msg) throws Exception {
- String str = msg.toString();
-
-
if( str.trim().equalsIgnoreCase("quit") ) {
- session.close();
-
return;
- }
-
-
Date date = new Date();
- session.write( date.toString() );
- String ip = session.getRemoteAddress().toString();
-
System.out.println("===> Message From " + ip +" : " + msg);
-
session.write("Hello " + msg);
- }
-
-
public void sessionCreated(IoSession session) throws Exception {
-
System.out.println("Session created");
-
-
if( session.getTransportType() == TransportType.SOCKET )
-
((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );
-
-
session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );
- }
-
-
-
- }
import java.util.Date;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.TransportType;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
public class TimeServerHandler extends IoHandlerAdapter {
public void exceptionCaught(IoSession session, Throwable t) throws Exception {
t.printStackTrace();
session.close();
}
public void messageReceived(IoSession session, Object msg) throws Exception {
String str = msg.toString();
//如果是quit就关闭session退出
if( str.trim().equalsIgnoreCase("quit") ) {
session.close();
return;
}
//否则打印当前日期
Date date = new Date();
session.write( date.toString() );
String ip = session.getRemoteAddress().toString();
System.out.println("===> Message From " + ip +" : " + msg);
session.write("Hello " + msg);
}
public void sessionCreated(IoSession session) throws Exception {
System.out.println("Session created");
if( session.getTransportType() == TransportType.SOCKET )
((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );
session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );
}
}
启动服务器后,打开命令行窗口,输入 telnet localhost 9123 后,输入字符后回车,可以看到client端的字符串在服务器端被打印出来,该程序成功执行
5.架构认识
程序中IoService 是应用程序的入口,相当于我们前面代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口,相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。
而IoHandler是业务处理模块。相当于前面例子中的 HelloHandler 类。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。
一个 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文档):
void exceptionCaught (IoSession session, Throwable cause) 当接口中其他方法抛出异常未被捕获时触发此方法 |
void messageReceived (IoSession session, Object message) 当接收到客户端的请求信息后触发此方法. |
void messageSent (IoSession session, Object message) 当信息已经传送给客户端后触发此方法. |
void sessionClosed (IoSession session) 当连接被关闭时触发,例如客户端程序意外退出等等. |
void sessionCreated (IoSession session) 当一个新客户端连接后触发此方法. |
void sessionIdle (IoSession session, IdleStatus status) 当连接空闲时触发此方法. |
void sessionOpened (IoSession session) 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发 |
前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService 和 IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。
而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。
MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。
相关推荐
在学习Apache Mina时,首先要理解其核心组件和设计模式。Mina的核心组件包括Session、Filter、ProtocolCodec等。Session代表了客户端和服务器之间的连接,Filter则提供了数据处理链,ProtocolCodec则用于将应用层的...
在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
对于希望提高网络应用性能或熟悉Java NIO编程的开发者来说,Apache Mina 2.0.4的源码分析是一次宝贵的学习机会。你可以通过阅读源码学习到如何有效地处理高并发场景,如何设计和实现高效的网络协议,以及如何利用...
在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...
Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端应用程序。...通过学习和使用"Mina帮助文档",开发者可以更好地理解和利用这个框架,构建出高效、稳定的网络应用。
通过深入学习和实践这个Apache Mina入门Demo,你将掌握如何利用Mina构建网络应用,并了解其核心特性和工作原理,这对于从事Java网络编程或者需要处理大规模并发连接的开发者来说是非常有价值的。
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...
标题中的“Apache MINA框架相关资料”涵盖了对MINA框架的全面学习材料,包括中文参考手册、源码分析、API文档和与Spring框架的整合指南。 1. **中文参考手册**(Apache_Mina_Server_2.0中文参考手册V1.0.pdf):这...
apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...
### Apache MINA 2.0 用户指南:基础知识 #### 基础概念介绍 Apache MINA 2.0 是一款高性能且易于使用的网络...在未来的学习过程中,我们将更深入地探索 MINA 的高级特性,如会话管理、错误处理、安全性和扩展性等。
Apache Mina Server 2.0 是一款高性能、...此外,下载的压缩包文件“minaTest”可能包含示例代码或测试项目,可以作为学习和实践Apache Mina的好材料。通过这些实践,你可以加深对Mina的理解,并将其应用到实际项目中。
Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,主要设计用于简化开发服务器端的高性能网络应用。这个框架提供了一种抽象层,允许开发者使用相同的API处理多种不同的传输协议,如TCP/IP、UDP/IP以及SSL/...
很详细的描述了apache mina 框架,对于那些对于英文不是很懂得人,这简直就是福音啊,哈哈
通过这个项目,开发者可以学习到如何将Mina的异步I/O能力与Spring的容器管理及依赖注入机制结合,构建出健壮且易于维护的网络服务端程序。这包括理解Mina的事件模型、Spring的bean管理和网络编程的最佳实践。同时,...
Apache Mina是一个强大的开源项目,专门设计用于构建网络应用程序。这个框架的核心目标是...通过深入学习和实践,开发者可以创建出满足各种需求的网络服务,无论是在企业级应用还是小型项目中,Mina都能发挥重要作用。
Apache Mina是一个开源项目,主要用于构建高...在`MinaTimeServer`和`MinaClient`的例子中,我们可以看到如何使用Mina轻松地建立一个简单的服务器和客户端通信系统,这对于理解和学习Mina的基本用法是非常有帮助的。
Apache Mina是一个用Java编写的网络通信框架,它简化了创建高性能、高可用性的网络服务的过程...对于深入学习Mina,你可以进一步探索其内部的事件驱动模型、异步I/O机制,以及如何自定义过滤器和处理器来满足特定需求。
通过阅读和分析`apache-mina-2.0.16`的源码,我们可以深入理解MINA的设计思想,学习如何构建高效的网络服务,并能根据自己的需求定制和扩展MINA的功能。对于想要从事网络编程或系统架构设计的开发者来说,研究MINA...