一.聊天软件背景

  1.聊天软件,就是通常我们说的即时聊天工具IM,我们常用的聊天软件有QQ,微信,飞信等。
  2.需要协议支持,传统的socket编程并不满足聊天的功能,比如服务器与客服端的双向交互,消息的双向推送。
  3.在移动互联网时代,我们需要基于移动终端开发新型的聊天软件,以满总大众的需求,常用的移动设备终端操作系统ios,android,wp7等等。

二.技术背景

  1.在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,
    可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。
   
    在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。
    Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的
    、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
    C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。
   
    但是经过一番研究发现,这个服务存在很大的问题:
   
    1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;
   
    2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,
       我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;
      
       有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。

 即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

 1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

 2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案 的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可 以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/

 3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅 保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统 允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。

 前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来

 
三.开发协议
 
  1.目前主流的四种IM(IM:instant messaging,即时消息)分别为:
    XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议);
    即时信息和空间协议(IMPP);
    空间和即时信息协议(PRIM);
    针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。

  2.在这四种协议中,XMPP是最灵活的。
    XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。
    经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。
    而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能.

  3.XMPP系统特点:
    (1)客户机/服务器通信模式;
    (2)分布式网络;
    (3)简单的客户端;
    (4)XML的数据格式。

 三.协议的实现及开发工具包
   
    1.android使用xmpp协议进行即时通信,所涉及3个主要的东西,它们是openfire、Asmack和spark,这三个东东结合起来就是完整的xmpp IM实现:

      (1)基于java的开源XMPP协议包Asmack,在pc机上,有实现XMPP协议包smack,但在精简了jdk的android系统上,会出现一些类缺失,
   但在2010年初,有人在code.google.com网站上发布了一个Asmack,其中A库就代表Android中的A,也就是说,这个版本是Smack的Android版本.
          可使用下面地址下载Asmack.
           http://code.google.com/p/asmack/downloads/list

      (2)openfire主要是作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。
      (3)Spark 是PC机上IM客户端的实现,其实就是使用了smack 的api实现的。
      (4)官方下载:http://www.igniterealtime.org/downloads/index.jsp

   四。参看资料
       http://www.apkbus.com/android-23750-1-1.html 

 转载请注明出处:http://www.cnblogs.com/hpboy