分享

及时通信软件的架构

 WindySky 2016-04-10

微信:(链接地址

对此,业界标准的解决方案:Messaging And Presence Protocol:1)XMPP;2)SIP/SIMPLE。它的优点是简单,大量开源实现。而缺点同样明显:1)流量大:状态初始化;2)消息不可靠。

微信在系统中做了特殊设计,叫SYNC协议,是参考Activesyec来实现的。特点首先是基于状态同步的协议,假定说收发消息本身是状态同步的过程,假定终端和服务器状态已经被迟了,在服务器端收到最新的消息,当客户端、终端向服务器对接的时候,收取消息的过程实际上可以简单的归纳为状态同步的过程,收消息以及收取你好友状态更新都是相同的。在这样的模式之下,我们会也许会把交互的模式统一化,只需要推送一个消息到达的通知就可以了,终端收到这个通知就来做消息的同步。在这样的简化模式之下,安卓和塞班都可以得到统一。这样的系统本身的实现是更为复杂的,但是获得很多额外的好处。

让剩下系统实现的部分更加简单,简化了交互模式,状态同步可以通过状态同步的差值获得最小的数据变更,通过增量的传输得到最小的数据传输量。通过这样的协议设计,微信可以确保消息是稳定到达的,而且是按序到达。引用一句俗话:比它炫的没它简单,比它简单的没它快,没谁比他更快,哪怕在GPRS下,微信也能把进度条轻易推到底。

微信的技术也是一流的.在别人还在抄袭XMPP协议的时候.微信参照Exchange AciticeSync自己搞一个同步协议,省流量并且支持离线发送消息这也是成功一个条件.(链接地址)


