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

14人阅读 评论(0) 收藏 举报
分类:
一、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>  
查看评论

征服Node.js 7.x视频课程(8):HTTP服务端和客户端技术

-
  • 1970年01月01日 08:00

Mina学习(1):mina实现简单服务端与客户端

mina是一个基于javaNio网络通信应用框架,使用mina可以轻松的搭建服务器,接下来将使用mina搭建一个小型的服务端 jar下载: 源代码–MinaServer.java package se...
  • c1481118216
  • c1481118216
  • 2016-10-05 13:13:58
  • 1657

Apache MINA客户端服务器简单实例

其实客户端和服务器是相对的,互发消息,在底层当然是互为服务器客户端.只是这里为了封装区分开了.首先需要导入的包:log4j.jarmina-core-2.0.4.jar slf4j-api-1.6.3...
  • lsh6688
  • lsh6688
  • 2013-07-31 18:25:32
  • 11785

Mina服务端客户端心跳机制

心跳: 1、自定义数据包,在业务逻辑里接收,客户端判断读写空闲,大于一个半的心跳之后,在空闲处理里将session关闭,注册的监听里断线重连 2、tcp的keepalive,服务端、客户端相互发确...
  • hannuotayouxi
  • hannuotayouxi
  • 2017-12-01 12:20:47
  • 185

Mina基础框架及客户端-服务端框架对应实现例子

原文地址:Mina基础(Apache user guide Chapter2 basics)1.1.1. Mina应用架构    被问最多的问题就是,“Mina的基础应用看起来是什么样的呢?”。通过这...
  • boonya
  • boonya
  • 2016-06-01 18:18:12
  • 3771

MINA客户端与服务端通信实例

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络...
  • u013323571
  • u013323571
  • 2014-03-10 14:08:08
  • 875

mina框架客户端与服务端+java+maven

import org.apache.mina.core.RuntimeIoException; import org.apache.mina.core.future.ConnectFuture; im...
  • ShineChen2016
  • ShineChen2016
  • 2016-09-06 15:13:35
  • 3347

Mina2框架--服务端与客户端通信

mina服务管理器package com.zxtx.apps.traffic.server;import org.apache.commons.lang.StringUtils; import org...
  • zhuwei_clark
  • zhuwei_clark
  • 2016-11-24 15:04:42
  • 1624

Android 使用Mina的Nio实现客户端服务器通信

1、添加jar包到客户端与服务器端 2、服务器端public class TcpServer { public static void main(String[] args) { ...
  • lovoo
  • lovoo
  • 2016-06-30 21:41:02
  • 1264

mina整合spring ,服务端反向发送消息到客户端 完整实例

之前的项目需要用到mina,实现的功能主要是:服务端主动发送消息到客户端,这个的服务端为外网的tomcat,客户端为内网的tomcat,由于无法知道内网tomcat 的地址,也就不能直接通过http的...
  • u013614451
  • u013614451
  • 2014-11-02 16:26:24
  • 7252
    个人资料
    等级:
    访问量: 5334
    积分: 259
    排名: 30万+