Apache MINA (2) Hello World!

了解完Apach MINA的一些基本概念Apache MINA (1) 简介

,开始进入MINA相关的代码学习,以一个简单HelloWorld程序开始,完成客户端与服务端之间的通讯。

准备工作:

org.apache.mina 版本4.0

org.slf4j 1.6.1 (Simple Logging Facade for Java)mina所使用的日志框架,该版本是与mina4.0匹配的版本。

我是用maven管理项目依赖的,使用apache-maven-3.0.4

IDE:IntelliJ IDEA 10.0.3

开始HelloWorld:

1.maven的pom文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>  
    
        <groupId>example</groupId>
        <artifactId>example</artifactId>
        <version>1.0</version>  
    
        <properties>
            <project.build.sourceEncoding>GBK</project.build.sourceEncoding>
        </properties>  
    
        <dependencies>
            <dependency>
              <groupId>org.apache.mina</groupId>
              <artifactId>mina-core</artifactId>
              <version>2.0.4</version>
            </dependency>  
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
                <version>1.6.1</version>
            </dependency>  
    
            <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-nop</artifactId>
              <version>1.6.1</version>
            </dependency>  
    
        </dependencies>    
    
    </project>  

 2. 服务器代码:

a) 首先实现服务端的IoHandler代码SimpleMinaServerHandler。主要功能是打印客户端写入的信息,统计客户端的请求次数以及返回当前客户端是第几次访问。

  1. package com.chiyan.apach.mina.server;  
    
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;  
    
    import java.util.concurrent.atomic.AtomicInteger;  
    
    /**
     * Created by IntelliJ IDEA.
     * 简单的消息处理器
     * User: chiyan
     * Date: 12-7-19
     * Time: 上午12:19
     */
    public class SimpleMinaServerHandler extends IoHandlerAdapter {  
    
        private AtomicInteger count = new AtomicInteger(0);  
    
        /**
         * 当一个客户端连接进入时
         */
        @Override
        public void sessionOpened(IoSession session) throws Exception {  
    
            System.out.println("client connection : " + session.getRemoteAddress());  
    
        }  
    
        /**
         * 当一个客户端关闭时
         */
        @Override
        public void sessionClosed(IoSession session) throws Exception {  
    
            System.out.println("client disconnection : " +session.getRemoteAddress() + " is Disconnection");  
    
        }  
    
        /**
         * 当接收到客户端的信息
         *
         * @param session
         * @param message
         * @throws Exception
         */
        @Override
        public void messageReceived(IoSession session, Object message)
                throws Exception {  
    
            String str = (String)message;  
    
            // 打印客户端
            System.out.println("receive client message : [ " + str +" ]");  
    
            // 回写消息给客户端
            session.write(count.incrementAndGet());  
    
        }  
    
    }  

b) 搭建服务端 MainServer:

  1. package com.chiyan.apach.mina.server;  
    
    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
    import org.apache.mina.core.session.IdleStatus;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.SocketAcceptor;
    import org.apache.mina.transport.socket.SocketSessionConfig;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
    
    import java.io.IOException;
    import java.net.InetSocketAddress;  
    
    /**
     * Created by IntelliJ IDEA.
     * User: chiyan
     * Date: 12-7-19
     * Time: 上午12:27
     */
    public class MainServer {  
    
        // 服务器端口
        private static final int SERVER_PORT = 8899;  
    
        public static void main(String[] args) throws Exception {  
    
            //创建一个非阻塞的Server端Socket,用NIO
            SocketAcceptor acceptor = new NioSocketAcceptor();  
    
            // 定义每次接收数据大小
            SocketSessionConfig sessionConfig = acceptor.getSessionConfig();
            sessionConfig.setReadBufferSize(2048);  
    
            //创建接受数据的过滤器
            DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
    
            //设定这个过滤器将一行一行(/r/n)的读取数据
            chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));  
    
            //设定服务器端的消息处理器: 一个 SimpleMinaServerHandler 对象
            acceptor.setHandler(new SimpleMinaServerHandler());  
    
            //绑定端口,启动服务器
            try {
                acceptor.bind(new InetSocketAddress(SERVER_PORT));
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Mina server is listing port:" + SERVER_PORT);  
    
        }  
    
    }  

 3. 客户端代码

