查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
一.MINA框架简介
1.1Mina是什么西东?
Apache MINA 是一个络网应用框架,有助于用户非常便利地发开高能性、高伸缩性的络网应用。它通过Java NIO供给了一个抽象的、事件驱动的、异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API,Apache MINA 平日可被称之为:
l NIO 框架库;
l 户客端/服务器框架库;
l 或者一个络网socket库。
MINA框架的特色有:基于java NIO类库发开;用采非阻塞式方的异步传输;事件驱动;持支批量数据传输;持支TCP、UDP协议;控制反转的设计模式(持支Spring);用采优雅的松耦合构架;可灵巧的加载过滤器制机;单元测试更轻易现实;可自定义线程的量数,以进步运行于多处置器上的能性;用采回调的式方成完调用,线程的应用更轻易。
1.2Mina的框架
当程远户客次首拜访用采MINA编写的序程时,IoAcceptor作为线程运行,责负接受来自户客的请求。当有户客请求连接时,建创一个IoSession,该IoSession与IoProcessor、SocketChannel以及IOService联系起来。IoProcessor也作为另外一个线程运行,时定检查户客否是有数据到来,并对户客请求行进处置,次依调用在IOService注册的各个IoFilter,最后调用IoHandler行进终究的逻辑处置,再将处置后的结果Filter后回返给户客端。
1.3Mina的现有应用
MINA框架的应用比拟泛广,应用的开源项目有Apache Directory、AsyncWeb、ApacheQpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架以后稳定版本是1.1.6,最新的2.0版本前目经已布发了M1版本。
二.MINA框架详细术技
2.1MINA框架的经常使用类
1.类NioSocketAcceptor
于用建创服务端听监
2.类NioSocketConnector
于用建创户客端连接;
3.类IoSession
用来存保会话属性和发送消息;可以理解为服务器与户客端的特定连接,该连接由服务器址地、端口以及户客端址地、端口来决议。户客端起发请求时,指定服务器址地和端口,户客端也会指定或者根据络网路由信息主动指定一个址地、主动配分一个端口。这个址地、端口对形成一个Session。
Session是服务器端对这类连接的抽象,MINA对其行进了装封,定义了IoSession接口,用来代表户客端与服务器的连接,在服务器端来指代户客端,现实对户客端的作操、定绑与户客端有关的信息与对象。通过用利Session的这个念概,编写序程时就能够在服务器端非常便利地域分出是以后处置的是哪个户客端的请求、维持户客端的状态信息、可以现实户客端之间互相讯通。
IoSession供给以下一些经常使用法方:
(1)setAttribute(Object key, Object value) getAttribute(Object key)
功能说明:设置/得获用户定义的属性。将该属性与session联系起来,便利以后处置用户请求时应用。比如如果要求用户登录后才能继承行进作操,那么在用户胜利陆登后,可以通过setAttribute()设置一个属性,当用户以后继承请求时,可以通过getAttribute()得获该属性来判断用户否是登录。
(2)getRemoteAddress()
功能说明:得获程远户客端址地。
(3)getId()
功能说明:得获Session的Id
(4)getCreationTime()
功能说明:得获建创时光
(5)getLastIoTime()
功能说明:得获次上IO时光
(6) getConfig()
功能说明:得获配置信息。
(7)write(Object message)
功能说明:将数据发送给户客端。
(5)close()
功能说明:关闭Session。
(说明:可以在Session中发送数据,但是Session没有供给取读数据的法方,取读数据通过另外一套制机在IoHandler的messageReceived()中现实。)
4.类IoHandlerAdapter
从以上MINA框架简图可以看出,对来自户客端数据终究处置是在IoHandler中处置的。IoHandler装封了来自户客端不同事件的处置,如果对某个事件感兴趣,可以现实响应的法方,当该事件生发时,IoHandler中的法方就会被发触执行。
于用定义业务逻辑,经常使用的法方有:
(1)void exceptionCaught(IoSession session, Throwable cause)
功能说明:有异常生发时被发触。
(2)void messageReceived(IoSession session, Object message)
功能说明:有消息达到时被发触,message代表收接到的消息。
(3)void messageSent(IoSession session, Object message)
功能说明:发送消息时时被发触,即在调用IoSession.write()时被发触,message代表将要发送的消息。
(4)void sessionClosed(IoSession session)
功能说明:当连接关闭时被发触,即Session止终时被发触。
(5)void sessionCreated(IoSession session)
功能说明:当建创一个新连接时被发触,即当开始一个新的Session时被发触。
(6)void sessionIdle(IoSession session, IdleStatus status)
功能说明:当连接闲暇时被发触。应用IoSessionConfig中的setIdleTime(IdleStatus status, int idleTime)法方可以设置session的闲暇时光。如果该Session的闲暇时光过超设置的值,该法方被发触,可以通过session.getIdleCount(status)来得获sessionIdle被发触的次数。
(7)void sessionOpened(IoSession session)
功能说明:当打开一个连接时被发触。在前目的现实中,似乎 sessionOpened 和 sessionCreated 没有太大别区,sessionCreated 在 sessionOpened 之前被发触。
IoHandler是一个接口,一般况情没有必要直接现实该接口的个一每法方。MINA供给了一个IoHandlerAdapter类,该类现实了IoHandler要求的法方,但是都没有做任何处置。当我们要编写自己的Handler时,可以扩展IoHandlerAdapter,写重我们关怀的事件法方可即。比如,一般况情,我们比拟关怀否是收接到数据这个时光,那么我们就能够覆盖messageReceived法方,用不管其他法方。
5.类IoFilter
IoFilter用来对户客的请求或发送给户客的数据行进filter。与IoHandler一样,Filter也是基于事件的,通过现实IoFilter接口,就能够对信通程过中的Session的事件行进处置。
6.Event
MINA可以当作是事件驱动的。平日在络网讯通中,可以将个整程过划分为几个基本的阶段,如建立连接、数据信通、关闭连接。
数据信通一般包含数据的发送和收接,由于在信通程过中,可能要多次发送和收接数据,以行进不同的业务交互。不可能一直都收接和发送数据,因此就有Idle现出,在MINA中,如果在设定的时光内没有数据发送或收接,那么就会发触一个Idle事件。由于某种原因,可能会生发误错,致使统系异常生发,发引exception。因此,如果从事件生发的角度看的话,就能够在MINA中将信通当作由一个建立链接(sessionCreated 和 sessionOpened )、多个数据收接和发送、一个关闭连接事件以及多个Idle事件等7种事件构成的程过。
Session是对方双互相信通的抽象,因此信通的程过就是一系列与Session相干的事件。
在MINA现在对TCP的现实中,sessionCreated 和 sessionOpened 没有别区。因此严格来说,有6种类型的事件。
三、代码事例
功能述描:编写一个服务器听监户客机的序程,当户客机拜访服务器的时候,服务器输出户客机的拜访信息(http),然后将拜访信息和第几位户客告知户客机。
处置器代码:
SamplMinaServerHandler.java
package com.javake.mina.sampleserver;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
public class SamplMinaServerHandler extends IoHandlerAdapter {
//当一个客端端连结进入时
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incomming client : "+session.getRemoteAddress());
}
//当一个户客端关闭时
@Override
public void sessionClosed(IoSession session) {
System.out.println("one Clinet Disconnect !");
}
//当户客端发送的消息达到时:
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
//我们己设定了服务器剖析消息的规则是一行一行取读,这里便可转为String:
String s=(String)message;
// Write the received data back to remote peer
System.out.println("收到户客机发来的消息: "+s);
//测试将消息回送给户客端
session.write(s+count);
count++;
}
private int count=0;
}
启动服务器的主类:
MainServer.java
package com.javake.mina.sampleserver;
import java.net.InetSocketAddress;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MainServer {
public static void main(String[] args) throws Exception {
//建创一个非阻塞的Server端Socket,用NIO
SocketAcceptor acceptor = new NioSocketAcceptor();
//建创收接数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定这个过滤器将一行一行(/r/n)的取读数据
chain.addLast("myChin", new ProtocolCodecFilter(new TextLineCodecFactory()));
//设定服务器端的消息处置器:一个SamplMinaServerHandler对象,
acceptor.setHandler(new SamplMinaServerHandler());
// 服务器端定绑的端口
int bindPort=9988;
//定绑端口,启动服务器
acceptor.bind(new InetSocketAddress(bindPort));
文章结束给大家分享下程序员的一些笑话语录: 一个程序员对自己的未来很迷茫,于是去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的"
于是他去问Lippman。
Lippman说"程序员的未来就是驾驭程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的"
于是他去问Gates。
Gates说"程序员的未来就是榨取程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝说"我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的"
于是他去问侯捷。
侯捷说"程序员的未来就是诱惑程序员"
这个程序员对这个未来不满意,于是他又去问上帝。
"万能的上帝呀,请你告诉我,我的未来会怎样?"
上帝摇摇头"唉,我的孩子,你还是别当程序员了")