qianqianling 发表于 2018-11-25 08:31:00

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包
                     

看代码:


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


  HelloMina的处理器:


[*]/**
[*] * HelloMina的处理逻辑
[*] * @author zhangxy
[*] */
[*]class MinaServerHandler extends IoHandlerAdapter {
[*]   @Override
[*]      public void exceptionCaught( IoSession session, Throwable cause ) throws Exception{
[*]            cause.printStackTrace();
[*]            session.close();
[*]      }
[*]
[*]      @Override
[*]      public void messageReceived( IoSession session, Object message ) throws Exception
[*]      {
[*]            String str = message.toString();
[*]            if( str.trim().equalsIgnoreCase("quit") ) {
[*]                session.close();
[*]                return;
[*]            }
[*]            System.err.println("收到客户端发来的消息::"+str);   
[*]            StringBuilder buf = new StringBuilder(str.length());   
[*]            for (int i = str.length() - 1; i >= 0; i--) {   
[*]                buf.append(str.charAt(i));   
[*]            }   
[*]      
[*]            // and write it back.   
[*]            session.write(buf.toString());   
[*]      }
[*]
[*]      @Override
[*]      public void sessionIdle( IoSession session, IdleStatus status ) throws Exception{
[*]            System.out.println( "IDLE " + session.getIdleCount( status ));
[*]      }
[*]
[*]      @Override
[*]      public void messageSent(IoSession session, Object message)
[*]                throws Exception {
[*]            // TODO Auto-generated method stub
[*]            super.messageSent(session, message);
[*]            
[*]      }
[*]
[*]      @Override
[*]      public void sessionClosed(IoSession session) throws Exception {
[*]            // TODO Auto-generated method stub
[*]            super.sessionClosed(session);
[*]             System.out.println( "session closed");
[*]      }
[*]
[*]      @Override
[*]      public void sessionCreated(IoSession session) throws Exception {
[*]            // TODO Auto-generated method stub
[*]            super.sessionCreated(session);
[*]             System.out.println( "session create");
[*]      }
[*]
[*]      @Override
[*]      public void sessionOpened(IoSession session) throws Exception {
[*]            // TODO Auto-generated method stub
[*]            super.sessionOpened(session);
[*]             System.out.println( "session opened");
[*]      }
[*]         
[*]}

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


[*]public class HelloMinaClient {
[*]    private Socket socket;   
[*]    private DataOutputStream out;   
[*]    private DataInputStream in;   
[*]    public HelloMinaClient() throws IOException {   
[*]    }   
[*]   
[*]    /**
[*]   * @param args   
[*]   */   
[*]    public static void main(String[] args) throws Exception {   
[*]      // TODO Auto-generated method stub   
[*]      HelloMinaClient minaClient = new HelloMinaClient();   
[*]      minaClient.minaClient();   
[*]    }   
[*]   
[*]    /**
[*]   *   发送消息   
[*]   * @param out   
[*]   */   
[*]    public void sendMessage(Socket s) {   
[*]      try {   
[*]             out = new DataOutputStream(s.getOutputStream());   
[*]            out.writeBytes("mina\n");   
[*]      } catch (IOException e) {   
[*]            // TODO Auto-generated catch block   
[*]            e.printStackTrace();   
[*]      }   
[*]   
[*]    }   
[*]      
[*]    public void receiveMessage(Socket s) {   
[*]      try {   
[*]             in = new DataInputStream(s.getInputStream());   
[*]             System.err.println("收到服务端发来的消息::"+in.readLine());   
[*]      } catch (Exception e) {   
[*]            e.printStackTrace();   
[*]      }   
[*]    }   
[*]   
[*]    public void minaClient() throws Exception {   
[*]      while (true) {   
[*]            try {   
[*]                socket = new Socket("192.168.21.121", 9124);   
[*]                sendMessage(socket);   
[*]                receiveMessage(socket);   
[*]                out.close();   
[*]                in.close();   
[*]                Thread.sleep(5000);   
[*]            } catch (InterruptedException e) {   
[*]                // TODO Auto-generated catch block   
[*]                e.printStackTrace();   
[*]            } catch(Exception e){   
[*]                e.printStackTrace();   
[*]            }finally {   
[*]               try{   
[*]                   if(socket!=null)socket.close();//断开连接   
[*]               }catch (IOException e) {e.printStackTrace();}   
[*]            }   
[*]      }   
[*]    }   
[*]
[*]}

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





/**

* @author 张兴业

* 邮箱:xy-zhang#163.com

* android开发进阶群:278401545

* http://blog.csdn.net/xyz_lmn
* http://xyzlmn.blog.51cto.com/

*/



页: [1]
查看完整版本: push研究——Apache Mina探索初步