push研究——Apache Mina探索初步

简介:

  虽然google为Android开发者提供了GCM实现push,但是因为需要系统安装了google play、google帐号、系统>2.2、google push服务器在国外等多种原因,在中国,Android上想实现push还需要自己努力。

        当前最火的开源push是基于xmpp协议的androidpn。androidpn是基于Mina框架的,所以这里从Mina框架开始入手。

Server

下面通过简单的例子来学习mina的使用。首先创建服务端,工程正使用了3个jar包

                       

看代码:

 
  1. public class HelloMina {  
  2.     private static final int PORT = 9125;  
  3.       /**  
  4.        * @param args  
  5.        * @throws IOException   
  6.        */ 
  7.       public static void main(String[] args) throws IOException {  
  8.           //创建一个非阻塞的server端Socket ,用NIO  
  9.           IoAcceptor acceptor = new  NioSocketAcceptor();    
  10.           acceptor.getFilterChain().addLast( "logger"new LoggingFilter() );  
  11.           acceptor.getFilterChain().addLast( "codec"new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
  12.           // 设定服务器端的消息处理器  
  13.           acceptor.setHandler(  new MinaServerHandler() );        
  14.           acceptor.getSessionConfig().setReadBufferSize( 2048 );  
  15.           acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );  
  16.           // 服务器端绑定的端口  启动服务  
  17.           acceptor.bind( new InetSocketAddress(PORT) );  
  18.                 
  19.         }  

HelloMina的处理器:

 

 
  1. /**  
  2.  * HelloMina的处理逻辑  
  3.  * @author zhangxy  
  4.  */ 
  5. class MinaServerHandler extends IoHandlerAdapter {  
  6.      @Override 
  7.         public void exceptionCaught( IoSession session, Throwable cause ) throws Exception{  
  8.             cause.printStackTrace();  
  9.             session.close();  
  10.         }  
  11.  
  12.         @Override 
  13.         public void messageReceived( IoSession session, Object message ) throws Exception  
  14.         {  
  15.             String str = message.toString();  
  16.             if( str.trim().equalsIgnoreCase("quit") ) {  
  17.                 session.close();  
  18.                 return;  
  19.             }  
  20.             System.err.println("收到客户端发来的消息::"+str);    
  21.             StringBuilder buf = new StringBuilder(str.length());    
  22.             for (int i = str.length() - 1; i >= 0; i--) {    
  23.                 buf.append(str.charAt(i));    
  24.             }    
  25.         
  26.             // and write it back.    
  27.             session.write(buf.toString());   
  28.         }  
  29.  
  30.         @Override 
  31.         public void sessionIdle( IoSession session, IdleStatus status ) throws Exception{  
  32.             System.out.println( "IDLE " + session.getIdleCount( status ));  
  33.         }  
  34.  
  35.         @Override 
  36.         public void messageSent(IoSession session, Object message)  
  37.                 throws Exception {  
  38.             // TODO Auto-generated method stub  
  39.             super.messageSent(session, message);  
  40.               
  41.         }  
  42.  
  43.         @Override 
  44.         public void sessionClosed(IoSession session) throws Exception {  
  45.             // TODO Auto-generated method stub  
  46.             super.sessionClosed(session);  
  47.              System.out.println( "session closed");  
  48.         }  
  49.  
  50.         @Override 
  51.         public void sessionCreated(IoSession session) throws Exception {  
  52.             // TODO Auto-generated method stub  
  53.             super.sessionCreated(session);  
  54.              System.out.println( "session create");  
  55.         }  
  56.  
  57.         @Override 
  58.         public void sessionOpened(IoSession session) throws Exception {  
  59.             // TODO Auto-generated method stub  
  60.             super.sessionOpened(session);  
  61.              System.out.println( "session opened");  
  62.         }  
  63.           

client

下面是Client代码,Client没有使用NIO,使用的普通socket实现:

 

 
  1. public class HelloMinaClient {  
  2.     private Socket socket;    
  3.     private DataOutputStream out;    
  4.     private DataInputStream in;    
  5.     public HelloMinaClient() throws IOException {    
  6.     }    
  7.     
  8.     /**   
  9.      * @param args   
  10.      */    
  11.     public static void main(String[] args) throws Exception {    
  12.         // TODO Auto-generated method stub    
  13.         HelloMinaClient minaClient = new HelloMinaClient();    
  14.         minaClient.minaClient();    
  15.     }    
  16.     
  17.     /**   
  18.      *   发送消息   
  19.      * @param out   
  20.      */    
  21.     public void sendMessage(Socket s) {    
  22.         try {    
  23.              out = new DataOutputStream(s.getOutputStream());     
  24.             out.writeBytes("mina\n");    
  25.         } catch (IOException e) {    
  26.             // TODO Auto-generated catch block    
  27.             e.printStackTrace();    
  28.         }    
  29.     
  30.     }    
  31.         
  32.     public void receiveMessage(Socket s) {    
  33.         try {    
  34.              in = new DataInputStream(s.getInputStream());    
  35.              System.err.println("收到服务端发来的消息::"+in.readLine());    
  36.         } catch (Exception e) {    
  37.             e.printStackTrace();    
  38.         }    
  39.     }    
  40.     
  41.     public void minaClient() throws Exception {    
  42.         while (true) {    
  43.             try {    
  44.                 socket = new Socket("192.168.21.121"9124);    
  45.                 sendMessage(socket);    
  46.                 receiveMessage(socket);    
  47.                 out.close();    
  48.                 in.close();    
  49.                 Thread.sleep(5000);    
  50.             } catch (InterruptedException e) {    
  51.                 // TODO Auto-generated catch block    
  52.                 e.printStackTrace();    
  53.             } catch(Exception e){    
  54.                 e.printStackTrace();    
  55.             }finally {    
  56.                  try{    
  57.                    if(socket!=null)socket.close();  //断开连接    
  58.                  }catch (IOException e) {e.printStackTrace();}    
  59.               }    
  60.         }    
  61.     }    
  62.  

SOCKET作为短连接,即收发消息后SOCKET断开一次,线程过5秒又建立连接收发消息。
 

 


/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
http://blog.csdn.net/xyz_lmn

* http://xyzlmn.blog.51cto.com/
*/




     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1089948,如需转载请自行联系原作者


相关文章
|
2月前
|
SQL 分布式计算 API
Apache Hudi从零到一:深入研究读取流程和查询类型(二)
Apache Hudi从零到一:深入研究读取流程和查询类型(二)
58 1
|
6月前
|
网络协议 Java API
Apache Mina高性能通信框架研究邮件列表.
Apache Mina高性能通信框架研究邮件列表.
42 0
|
SQL 分布式计算 Java
大数据产品管理平台Apache Ambari研究
在项目中,客户要求使用开源大数据平台,为实现开源大数据平台可管可控,满足企业级服务要求,特选型研究Ambari,预期简化部署,提升平台稳定运行和日常监控能力。个人观点,在企业级服务中尽量选用阿里云飞天平台这类稳定输出的商业级产品,其稳定性,管控能力均拥有较高的水平,不是开源产品可以比拟的。因此本文研究内容,仅作为备选技术方案。
1036 0
大数据产品管理平台Apache Ambari研究
|
存储 消息中间件 缓存
实时大数据计算引擎Apache Flink计算研究(二)
接上文,近期团队在研究大数据平台产品,在业务场景设计时,经常会遇到实时数据加工的需求,因此开始探索实时大数据计算引擎。同时,我认为Flink也是未来流批一体的趋势。本文将技术预研过程中的要点整理分享出来,供大家参考使用,内容较多,分2个文章发布。
402 0
实时大数据计算引擎Apache Flink计算研究(二)
|
消息中间件 缓存 分布式计算
实时大数据计算引擎Apache Flink计算研究(一)
近期团队在研究大数据平台产品,在业务场景设计时,经常会遇到实时数据加工的需求,因此开始探索实时大数据计算引擎。同时,我认为Flink也是未来流批一体的趋势。本文将技术预研过程中的要点整理分享出来,供大家参考使用,内容较多,分2个文章发布。
500 0
实时大数据计算引擎Apache Flink计算研究(一)
|
SQL 数据采集 分布式计算
深入研究Apache Spark 3.0的新功能
分享嘉宾 Apache Spark PMC李潇,就职于 Databricks,Spark 研发部主管,领导 Spark,Koalas,Databricks runtime,OEM 的研发团队,在直播中为大家深入讲解了Apache Spark 3.0的新功能。
深入研究Apache Spark 3.0的新功能
|
Apache 编解码 网络协议
|
Apache Java Spring
Apache Mina开发手册之四
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/40544275 Apache Mina开发手册之四 作者:chszs,转载需注明。
869 0
|
Apache Java Spring
Apache Mina开发手册之四
Apache Mina开发手册之四 一、Mina开发的主要步骤 1、创建一个实现了IoService接口的类 IoService接口有两个子接口: 1)IoAcceptor接口,用于服务器 2)IoConnection接口,用于客户端 ...
918 0

推荐镜像

更多