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

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

push研究——Apache Mina探索初步_第1张图片

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 = new  NioSocketAcceptor();        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 ));    }@Overridepublic void messageSent(IoSession session, Object message)throws Exception {// TODO Auto-generated method stubsuper.messageSent(session, message);}@Overridepublic void sessionClosed(IoSession session) throws Exception {// TODO Auto-generated method stubsuper.sessionClosed(session); System.out.println( "session closed");}@Overridepublic void sessionCreated(IoSession session) throws Exception {// TODO Auto-generated method stubsuper.sessionCreated(session); System.out.println( "session create");}@Overridepublic void sessionOpened(IoSession session) throws Exception {// TODO Auto-generated method stubsuper.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
*/




更多相关文章

  1. Android消息通知-Notification
  2. Mqtt从服务端到Android客户端搭建(Android客户端搭建)
  3. 【Android】Android的消息机制
  4. android的消息处理机制
  5. Handler消息传递机制

随机推荐

  1. Android中的数据共享-application contex
  2. Android(安卓)aapt实现资源分区(补充携程a
  3. Android开发学习笔记:Intent的简介以及属
  4. 开发者如何选择系统平台?Android、IOS还是
  5. android刷机后,wifi无法使用的解决办法
  6. 引用 android string.xml文件中的整型和s
  7. adb常用命令系列(monkey)了解这些,基本上能
  8. Android(安卓)关于录音文件的编解码 实现
  9. Android(安卓)国际化
  10. Android之如何解决刚下载的Android(安卓)