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

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

Server

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


看代码:

        
  1. publicclassHelloMina{
  2. privatestaticfinalintPORT=9125;
  3. /**
  4. *@paramargs
  5. *@throwsIOException
  6. */
  7. publicstaticvoidmain(String[]args)throwsIOException{
  8. //创建一个非阻塞的server端Socket,用NIO
  9. IoAcceptoracceptor=newNioSocketAcceptor();
  10. acceptor.getFilterChain().addLast("logger",newLoggingFilter());
  11. acceptor.getFilterChain().addLast("codec",newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName("UTF-8"))));
  12. //设定服务器端的消息处理器
  13. acceptor.setHandler(newMinaServerHandler());
  14. acceptor.getSessionConfig().setReadBufferSize(2048);
  15. acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
  16. //服务器端绑定的端口启动服务
  17. acceptor.bind(newInetSocketAddress(PORT));
  18. }
  19. }

HelloMina的处理器:

        
  1. /**
  2. *HelloMina的处理逻辑
  3. *@authorzhangxy
  4. */
  5. classMinaServerHandlerextendsIoHandlerAdapter{
  6. @Override
  7. publicvoidexceptionCaught(IoSessionsession,Throwablecause)throwsException{
  8. cause.printStackTrace();
  9. session.close();
  10. }
  11. @Override
  12. publicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException
  13. {
  14. Stringstr=message.toString();
  15. if(str.trim().equalsIgnoreCase("quit")){
  16. session.close();
  17. return;
  18. }
  19. System.err.println("收到客户端发来的消息::"+str);
  20. StringBuilderbuf=newStringBuilder(str.length());
  21. for(inti=str.length()-1;i>=0;i--){
  22. buf.append(str.charAt(i));
  23. }
  24. //andwriteitback.
  25. session.write(buf.toString());
  26. }
  27. @Override
  28. publicvoidsessionIdle(IoSessionsession,IdleStatusstatus)throwsException{
  29. System.out.println("IDLE"+session.getIdleCount(status));
  30. }
  31. @Override
  32. publicvoidmessageSent(IoSessionsession,Objectmessage)
  33. throwsException{
  34. //TODOAuto-generatedmethodstub
  35. super.messageSent(session,message);
  36. }
  37. @Override
  38. publicvoidsessionClosed(IoSessionsession)throwsException{
  39. //TODOAuto-generatedmethodstub
  40. super.sessionClosed(session);
  41. System.out.println("sessionclosed");
  42. }
  43. @Override
  44. publicvoidsessionCreated(IoSessionsession)throwsException{
  45. //TODOAuto-generatedmethodstub
  46. super.sessionCreated(session);
  47. System.out.println("sessioncreate");
  48. }
  49. @Override
  50. publicvoidsessionOpened(IoSessionsession)throwsException{
  51. //TODOAuto-generatedmethodstub
  52. super.sessionOpened(session);
  53. System.out.println("sessionopened");
  54. }
  55. }

client

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

        
  1. publicclassHelloMinaClient{
  2. privateSocketsocket;
  3. privateDataOutputStreamout;
  4. privateDataInputStreamin;
  5. publicHelloMinaClient()throwsIOException{
  6. }
  7. /**
  8. *@paramargs
  9. */
  10. publicstaticvoidmain(String[]args)throwsException{
  11. //TODOAuto-generatedmethodstub
  12. HelloMinaClientminaClient=newHelloMinaClient();
  13. minaClient.minaClient();
  14. }
  15. /**
  16. *发送消息
  17. *@paramout
  18. */
  19. publicvoidsendMessage(Sockets){
  20. try{
  21. out=newDataOutputStream(s.getOutputStream());
  22. out.writeBytes("mina\n");
  23. }catch(IOExceptione){
  24. //TODOAuto-generatedcatchblock
  25. e.printStackTrace();
  26. }
  27. }
  28. publicvoidreceiveMessage(Sockets){
  29. try{
  30. in=newDataInputStream(s.getInputStream());
  31. System.err.println("收到服务端发来的消息::"+in.readLine());
  32. }catch(Exceptione){
  33. e.printStackTrace();
  34. }
  35. }
  36. publicvoidminaClient()throwsException{
  37. while(true){
  38. try{
  39. socket=newSocket("192.168.21.121",9124);
  40. sendMessage(socket);
  41. receiveMessage(socket);
  42. out.close();
  43. in.close();
  44. Thread.sleep(5000);
  45. }catch(InterruptedExceptione){
  46. //TODOAuto-generatedcatchblock
  47. e.printStackTrace();
  48. }catch(Exceptione){
  49. e.printStackTrace();
  50. }finally{
  51. try{
  52. if(socket!=null)socket.close();//断开连接
  53. }catch(IOExceptione){e.printStackTrace();}
  54. }
  55. }
  56. }
  57. }

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


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

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

更多相关文章

  1. Android客户端、服务端、数据库开发流程及需要环境
  2. 一篇文章看明白 Android(安卓)v1 & v2 签名机制
  3. Android中AsyncTask的使用
  4. Handler&Looper
  5. handler机制
  6. android 仿QQ界面
  7. 简单的android客户端servlet服务端的交互
  8. Android(安卓)2.3.3 NFC分析
  9. Android(安卓)Notification 用法的4种形式

随机推荐

  1. 基于python的mysql复制工具详解
  2. 为什么说MySQL单表数据不要超过500万行
  3. MySQL5.7.23解压版安装教程图文详解
  4. python 连接数据库mysql解压版安装配置及
  5. 简单了解标准SQL的update语句三种用法
  6. Spark SQL常见4种数据源详解
  7. MySQL全局锁和表锁的深入理解
  8. 详解MySQL索引原理以及优化
  9. MySQL数据库安装和Navicat for MySQL配合
  10. Navicat For MySQL的简单使用教程