1. 首页
  2. 编程语言
  3. Java
  4. Mina2.0快速入门与源码剖析

Mina2.0快速入门与源码剖析

上传者: 2018-12-25 14:32:55上传 PDF文件 495KB 热度 32次
Mina2.0快速入门与源码剖析(个人经验文档)ina2.0快速入门与源码剖析1.Mima20快速入门Mina Time Server.javapackage com. vista;ort ja⊥ EXceptionimport java.net. InetSocketAddressimport javanio charset Charset iimport org. apache. mina, core. service. IoAcceptor iimport org. apache. mina, core session. Idlestatus iimport org. apache. mina filter codec Protocol CodecEilterimport org. apache. mina filter codec textline TextLine CodecFactorymport org. apache. mina filter. l ogging. LoggingFilteimport org. apache. mina, transport socket nio. NioSocketAcceptoripublic class Minatimeserverprivate static final int port=6488;public static void main(String[] args)throws IOException/监听即将到来的TCP连接ToAcceptor acceptor new NioSocketAcceptor ()iacceptor. getFilterchain(). addLast ("logger", new Icggingfilter()iacceptor. getFilterChain(). addLast("codec", new Protoco _CodecFilternew TextLineCodecFactory( Charse- forName(UTF-8))))iacceptor setHandler(new Time ServerHandler())iacceptor. getSessionConfig(). setReadBuffersize(2048)acceptor getsession Config().setIcleTime(Idlestatus. BOTH IDLE, 1Cacceptor. bind (new Ine=Soc ke -Address(POrT))iSystem. out printin("服务器启动");第2页共38页ina2.0快速入门与源码剖析TimeServerhandler. javapackage com. vistaimport java. util. Dateiimport org. apache. mina ccre service. IoHandlerAdapteriimport org. apache. mina, ccre session. Idlestatus iimport org. apache. mina ccre session. ToSession;public class Time ServerHandler extends IoHandlerAdapterpublic void except i on Caught (ToSession session, Throwable cause) throwsExceptioncause. print. StackTrace()public void messageRecei ved(ToSession session, Object message)throwsString strMsg =message tostring()if(strMsg trim().equals Ignorecase(qui="))session. close()returninew Date();session. write( date. to String())iysout printin ("Message writtepublic void sessionIdle(IoSession session, Idlestatus status) throws ExceptionSystem. out. printin("IDLE +session. cecIdlecount(status))i测试:CHient outputServer output第3页共38页ina2.0快速入门与源码剖析user@myhost: N> telnet 127.0.0.19123Try ing127.0.0.1,.Connected to 127.0.0.1MINA Time server startedEscape character is]helloMessage writtenWed oc1723:23:36EDT2007quIConnection clo sed by foreign hostuser@myhost:>参考资料:1, MINA V2.0 Quick Start Guide第4页共38页ina2.0快速入门与源码剖析2.Mina2.0框架源码剖析(一)整个框架最核心的几个包是: org. apache. mina. core service,org. apache. mina. core session, org. apache. mina. core. polling a Korg. apache. mina, transport socket这一篇先来看org. apache. mIna core. service。第一个要说的接口是Io service,它是所有 Io Acceptor和 Io Connector的基接口.对于个 Io service,有哪些信息需要我们关注呢?1)底层的元数据信息 Transport Metadata,比如底层的网络服务提供者( NIO ARP RXTX等),2)通过这个服务创建一个新会话时,新会话的默认配置 Io SessionConfig。3)此服务所管理的所有会话。4)与这个服务相关所生的事件所对应的监听者( Io servicelistener)。5)处理这个服务所管理的所有连接的处理器( Io handler)。6)每个会话都有一个过滤器链( Io Filter hain),每个过滤器链通过其对应的 Io Filterchain builder来负责构建。7)由于此服条管理了一系列会话,因此可以通过广播的方式向所有会话发送消息,返回结果是一个 Write Future集,后者是一种表示未来预期结果的数据结构。8)服务创建的会话( Io session)相关的数据通过 Io SessionData StructureFactory来提供。9)发送消息时有一个写缓冲队列。10)服务的闲置状态有三种:读端空闲,写端空闲,双端空闲。11)还提供服务的一些统计信息,比如时间,数据量等。Io service这个服务是对于服务器端的接受连接和客户端发起连接这两种行为的抽象再来从服务器看起, IOAcceptor是 Io service的子接口,它用于绑定到指定的ip和端口,从而接收来自客户端的连接请求,同时会fre相应的客户端连接成功接收/取消/失败等事件给自己的 Io Handle去处理。当服务器端的 Accpetor从早先绑定的ip和端口上取消绑定时,默认是所有的客户端会话会被关闭,这种情况一般出现在服务器挂掉了,则客户端收到连接关闭的提示。这个接冂最重要的两个方法是bind()和unbind(,当这两个方法被调用时,服务端的连接接受线程就启动或关闭了。再来看一看客户端的连接发起者接口 Io Connector,它的功能和 IoAcceptor基本对应的,它用于尝试连接到服务器指定的i和端口,同时会fre相应的客户端连接事件给自己的 To Handle去处理。当 connet方法被调用后用于连接服务器端的线程就启动了,而当所冇的连接尝试都结束时线程就停止。尝试连接的超时时间可以自行设置Conned方法返回的结果是 ConnectFuture,这和前面说的 WriteFuture类似,在后面会有一篇专门讲这个模式的应用。前面的 Io Acceptor和 Io Connector就好比是两个负责握于的仆人,而真正代表会话的实际I/O操作的接∏是 Io Processor,它对现有的 Reactor模式架构的JavaNIO框架继续做了一层封装。它的泛型参数指明了它能处理的众话类型。接口中最重要的几个方法,add用于将指定会话加入到此 Pro casson中,让它负责处理与此会话相关的所有I/O操作。由于写操作会有一个写请求队列, flush就用于对指定会话的写请求队列进行强制刷数据。 remove方法用于从此 Processor中栘除和关闭指定公话,这样就可以关闭会话相关联的连接并释放所有相关资源。 updateR仟 icMask方法用于控制会话的IO行为,比如是否允许读/写。第5页共38页ina2.0快速入门与源码剖析然后来说说 Io Handle接口,Mina中的所有I/O事件都是通过这个接口来处理的,这些事件都是上面所说的I/ O Processon发出来的,要注意的一点是同一个I/oProcessor线程是负责处理多个会话的。包括下面这几个事件的处理:public interface IoHandlervoid session created( To Session session) throws Exception;/会话创建void sessioncpened( IoSession session) throws Exception;/打开会话,与sessioncreated最大的区别是它是从另一个线程处调用的void sessionclosed( ToSession sessi on) throws Exception;//会话结束,当连接关闭时被调用void sessionIdle (Iosession session, Idlestatus status) throws Exception;//会话空闲void excepcionCaught(IoSession session, Throwable cause) throws Excepton;//异常捕获,Mina会自动关闭此连接void messageReceived(IoSession session, Cbject message)throws Exceptn;//接收到消息void messagesent (IoSession session, Object message) throws Exception;/发送消息Io HandlerAdapter就不说了,简单地对 Io handler使用适配器模式封装了下,让具休的 Io Handler子类从其继承后,从而可以对自身需要哪些事件处理拥有自主权。来看看 Io servicelistener接口,它用于监听 Io service相关的事件。public interface IoServicelistener extends Eventlistenervoid servi deactivated( IOService service) throws Exception;/激活了一个新servI cevoid servicetdle (toservice service, tdlestatus idlestatus)throws Fxception;// servlce闲置void seryicedeactivated( IoService service) throws Exception;//挂起一个serV⊥Cevoid sessioncreated( ToSession session) throws except. on;/创建一个新会话void sessionDestroyed( IoSession session) throws Excep-icn;//摧毁个新会话Io serviceListenerSupport类就是负责将上面的 Io service和其对应的各个Io servicelistener包装釗一起进行管理。下面是它的成员变量orivate final ioservice serviceprivate final List listeners new CopyOnwriteArrayList(iprivate final ConcurrentMap mana gedSessions= new ConcurrentHashMap();//被管理的会话集(其实就是服务所管理的会话集)第6页共38页ina2.0快速入门与源码剖析private final Map readonl yManagedSessions Collections. unmodifiableMap( managedsessio:s);/上面的会话集的只读版orivate final Atomic30o1ear. activated= new AtomicBoolean();//被管坦的服务是否处于激活状态激活事件就以会话创建为例来说明public void firesessionCreated(Io Session session)boolean firstsession falseif (session. get service() instanceof IoConnector)//若服务类型是 Connect or,则说明是客户端的连接服务synchronized (managed Sessions//锁住当前已经建立的会话集firstsessicn= manacecsessions. isEmpty();//看服务所管理的会活集是否为空集if (managedsessions. putIfAbsent(Long valueof(session. getId()) session)!=null)[//Tf already regi stered, ignorereturnif(firstsession〔//第一个连接会话,fire一个虚拟的服务激活事件fireserviceAct ivated(;//呼叫过滤器的事件处理session. getFilterchain(). firesession Created();//会话创建session, getFi-terchain(), firesessionOpened();//会话打开int mana gedSessionCount= managedSessicns size()i//统计管理的会话数目if(managedsessioncount largestManagedSessionCount1stManagedsessionCountnacedsess CountcumulativeManagedsessionCount//呼叫监听者的事件处理数for (IoServicelisterer _: listenerstry{1. sessionCreated( session)iy catch (Throwable e)ExceptionMonitor. getInstance(). exception Caught(e)第7页共38页ina2.0快速入门与源码剖析这里值得注意的一个地方是断开连接会话,设置」一个监听锁,直到所有连接会话被关闭后才放开这个锁private void disconnectsessions()if(!(service instanceof ToAcceptor))//确保服务类型是 IOAcceptorreturniif (!((IoAcceptor) service).isClos eOnDeactivation()// IOAcceptor是否设置为在服务失效时关闭所有连接会话returniObject1ock= new object();//监听锁IoFutureListener listener = new LockNotifyinglistener(lock)ifor (IoSession s: manageasessions values()s.c1ose(). addlistener(1 listener);//为每个会话的c1ose动作增加一个监听者synchronized (lock)while (I managedsessions isEmpty())//所管理的会话还没有全部结束,持锁等待lock wait(500);catch (InterruptedException ie)// Ignoredprivate static class lockNotifyinglistener implements IoFuturelistener<工 Future>private final Cbject lock;public loc kNotifyingListener(cbject lock)第8页共38页ina2.0快速入门与源码剖析this. lock lockpublic void operation Complete(To Future future)synchronized (lock)loCk notifyAll()i第9页共38页
用户评论
码姐姐匿名网友 2018-12-25 14:32:55

不错,刚下载下来,赶紧看一下

码姐姐匿名网友 2018-12-25 14:32:55

挺实用的文档,适合初学者