a)首先实现客户端的IoHandler代码SimpleMinaClientHandler。主要功能是向服务端写消息,接收到服务端计数后再回写服务端。

  1. package com.chiyan.apach.mina.client;  
    
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IdleStatus;
    import org.apache.mina.core.session.IoSession;  
    
    /**
     * Created by IntelliJ IDEA.
     * User: chiyan
     * Date: 12-7-19
     * Time: 上午12:31
     */
    public class SimpleMinaClientHandler extends IoHandlerAdapter {  
    
        /**
         * 当客户端接受到消息时
         */
        @Override
        public void messageReceived(IoSession session, Object message) throws Exception {  
    
            Integer num = Integer.valueOf((String)message);  
    
            if(num == null || num >10){
                session.close(true);
                return;
            }  
    
            System.out.println("receive server num : [ " + num + " ]");  
    
            Thread.sleep(1000);  
    
            session.write("client received num is : " + num + ", request next num");  
    
        }  
    
        /**
         * 当一个客户端被关闭时
         */
        @Override
        public void sessionClosed(IoSession session) throws Exception {
            System.out.println("client disconnect");
        }  
    
        /**
         * 当一个客户端连接进入时
         */
        @Override
        public void sessionOpened(IoSession session) throws Exception {  
    
            System.out.println("create connection to server :" + session.getRemoteAddress());
            session.write("client started");
            session.write("Hello World!");
        }  
    
    }  

b)搭建客户端MainClient

  1. package com.chiyan.apach.mina.client;  
    
    import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
    import org.apache.mina.core.future.ConnectFuture;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;  
    
    import java.net.InetSocketAddress;  
    
    /**
     * Created by IntelliJ IDEA.
     * User: chiyan
     * Date: 12-7-19
     * Time: 上午12:40
     */
    public class MainClient {  
    
        /**
         * 服务器ip
         */
        private static final String SERVER_IP="127.0.0.1";  
    
        /**
         * 服务器端口
         */
        private static final int SERVER_PORT=8899;  
    
        public static void main(String []args){  
    
            //Create TCP/IP connection
            NioSocketConnector connector = new NioSocketConnector();  
    
            //创建接受数据的过滤器
            DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
    
            //设定这个过滤器将一行一行(/r/n)的读取数据
            chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));  
    
            //服务器的消息处理器:一个 SimpleMinaClientHandler 对象
            connector.setHandler(new SimpleMinaClientHandler());  
    
            //set connect timeout
            connector.setConnectTimeoutMillis(30 * 1000);  
    
            //连接到服务器:
            ConnectFuture cf = connector.connect(new InetSocketAddress(SERVER_IP,SERVER_PORT));  
    
            cf.awaitUninterruptibly();  
    
            cf.getSession().getCloseFuture().awaitUninterruptibly();  
    
            connector.dispose();
        }
    }  

 运行程序:

1.服务端打印:

  1. Mina server is listing port:8899  
  2. client connection : /127.0.0.1:50497  
  3. receive client message : [ client started ]  
  4. receive client message : [ Hello World! ]  
  5. receive client message : [ client received num is : 1, request next num ]  
  6. receive client message : [ client received num is : 2, request next num ]  
  7. receive client message : [ client received num is : 3, request next num ]  
  8. receive client message : [ client received num is : 4, request next num ]  
  9. receive client message : [ client received num is : 5, request next num ]  
  10. receive client message : [ client received num is : 6, request next num ]  
  11. receive client message : [ client received num is : 7, request next num ]  
  12. receive client message : [ client received num is : 8, request next num ]  
  13. receive client message : [ client received num is : 9, request next num ]  
  14. receive client message : [ client received num is : 10, request next num ]  
  15. client disconnection : /127.0.0.1:50497 is Disconnection  

 2.客户端打印:

  1. create connection to server :/127.0.0.1:8899  
  2. receive server num : [ 1 ]  
  3. receive server num : [ 2 ]  
  4. receive server num : [ 3 ]  
  5. receive server num : [ 4 ]  
  6. receive server num : [ 5 ]  
  7. receive server num : [ 6 ]  
  8. receive server num : [ 7 ]  
  9. receive server num : [ 8 ]  
  10. receive server num : [ 9 ]  
  11. receive server num : [ 10 ]  
  12. client disconnect 
