标签:
Mina是一个基于NIO的网络框架,使用它编写程序时,可以专注于业务处理,而不用过于关心IO操作。不论应用程序采用什么协议(TCP、UDP)或者其它的,Mina提供了一套公用的接口,来支持这些协议。目前可以处理的协议有:HTTP, XML, TCP, LDAP, DHCP, NTP, DNS, XMPP, SSH, FTP... 。从这一点来说,Mina不仅仅是一个基于NIO的框架,更是一个网络层协议的实现。
开发程序时,只需要在Mina的基础上,使用Mina的API就可以了。
在使用Mina时,可以在Server端使用,也可以在Client端使用。并且它们都使用了同样的架构。
上面这个图说明了Mina的处理大致流程。从这个图上也可以看出,大致包括了3个部分:
·IoService:执行实际的IO操作。
·IoFilter Chain:将数据进行过滤或者转换为期望的数据结构,反之亦然。
·IoHandler:实际的业务操作。
所以如果想要使用Mina编写程序,只需要下列3步即可:
·创建IoService。
·添加IoFilter到FilterChain
·编写处理业务逻辑的IoHandler
package com.fjn.frame.mina.timetest; import java.util.Date; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; public class TimeServerHandler extends IoHandlerAdapter { @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { cause.printStackTrace(); } @SuppressWarnings("deprecation") @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = message.toString(); if (str.trim().equalsIgnoreCase("quit")) { session.close(); return; } Date date = new Date(); session.write(date.toString()); System.out.println("Message written..."); } @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { System.out.println("IDLE " + session.getIdleCount(status)); } }
接下来就是使用Mina了:
package com.fjn.frame.mina.timetest; 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.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaTimeServer { private static final int PORT = 9123; public static void main(String[] args) throws IOException { // 创建IoService IoAcceptor acceptor = new NioSocketAcceptor(); // 添加Filter: acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset .forName("UTF-8")))); // 设置Handler acceptor.setHandler(new TimeServerHandler()); // 其它配置 acceptor.getSessionConfig().setReadBufferSize(2048); acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 启动服务 acceptor.bind(new InetSocketAddress(PORT)); } }
运行上面程序后,可以在cmd(或者使用终端)上使用下面命令测试。
telnet 127.0.0.1 9123
编写网络程序,一般都分为Server/Clinet。Mina为Server端程序提供的IoService实现是IoAcceptor,为客户端提供的实现是IoConnector。
Server端实现:
Clint端实现:
Session,这个词都不陌生。在Web开发中有Session的概念,在Hibernate中有Session的概念。Session就是对连接会话的封装,存储一些状态信息。同样在Mina中也有Session的概念。
在Mina会为每一个连接创建session,并存储在内存中,直到与Client之间连接断开。
UDP协议是无连接的,这样成立吗?在Java NIO的API中有DatagramChannel、SocketChannel。所以Mina的NioSession中,就将封装了Channel。
过滤器的作用,以及它的运行原理,开发过Web应用程序的人应该都是知道的。IoFilter的原理与Web应用中的Filter是一样的,这里就不在赘述。
如果不清楚Filter的原理,可以参考这里。
使用过滤器可以做哪些事情呢?
1、 日志记录
2、 根据协议对数据进行编码、解码。
3、 SSL处理
等等。
上面示例中的TextLine协议过滤器,就是将用户请求数据解码成一行一行的数据。
目前已有过滤器有:
当然了,也可自定义Filter了。
IoHandler是在最后一个Filter中调用的。主要实现的方法是messageReceived。
就是写你接收到数据后要处理的业务逻辑。例如示例。
标签:
原文地址:http://www.cnblogs.com/f1194361820/p/4602204.html