博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache MINA (2) Hello World!
阅读量:6494 次
发布时间:2019-06-24

本文共 8565 字,大约阅读时间需要 28 分钟。

了解完Apach MINA的一些基本概念

,开始进入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. 4.0.0
    example
    example
    1.0
    GBK
    org.apache.mina
    mina-core
    2.0.4
    org.slf4j
    jcl-over-slf4j
    1.6.1
    org.slf4j
    slf4j-nop
    1.6.1

 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 

转载地址:http://mvyyo.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
CoreOS 手动更新
查看>>
golang 分页
查看>>
再论机械式针对接口编程
查看>>
25 个 Linux 性能监控工具
查看>>
C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想
查看>>
Tengine-2.1.1 ngx_http_concat_module 400问题
查看>>
Windows中挂载安装ISO文件
查看>>
Wayland 1.0发布
查看>>
golang的goroutine是如何实现的?
查看>>
乐视云基于Kubernetes的PaaS平台建设
查看>>
R 学习笔记《十》 R语言初学者指南--图形工具
查看>>
PHP通过读取DOM抓取信息
查看>>
DICOM医学图像处理:DICOM网络传输
查看>>
nio和传统Io的区别
查看>>
移动端网页布局中需要注意事项以及解决方法总结
查看>>
(原创)Linux下查看系统版本号信息的方法
查看>>
oracle
查看>>
redis使用过程中主机内核层面的一些优化
查看>>
我也要谈谈大型网站架构之系列(2)——纵观历史演变(下)
查看>>