`

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服务端客户端示例程序"中,我们可能找到了一系列用于展示如何使用Mina框架搭建服务端和客户端的代码示例。下面我们将深入探讨Mina的核心概念以及如何通过这些示例进行学习和实践。 1. **非阻塞I/O**:...

    mina server开发服务端/客户端代码

    本压缩包包含的是使用Mina Server开发的服务端和客户端的源代码示例,非常适合初学者和有经验的开发者用来学习和参考。 服务端开发: 在Mina中,服务端通常通过创建一个Acceptor来监听特定的端口,等待客户端的连接...

    mina2服务端客户端实例,保证能够正常运行

    MINA提供了一种与传输协议无关的抽象层,使得开发者可以轻松地构建基于TCP/IP、UDP/IP或其他I/O协议的服务端和客户端应用。 标题中提到的"mina2服务端客户端实例"是指使用Apache MINA 2版本创建的一个工作示例,该...

    mina及时推送客户端服务端实现

    5. **Android-tcp-long-connection-based-on-Apache-mina-master**:这个项目名表明它是一个基于Apache MINA实现的Android客户端与服务器之间的TCP长连接示例。在Android环境中,由于系统可能因内存管理等原因关闭...

    MINA 服务端和客户端demo

    MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,提供了一套高度可扩展和高性能的网络应用程序框架,用于构建服务器和客户端应用。它简化了网络编程,特别是TCP/IP...

    apache mina 简单示例

    在"apache mina 简单示例"中,我们通常会涉及以下几个关键概念: 1. **项目设置**:首先,你需要在你的开发环境中集成Apache Mina库。这可以通过在Maven或Gradle的依赖管理中添加Mina的相关依赖来实现。例如,在...

    apache_mina_maven 客户端测试程序

    Apache MINA 是一个高度可扩展的网络应用框架,主要用于简化开发高性能、高可用性的网络服务器和客户端应用程序。MINA 提供了一种与传输协议无关的抽象层,允许开发者使用相同的 API 来处理 TCP/IP(如 Socket)和 ...

    Apache mina2学习笔记DEMO

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为高性能、异步网络应用程序设计。MINA 提供了一套高级的网络通信抽象层,简化了开发过程,特别是对于处理TCP/IP和UDP/IP...

    apache-mina例子

    这个例子是关于如何使用Apache Mina实现一个简单的服务端和客户端通信的示例。在这个案例中,`MinaTimeServer`是服务端程序,它负责监听客户端的连接请求,并发送时间信息;而`MinaClient`则是客户端程序,它连接到...

    android mina 即时通讯 服务端客户端代码

    描述中提到的"安装mina下的客户端到手机上就能实现通信",表明客户端应用已经包含了Mina的相关库,并且实现了与服务端的连接逻辑。 标签中提到了"QQ",这暗示了我们的即时通讯系统可能需要实现类似QQ的功能,比如...

    mina框架中socket使用,有服务端和客户端。

    本项目提供了服务端和客户端的示例,使得开发者能够更好地理解和应用MINA框架。 1. **MINA框架**:MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、易用的网络应用框架,它为开发者...

    mina2推送demo服务端

    Apache Mina是一个开源的Java网络应用框架,它简化了开发高性能和高可用性的网络服务器和客户端应用程序的工作。Mina提供了异步事件驱动的网络应用程序编程接口(API),支持多种协议如TCP/IP、UDP/IP以及SSL/TLS等...

    mina 同步客户端,异步客户端

    1. **MINA服务端**:在MINA中,服务端通常被称为Acceptor。它负责监听指定的网络端口,接收客户端的连接请求,并为每个连接创建一个Session。Session是MINA的核心概念,它代表了服务端与客户端之间的一个连接实例。...

    mina简单示例

    描述中的"mina简单客户端服务端示例"意味着我们将探讨如何使用Mina来创建一个基本的通信环境,包括一个能够发起连接的客户端和一个接收连接的服务端。这两个组件是任何网络通信系统的基础,通过它们,数据可以在不同...

    Apache Mina简单实例

    通过阅读和实践这个简单的Apache Mina示例,你可以了解其基本的工作原理,进一步深入学习,将有助于构建高效、可扩展的网络服务。此外,标签中的“源码”提示我们,可以查看Apache Mina的源代码来学习其内部实现,这...

    一个Apache MINA使用案例源代码ApacheMina

    Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,主要设计用于简化开发服务器端的高性能网络应用。这个框架提供了一种抽象层,允许开发者使用相同的API处理多种不同的传输协议,如TCP/IP、UDP/IP以及SSL/...

    mina项目示例

    这个“mina项目示例”很可能是通过MINA框架实现了一个客户端和服务端的通信示例。它可能包括以下部分: 1. **服务端启动**:创建MINA服务器端,监听指定端口,设置相应的处理器和过滤器链。 2. **客户端连接**:...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

    使用-Apache-MINA-2-开发网络应用

    为了更好地理解 Apache MINA 2 的架构及其组件,这里介绍一个简单的示例应用——计算器服务。 1. **I/O 服务**:该应用使用 TCP/IP 协议,在指定端口监听并接受客户端的连接请求。Apache MINA 2 提供了基于 Java ...

Global site tag (gtag.js) - Google Analytics