Kiki:xmpp ,服务端(tigase )    (链接地址

KIK会基于你的手机通讯录构建好友列表。KIK还有一个纯产品功能的创新。现在,通过KIK进行短信息交流时,可以看到对方的状态,你的信息是否发送、对方是否已经阅读、是否正在给你回信都可以一目了然。这个细节上的功能创新,实际上迈出了重要的一步,即把行为反馈做为了信息沟通的一部分。这种用户使用体验上的提升,看似一小步,实际一大步。(链接地址


米聊:XMPP协议



考虑到openfrie集群需要license, 而单台openfire在稳定性及容量上都难以为继(链接地址

XMPP packet 重写 基于smack

链接地址

基于Smack 实现Notification数据包。smack的类中有一个org.jivesoftware.smack.packet.IQ只需对他重写即可,在做的时候其实可以简单一点的,如果你使用tinder.jar 包,其IQ org.xmpp.packet.IQ 有一个 setChildElement 方法与 getChildElement相对应,但smack没有! 


主要用于与android Client之间Push通信. 
定义一套自己的数据包格式: 

Java代码   链接地址
  1. - <iq id="11111" to="aa@qq.com" type="get">  
  2. - <notification xmlns="androidpn:iq:notification">  
  3.   <id>123456</id>   
  4.   <apiKey>1234567890</apiKey>   
  5.   <title>nothing</title>   
  6.   <message>jintiantianqibuycuo</message>   
  7.   <uri>heoo</uri>   
  8.   </notification>  
  9.   </iq>  


重新写了一下body的部分. 代码如下: 

Java代码   链接地址
  1. /** 
  2.  * Notification 重写XMPP 的IQ packet (Smack)  
  3.  *  
  4.  * @author Charles 
  5.  * @date 2011/10/16 
  6.  * 
  7.  * 
  8.  */  
  9.   
  10.   
  11. package com.gareatech.testxmpp;  
  12.   
  13. import org.jivesoftware.smack.packet.IQ;  
  14.   
  15.   
  16. /** 
  17.  * 重构之后的数据样式 
  18.  * -  
  19.  * <iq id="11111" to="aa@qq.com" type="get">  
  20.  * <notification xmlns="androidpn:iq:notification"> 
  21.  * <id>123456</id>  
  22.  * <apiKey>1234567890</apiKey>  
  23.  * <title>nothing</title>  
  24.  * <message>jintiantianqibuycuo</message>  
  25.  * <uri>heoo</uri>  
  26.  * </notification> 
  27.  * </iq> 
  28.  *  
  29.  * */  
  30. public class Notification extends IQ {    
  31.     private Notify notify;  
  32.       
  33.     public Notify getNotify() {  
  34.         return notify;  
  35.     }  
  36.   
  37.     public void setNotify(Notify notify) {  
  38.         this.notify = notify;  
  39.     }  
  40.   
  41.     @Override  
  42.     public String getChildElementXML() {  
  43.         StringBuilder buf = new StringBuilder();  
  44.         if (notify != null) {  
  45.             buf.append(notify.toXML());  
  46.         }  
  47.         return buf.toString();  
  48.     }  
  49.       
  50.     /** 
  51.      * Notify 
  52.      * Body 部分,重写为<> 
  53.      *  
  54.      * */  
  55.     public static class Notify {  
  56.         private String id;  
  57.         private String apiKey ;  
  58.         private String title;  
  59.         private String message;  
  60.         private String uri;  
  61.           
  62.         public String getId() {  
  63.             return id;  
  64.         }  
  65.   
  66.         public void setId(String id) {  
  67.             this.id = id;  
  68.         }  
  69.   
  70.         public String getApiKey() {  
  71.             return apiKey;  
  72.         }  
  73.   
  74.         public void setApiKey(String apiKey) {  
  75.             this.apiKey = apiKey;  
  76.         }  
  77.   
  78.         public String getTitle() {  
  79.             return title;  
  80.         }  
  81.   
  82.         public void setTitle(String title) {  
  83.             this.title = title;  
  84.         }  
  85.   
  86.         public String getMessage() {  
  87.             return message;  
  88.         }  
  89.   
  90.         public void setMessage(String message) {  
  91.             this.message = message;  
  92.         }  
  93.   
  94.         public String getUri() {  
  95.             return uri;  
  96.         }  
  97.   
  98.         public void setUri(String uri) {  
  99.             this.uri = uri;  
  100.         }  
  101.   
  102.         public String toXML() {  
  103.             StringBuilder buf = new StringBuilder();  
  104.             buf.append("<notification xmlns=\"").append("androidpn:iq:notification\">");  
  105.             buf.append("<id>").append(id).append("</id>");  
  106.             buf.append("<apiKey>").append(apiKey).append("</apiKey>");  
  107.             buf.append("<title>").append(title).append("</title>");  
  108.             buf.append("<message>").append(message).append("</message>");  
  109.             buf.append("<uri>").append(uri).append("</uri>");  
  110.             buf.append("</notification>");  
  111.             return buf.toString();  
  112.         }  
  113.     }  
  114. }  

微信的研究(http://www./article/p-493586.html

1. 微信android使用的是amr编码;iphone未知,估计是aac,转码会在微信服务器上完成。android上使用了speex这个库,估计是为了达到边录边发。在服务器做格式转换确实比客户端方便多了,用ffmpeg就可以搞定了,也是瘦客户端的一种思路,而且可以依此延伸很多扩展业务。


2. 微信android最新版的数据库依然是sqlite,但文件做了加密,用的是http:///


3. 微信发送地理位置用的是google地图,网页地址在assets\map\map_cn.html


4. 微信的视频通信不是在QQ的基础上做的,而是自己实现的一套,基于speex,webrtc, voip等库。微信和QQ的视频通信和skype相差太远了,特别是网络好的情况下。看来视频通信还是有技术壁垒的,现在只能希望Google将webrtc做成熟一点了。


5. 微信使用了一些jni:
    libImgProcess.so 用于gif处理,特别是抠背景。这个微信在一个讲座里面还专门提过。
    libvprotocal.so 用于视频录制,不过这个库效率也不高。录制一分钟的视频,等待压缩要半分钟。干嘛不像Instagram放在后头偷偷去做,或者边做边录。
    libMMProtocalJni.so  用于pcm转amr,不用android系统自带的是因为可以边录边发,这个库也做了插件相关的一些处理
    libvoipMain.so 视频通话
    libvoice.so 视频通话语音处理,用了speex
    libSync.so 用于通讯录同步
    libImgFilter.so 用于图片处理的滤镜
    libmmcrypto.so 数据库加密,其实就是sqlcipher


。。。。。。


微信的研究2(http://www./article/p-493587.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多