Java——Mina 服务端和客户端实现输出HelloWorld

一、mina是什么
  官方解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
  官网地址:http://mina.apache.org/

  源码分析:http://my.oschina.net/ielts0909/blog/90355/


参考地址:http://www.blogjava.net/qileilove/archive/2013/12/17/407662.html


二、mina的工作流程

基于 Apache MINA 的网络应用有三个层次,分别是 I/O 服务、I/O 过滤器和 I/O 处理器:

_ I/O 服务:I/O 服务用来执行实际的 I/O 操作。Apache MINA 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UDP/IP、串口和虚拟机内部的管道等。开发人员也可以实现自己的 I/O 服务。

_ I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。I/O 过滤器用来完成这两者之间的转换。I/O 过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个 I/O 过滤器串联起来,形成 I/O 过滤器链。

_ I/O 处理器:I/O 处理器用来执行具体的业务逻辑。对接收到的消息执行特定的处理。

创建一个完整的基于 Apache MINA 的网络应用,需要分别构建这三个层次。Apache MINA 已经为 I/O 服务和 I/O 过滤器提供了不少的实现,因此这两个层次在大多数情况下可以使用已有的实现。I/O 处理器由于是与具体的业务相关的,一般来说都是需要自己来实现的。

事件驱动的 API

Apache MINA 提供的是事件驱动的 API。它把与网络相关的各种活动抽象成事件。网络应用只需要对其感兴趣的事件进行处理即可。事件驱动的 API 使得基于 Apache MINA 开发网络应用变得比较简单。应用不需要考虑与底层传输相关的具体细节,而只需要处理抽象的 I/O 事件。比如在实现一个服务端应用的时候,如果有新的连接进来,I/O 服务会产生sessionOpened这样一个事件。如果该应用需要在有连接打开的时候,执行某些特定的操作,只需要在 I/O 处理器中此事件处理方法sessionOpened中添加相应的代码即可。


参考地址:http://blog.csdn.net/jacman/article/details/7432981


三、创建Mina的服务端和客户端,输出HelloWorld

1.需要引入的类库



2.服务端代码

2.1.创建Server

