Selier 2012-09-21
1。介绍
ApacheMINA是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。它通过JavaNIO提供了一个抽象的、事件驱动的、异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API,
ApacheMINA通常可被称之为:
NIO框架库;
客户端/服务器框架库;
或者一个网络socket库。
然而,它所提供的功能远不止这些。
(以上内容大致翻译自ApacheMINA网站)
如期官方文档的介绍,ApacheMINA是一个网络应用程序框架,它对Java中的socket和NIO进行了有效和清晰的封装,方便开发人员开发TCP/UDP程序,从而抛开在使用原始的socket时需要考虑的各种繁杂而又烦人问题(线程、性能、会话等),把更多精力专著在应用中的业务逻辑的开发上。
ApacheMINA有两个主要版本:2.0和1.1,2.0与1.1有较大的区别,其采用javaNIO进行开发,使得性能得到有效的提升,在接口方面也有不小的变化,具体信息可以参见其网站说明。
下面的介绍以ApacheMINA2.0为例。
2。软件准备
要编写和运行一个基于ApacheMINA2.0的程序,需要JDK5.0以上版本,还需要以下软件:
(1)MINA2.xCore
下载地址:http://mina.apache.org/downloads.html
(2)SLF4J1.3.0orgreater
下载地址:http://www.slf4j.org/download.html
这里需要用到两个SLF4J的jar包:slf4j-api.jar和slf4j-jdk14.jar。
分别解压下载的MINA2.xCore和SLF4J文件,找出下列jar包文件:
mina-core-2.0.0-M1.jar
slf4j-api.jar
slf4j-jdk14.jar
3。编写一个ApacheMINA时间服务器
该程序的功能非常简单,就是当客户端连接到服务器的9123端口后,程序将服务器当前的时间信息以字符串的形式发送给客户端。
我们可以用Eclipse来创建编写这个程序。
(1)在Eclipse中创建一个Java项目,例如TimeServerProject,然后将mina-core-2.0.0-M1.jar、slf4j-api.jar和slf4j-jdk14.jar这三个文件添加到项目的Libraries中。
(2)创建一个MinaTimeServer类,其内容为:
importjava.io.IOException;
importjava.net.InetSocketAddress;
importjava.nio.charset.Charset;
importorg.apache.mina.common.IdleStatus;
importorg.apache.mina.common.IoAcceptor;
importorg.apache.mina.filter.codec.ProtocolCodecFilter;
importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;
importorg.apache.mina.filter.logging.LoggingFilter;
importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;
publicclassMinaTimeServer{
privatestaticfinalintPORT=9123;
publicstaticvoidmain(String[]args)throwsIOException{
IoAcceptoracceptor=newNioSocketAcceptor();
acceptor.getFilterChain().addLast("logger",newLoggingFilter());
acceptor.getFilterChain().addLast(
"codec",
newProtocolCodecFilter(newTextLineCodecFactory(Charset
.forName("UTF-8"))));
acceptor.setHandler(newTimeServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
acceptor.bind(newInetSocketAddress(PORT));
}
}
(3)创建一个TimeServerHandler类,其内容为:
importjava.util.Date;
importorg.apache.mina.common.IdleStatus;
importorg.apache.mina.common.IoHandlerAdapter;
importorg.apache.mina.common.IoSession;
publicclassTimeServerHandlerextendsIoHandlerAdapter{
@Override
publicvoidexceptionCaught(IoSessionsession,Throwablecause)
throwsException{
cause.printStackTrace();
}
@Override
publicvoidmessageReceived(IoSessionsession,Objectmessage)
throwsException{
Stringstr=message.toString();
System.out.println("Messageread:");
System.out.println(str);
Datedate=newDate();
session.write(date.toString());
System.out.println("Messagewritten...");
session.close();
}
@Override
publicvoidsessionIdle(IoSessionsession,IdleStatusstatus)
throwsException{
System.out.println("IDLE"+session.getIdleCount(status));
}
}
(4)编译并运行MinaTimeServer类
(5)打开您的浏览器,在地址栏中输入http://127.0.0.1:9123/,然后回车,你就可以看到服务器的时间显示在您的浏览器内了。同时您也可以在运行MinaTimeServer的控制台窗口中看到类似下面的信息:
Messageread:2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:CREATED
2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:OPENED
2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:RECEIVED:HeapBuffer[pos=0lim=261cap=2048:474554202F20485454502F312E310D0A...]
GET/HTTP/1.1
Messagewritten...
Messageread:
Accept:*/*
Messagewritten...
Messageread:
Accept-Language:zh-cn,en-US;q=0.5
Messagewritten...
Messageread:
UA-CPU:x86
Messagewritten...
Messageread:
Accept-Encoding:gzip,deflate
Messagewritten...
Messageread:
User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.2;.NETCLR1.1.4322;.NETCLR2.0.50727)
Messagewritten...
Messageread:
Host:127.0.0.1:9123
Messagewritten...
Messageread:
Connection:Keep-Alive
Messagewritten...
Messageread:
Messagewritten...
2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:SENT:HeapBuffer[pos=0lim=29cap=30:467269204170722031312031323A3232...]
2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:SENT:HeapBuffer[pos=0lim=0cap=0:empty]
2008-4-1112:22:44org.apache.mina.filter.logging.LogLevel$4log
信息:CLOSED
这是程序的日志信息以及,浏览器发送过来请求的HTTP头信息。
(6)或者也可以通过telnet连接服务器的9123端口,连敲两次回车,就可以看到服务器发送过来的时间信息了。