时间: 2024-08-07 07:04:59

Apache MINA (2) Hello World!的相关文章

使用 Apache MINA 2 开发网络应用

Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架.它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP.UDP/IP.串口和虚拟机内部的管道等传输方式.Apache MINA 2 可以作为开发网络应用程序的一个良好基础.下面将首先简单介绍一下 Apache MINA 2. Apache MINA 2 介绍 Apache MINA 是 Apache 基金会的一个开源项目,目前最新的版本是 2.0.0-RC1.本文中使用的版本是 2.0.0-M6.下面首

Apache Mina通信框架架构与应用

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步 IO 默认使用的是 JAVA NIO 作为底层支持)操作的编程模型.从官网文档"MINA based Application Architecture"中可以看到Mina作为一

【APACHE MINA2.0开发之一】搭建APACHE MINA框架并实现SERVER与CLIENT端的简单消息传递!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/apache-mina/831.html Hibernate系列学习阶段到此结束了,那么紧接着进入Apache Mina的开发学习,很多童鞋在微薄和QQ中疑问Himi为什么突然脱离游戏开发了,嘿嘿,其实可能更多的童鞋已经看出来了,Himi在偏向服务器Server端开发了,Hibernate.MySQL等都是为了Server端Mina开发而做的

Apache MINA (3) NioSocketAcceptor初始化

上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现). 服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系. IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象.IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话.

解决 Missing artifact org.apache.mina:mina-core:bundle:2.0.9

Maven 项目中引用了 MINA 的依赖,包如下错误: Missing artifact org.apache.mina:mina-core:bundle:2.0.9 依赖 项目引入的 MINA 依赖如下: <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>${version.mina}</ve

Apache MINA (1) 简介

简介: Apache MINA(Multipurpose Infrastructure for Network Applications) 是一个网络应用框架,有助于用户非常方便地开发高性能.高伸缩性的网络应用.它通过Java NIO提供了一个抽象的.事件驱动的.异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API. Mina 框架: IoService IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象.IoServer用来执行真正的 I/O 操作,以及管

Apache Mina 2.x 超详实例

最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架. 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序:它提供了一个抽象的.事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/

Apache Mina使用手记(一)

Apache Mina使用手记(一) 分类: JAVA 2009-03-11 20:17 6069人阅读 评论(5) 收藏 举报 minaapacheslf4jloggingjavavb 1.Apache Mina是一个高性能的基础网络构架平台,构建在java NIO的基础上 2.Mina使用了SLF4J做为日志记录器,全称Simple Logging Facade for Java,它是一个日志门面,只负责为客户端提供应用接口,实际的日志记录由Log4j/JUL等日志记录器实现.如下图所示:

Apache Mina使用手记(二)

Apache Mina使用手记(二) 分类: JAVA 2009-03-11 21:28 8707人阅读 评论(4) 收藏 举报 minaapachelog4jexceptionslf4jmicrosoft  Mina主要是作为服务器端底层框架来实现数据处理,它的实现很简单,如下例所示: package com.gftech.mytool.mina; import java.io.IOException; import java.net.InetSocketAddress; import jav

Apache Mina使用手记(三)

Apache Mina使用手记(三) 分类: JAVA 2009-03-13 20:10 12752人阅读 评论(0) 收藏 举报 minaapacheexceptionsessionlog4jslf4j 在上一篇中,通过一个简单的例子,得以管中窥豹,了解了Mina的基本编写方法.在MinaTimeServer演示程序中,我们添加了两个过滤器,一个是日志过滤器LoggingFilter,一个是文本编解码过滤器.前者实现日志信息的自动处理,后者实现对按行读写的文本数据的编码和解码. 其中Loggi