[java] view plain copy
  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;">package com.ict.minaServer;  
  2.   
  3. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  4. import org.apache.mina.core.session.IoSession;  
  5. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  6. import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
  7. import org.apache.mina.transport.socket.SocketAcceptor;  
  8. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  9.   
  10. import java.io.IOException;  
  11. import java.net.InetSocketAddress;  
  12.   
  13. /** 
  14.  * Created by chenlong on 2016/8/29. 
  15.  */  
  16. public class MinaServer {  
  17.     public static void main(String[] args)  
  18.     {  
  19.         //创建ServerScoket  
  20.         SocketAcceptor acceptor = new NioSocketAcceptor();  
  21.   
  22.         //设置传输方式(这里设置成对象传输模式,还有很多的类型后面会具体讲到  
  23.         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
  24.         ProtocolCodecFilter filter = new ProtocolCodecFilter(  
  25.                 new ObjectSerializationCodecFactory());  
  26.         chain.addLast("objectFilter", filter);  
  27.   
  28.         MinaServerHanlder minaServerHanlder=new MinaServerHanlder();  
  29.         // 添加消息处理  
  30.         acceptor.setHandler(minaServerHanlder);  
  31.   
  32.         // 开启服务器  
  33.         int bindPort = 10026;  
  34.         try {  
  35.             acceptor.bind(new InetSocketAddress(bindPort));  
  36.         } catch (IOException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.   
  40.   
  41. //        minaServerHanlder.messageSent();  
  42.     }  
  43. }</span>  


2.2.创建消息处理类

[java] view plain copy
  1. package com.ict.minaServer;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IdleStatus;  
  5. import org.apache.mina.core.session.IoSession;  
  6.   
  7. /** 
  8.  * Created by chenlong on 2016/8/29. 
  9.  */  
  10.   
  11. public class MinaServerHanlder  extends IoHandlerAdapter {  
  12.     private int count = 0;  
  13.   
  14.     // 由底层决定是否创建一个session  
  15.     public void sessionCreated(IoSession session) {  
  16.         System.out.println("新客户连接");  
  17.     }  
  18.   
  19.     // 创建了session 后会回调sessionOpened  
  20.     public void sessionOpened(IoSession session) throws Exception {  
  21.         count++;  
  22.         System.out.println("第 " + count + " 个 client 登陆!address: : "  
  23.                 + session.getRemoteAddress());  
  24.   
  25.         sessionWrite(session);  
  26.     }  
  27.   
  28. //    获取session连接,用来随时向客户端发送消息  
  29.     public void sessionWrite(IoSession session) throws Exception {  
  30.         session.write("Sent by Server1"+1);  
  31.         session.write("Sent by Server1"+2);  
  32.     }  
  33.   
  34.     // 当收到了客户端发送的消息后会回调这个函数  
  35.     public void messageReceived(IoSession session, Object message)  
  36.             throws Exception {  
  37.         System.out.println("服务器收到客户端发送指令 :" );  
  38.         System.out.println(message);  
  39.   
  40. //        session.write("Sent by Server1");  
  41.   
  42. //        messageSent(session,"Sent by Server2");  
  43.     }  
  44.   
  45.     public void messageSent(IoSession session, Object message) {  
  46.         System.out.println("message send to client");  
  47.   
  48. //        session.write("Sent by Server3");  
  49.     }  
  50.   
  51.     // session 关闭调用  
  52.     public void sessionClosed(IoSession session) {  
  53.         System.out.println("one client disconnect");  
  54.         session.closeNow();  
  55.     }  
  56.   
  57.     // session 空闲的时候调用  
  58.     public void sessionIdle(IoSession session, IdleStatus status) {  
  59.         System.out.println("connect idle");  
  60.     }  
  61.   
  62.     // 异常捕捉  
  63.     public void exceptionCaught(IoSession session, Throwable cause) {  
  64.         System.out.println("throws exception");  
  65.     }  
  66. }  

3.客户端代码

3.1.创建客户端

[java] view plain copy
  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;">package com.ict.minaClient;  
  2.   
  3.   
  4. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  5. import org.apache.mina.core.future.ConnectFuture;  
  6. import org.apache.mina.core.session.IoSession;  
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  8. import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
  9. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  10.   
  11. import java.net.InetSocketAddress;  
  12.   
  13. /** 
  14.  * Created by chenlong on 2016/8/29. 
  15.  */  
  16. public class MinaClient {  
  17.     public static void main(String[] args) {  
  18.         // TODO Auto-generated method stub  
  19.         // 创建Socket  
  20.         NioSocketConnector connector = new NioSocketConnector();  
  21.         //设置传输方式  
  22.         DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
  23.         ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());  
  24.         chain.addLast("objectFilter", filter);  
  25.   
  26.         //设置消息处理  
  27.         connector.setHandler(new MinaClientHanlder());  
  28.         //超时设置  
  29.         connector.setConnectTimeoutCheckInterval(30);  
  30.         //连接  
  31.         ConnectFuture cf = connector.connect(new InetSocketAddress("localhost"10026));  
  32.         cf.awaitUninterruptibly();  
  33.         cf.getSession().getCloseFuture().awaitUninterruptibly();  
  34.   
  35.         connector.dispose();  
  36.   
  37.     }  
  38. }</span>  

3.2.创建客户端消息处理

[java] view plain copy
  1. <span style="font-family:'KaiTi_GB2312';font-size:18px;">package com.ict.minaClient;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IoSession;  
  5.   
  6. /** 
  7.  * Created by chenlong on 2016/8/29. 
  8.  */  
  9. public class MinaClientHanlder extends IoHandlerAdapter {  
  10.     public void sessionOpened(IoSession session) throws Exception {  
  11.         System.out.println("客户端登陆");  
  12.         session.write("HelloWorld");  
  13.   
  14. //        messageReceived(session,"");  
  15.         for (int i = 0; i < 10; i++) {  
  16.             session.write("p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"  
  17.                     + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"  
  18.                     + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"  
  19.                     + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900");  
  20.         }  
  21.     }  
  22.   
  23.     public void sessionClosed(IoSession session)  
  24.     {  
  25.         System.out.println("client close");  
  26.     }  
  27.   
  28.     public void messageReceived(IoSession session , Object message)throws Exception  
  29.     {  
  30.         System.out.println("客户端接受到了消息"+message) ;  
  31.   
  32. //        session.write("Sent by Client1");  
  33.     }  
  34. }</span>  
阅读更多
个人分类: java
上一篇Mina框架入门demo
下一篇Java后端WebSocket的Tomcat实现
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