本章节我们将详细介绍基于Apache MINA的C/S架构的java应用
基于MINA的应用架构——MINA based Application Architecture
最常见的问题应该是:基于MINA的应用程序是什么样子,本文中我们将看到基于MINA的应用程序是什么样子,并试图收集一些介绍MINA的资料
基于MINA的应用程序大致结构如下图:
基于MINA的应用程序被分为三层:
执行真实的I/O草错
过滤器链,将输入字节流转换成应用所需数据结构,反之响应输出时将数据转为字节流……
真实的业务逻辑,实现特定的handler,覆写其中的方法即可实现自己的业务逻辑。
故,如何创建一个基于MINA的应用可以分为以下三步:
选择一个已经存在的Services (如:(*Acceptor),或者创建自己的Services
使用类库中共自带的Filter,或者为请求/响应(request/response )创建一个自定义的Filter。
编写自己的业务逻辑,处理不同的消息
程序示例:
package com.aceway.apache.mina.server; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; 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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 创建一个简单的Mina应用程序服务器端的常用步骤 * @author niumd * */ public class MinaTimeServer { private static Logger log = LoggerFactory.getLogger(MinaTimeServer.class); public static void main(String[] args) { IoAcceptor acceptor = new NioSocketAcceptor(); try { DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); chain.addLast("logger", new LoggingFilter()); //接受字符串格式的消息 chain.addLast("codec", new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8")))); //添加定制化实现业务逻辑的handler acceptor.setHandler(new MyIoHandler()); //绑定至8080端口 acceptor.bind(new InetSocketAddress(8080)); } catch (IOException e) { log.error("mina error", e); } } } /** * 此类处理真正的业务逻辑 * @author niumd * */ class MyIoHandler extends IoHandlerAdapter{ /** * 日志 */ private static Logger log = LoggerFactory.getLogger(MyIoHandler.class); /** * 异常情况下调用此方法 */ @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { super.exceptionCaught(session, cause); } /** * 收到客户端消息调用 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { log.info(message.toString()); } /** * 发送消息响应客户端时调用 */ @Override public void messageSent(IoSession session, Object message) throws Exception { super.messageSent(session, message); } /** * session关闭时调用 */ @Override public void sessionClosed(IoSession session) throws Exception { super.sessionClosed(session); } /** * session创建时调用 */ @Override public void sessionCreated(IoSession session) throws Exception { log.info("session create >>"+session); } /** * session空闲时调用 */ @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { log.info("session idle >>"+session); } /** * session打开时调用 */ @Override public void sessionOpened(IoSession session) throws Exception { log.info("session open >>"+session); } }
运行结果截图:
在dos窗口:telnet 127.0.0.1 8080
telnet 127.0.0.1 8080
然手虽然敲击键盘将会看到服务端有消息收到