【翻译:Apache MINA User Guide】Chapter 2 - Basics

 

 本章节我们将详细介绍基于Apache MINA的C/S架构的java应用

 

基于MINA的应用架构——MINA based Application Architecture

      最常见的问题应该是:基于MINA的应用程序是什么样子,本文中我们将看到基于MINA的应用程序是什么样子,并试图收集一些介绍MINA的资料

      基于MINA的应用程序大致结构如下图:

 

【翻译:Apache MINA User Guide】Chapter 2 - Basics_第1张图片

 

基于MINA的应用程序被分为三层:

 

  • I/O Service - Performs actual I/O
  •           执行真实的I/O草错

  • I/O Filter Chain - Filters/Transforms bytes into desired Data Structures and vice-versa
  •           过滤器链,将输入字节流转换成应用所需数据结构,反之响应输出时将数据转为字节流……

  • I/O Handler - Here resides the actual business logic
  •          真实的业务逻辑,实现特定的handler,覆写其中的方法即可实现自己的业务逻辑。

    故,如何创建一个基于MINA的应用可以分为以下三步:

    1. Create I/O service

            选择一个已经存在的Services (如:(*Acceptor),或者创建自己的Services

    1. Create Filter Chain

             使用类库中共自带的Filter,或者为请求/响应(request/response )创建一个自定义的Filter。 

    1. Create I/O Handler

              编写自己的业务逻辑,处理不同的消息

     

    程序示例:

     

    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
    

     

    然手虽然敲击键盘将会看到服务端有消息收到

    【翻译:Apache MINA User Guide】Chapter 2 - Basics_第2张图片

    你可能感兴趣的:(apache,数据结构,应用服务器,socket,Mina)