`

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接口被用于处理异步的连接请求。MinaClient类代码如下:

MinaClient.java

package net.javasight.mina;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
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.NioSocketConnector;

/**
 * @author javasight
 */
public class MinaClient {
        private static final int PORT = 1234;

        public static void main(String[] args) throws IOException,
                        InterruptedException {

                IoConnector connector = new NioSocketConnector();
                connector.getSessionConfig().setReadBufferSize(2048);
                connector.getFilterChain().addLast("logger", new LoggingFilter());
                connector.getFilterChain().addLast(
                                "codec",
                                new ProtocolCodecFilter(new TextLineCodecFactory(Charset
                                                .forName("UTF-8"))));
                connector.setHandler(new MinaClientHandler("Hello Server.."));

                ConnectFuture future = connector.connect(new InetSocketAddress(
                                "172.108.0.12", PORT));
                future.awaitUninterruptibly();

                if (!future.isConnected()) {
                        return;
                }

                IoSession session = future.getSession();
                session.getConfig().setUseReadOperation(true);
                session.getCloseFuture().awaitUninterruptibly();
                System.out.println("After Writing");
                connector.dispose();
        }
}

对于handler,像服务器部分一样,sessionOpened、messageReceived和exceptionCaught方法同样被使用了。MinaClientHandler类代码如下:

MinaClientHandler.java

package net.javasight.mina;

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

/**
 * @author giftsam
 */
public class MinaClientHandler extends IoHandlerAdapter {
        private final Logger logger = Logger.getLogger(getClass());
        private final String values;
        private boolean finished;

        public MinaClientHandler(String values) {
                this.values = values;
        }

        public boolean isFinished() {
                return finished;
        }
        @Override
        public void sessionOpened(IoSession session) {
                session.write(values);
        }
        @Override
        public void messageReceived(IoSession session, Object message) {
                logger.info("Message received in the client..");
                logger.info("Message is: " + message.toString());
        }

        @Override
        public void exceptionCaught(IoSession session, Throwable cause) {
                session.close();
        }
}

现在是对之前代码进行测试的时候了,首先MinaServer应该先被启动然后启动MinaClient,代码的输出类似如下:

MinaServer – 输出

4412 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED
4412 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED
4449 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - RECEIVED: HeapBuffer[pos=0 lim=15 cap=2048: 48 65 6C 6C 6F 20 53 65 72 76 65 72 2E 2E 0A]
0    [NioProcessor-2] INFO  net.javasight.mina.MinaServerHandler  - Message received in the server..
1    [NioProcessor-2] INFO  net.javasight.mina.MinaServerHandler  - Message is: Hello Server..
14453 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - IDLE
10001 [NioProcessor-2] INFO  net.javasight.mina.MinaServerHandler  - Disconnecting the idle.
14457 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CLOSED

MinaClient – 输出

297 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CREATED
297 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - OPENED
325 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
10334 [NioProcessor-2] INFO org.apache.mina.filter.logging.LoggingFilter - CLOSED
After Writing

这就是所有内容。我希望本文清晰的解释了使用Apache Mina 2.0.x的简单的客户端/服务器应用。

分享到:
评论
1 楼 白天看黑夜 2017-10-20  
Apache Mina Server 2.0 中文参考手册(带目录),有需要的自己下载吧
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html

相关推荐

    mina开发示例

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...

    android消息推送(服务端+客户端)

    完整的android消息推送示例,该例子完善了androidpn开源项目,支持离线推送。androidpn基于Apache Mina开源框架,采用XMPP协议传输数据。 实例中,服务端支持weblogic跟tomcat应用服务器。

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包2

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包3

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包6

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包5

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包10

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包4

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包8

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包7

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包9

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包101

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    Java资源包01

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    JAVA上百实例源码以及开源项目源代码

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

Global site tag (gtag.js) - Google Analytics