日期:2014-05-17  浏览次数:20992 次

Apache Mina – 简单的客户端/服务端应用示例
转自http://javasight.net/2011/05/simple-client-server-application-using-mina/

Introduction介绍

Mina的缩写意思是”Multipurpose Infrastructure for Network Applications(多用途网络应用基础设施)”,它用于开发高度可扩展和高性能网络应用的网络应用框架。在本文中,让我们看看如何使用Apache Mina2.0.x来创建一个简单的客户端服务器端(c/s)应用。

所需的JAR包

Apache Mina 2.0.x jars
slf4j-api.jar
slf4k-jdk14.jar

服务端部分

对服务器端部分,我们需要使用MinaServer和MinaServerHandler两个类。MinaServer类包含了主方法和名为IoAcceptor的借口来接受来自客户端的进入连接,IoAcceptor用于向handler触发相应的事件。 我们使用了两个过滤器,第一个是LoggingFilter,用于记录所有的事件,第二个是ProtocolCOdecFilter,用于转换进入的ByteBuffer到报文的POJO。MinaServer的类代码如下:

MinaServer.java

package net.javasight.mina;

/**
 * @author javasight
 */
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.service.IoAcceptor;
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 MinaServer {
        private static final int PORT = 1234;

        public static void main(String[] args) throws IOException {
                IoAcceptor acceptor = new NioSocketAcceptor();
                acceptor.getFilterChain().addLast("logger", new LoggingFilter());
                acceptor.getFilterChain().addLast(
                                "codec",
                                new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                                                .forName("UTF-8"))));

                acceptor.setHandler(new MinaServerHandler());
                acceptor.getSessionConfig().setReadBufferSize(2048);
                acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
                acceptor.bind(new InetSocketAddress(PORT));
        }
}

接着我们创建一个名为MinaServerHandler自定义handler,它包含了4个方法。第一个方法是sessionOpened在session打开后被调用, 它用于设置session的空闲时间。第二个方法是receiveMessage,用于接收由客户端发送的消息。 其他两个方法sessionIdle用于在session空闲10秒钟后关闭该session,第四个方法exceptionCaught用于在异常发生时关闭session。MinaServerHandler类的代码如下:

MinaServerHandler.java

package net.javasight.mina;

import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * @author javasight
 */
public class MinaServerHandler extends IoHandlerAdapter {

        private final Logger logger = Logger.getLogger(getClass());

        @Override
        public void sessionOpened(IoSession session) {
                // set idle time to 10 seconds
                session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
                session.setAttribute("Values: ");
        }

        @Override
        public void messageReceived(IoSession session, Object message) {
                logger.info("Message received in the server..");
                logger.info("Message is: " + message.toString());
        }

        @Override
        public void sessionIdle(IoSession session, IdleStatus status) {
                logger.info("Disconnecting the idle.");
                // disconnect an idle client
                session.close();
        }

        @Override
        public void exceptionCaught(IoSession session, Throwable cause) {
                // close the connection on exceptional situation
                session.close();
        }
}


客户端部分

对于客户端部分MinaClient和MinaClientHandler类被我们所使用。在MinaClient类中,IoConnector借口用于与服务器端进行交互并向handler中触发事件。 向服务端一样,同样的LoggingFilter、ProtocolCodecFilter也被使用了。名为ConnectFuture接口被用于