及时通信软件的架构

微信:(http://timyang.net/architecture/notes-weixin/

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

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

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

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


Kiki:xmpp ,服务端(tigase) (http://www.zhihu.com/question/19788134

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


米聊:XMPP协议



考虑到openfrie集群需要license, 而单台openfire在稳定性及容量上都难以为继(http://blog.csdn.net/untager/article/details/7530619

XMPP packet 重写 基于smack

http://waw.iteye.com/blog/1197811

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


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

Java代码 收藏代码
  1. -<iqid="11111"to="aa@qq.com"type="get">
  2. -<notificationxmlns="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的IQpacket(Smack)
  3. *
  4. *@authorCharles
  5. *@date2011/10/16
  6. *
  7. *
  8. */
  9. packagecom.gareatech.testxmpp;
  10. importorg.jivesoftware.smack.packet.IQ;
  11. /**
  12. *重构之后的数据样式
  13. *-
  14. *<iqid="11111"to="aa@qq.com"type="get">
  15. *<notificationxmlns="androidpn:iq:notification">
  16. *<id>123456</id>
  17. *<apiKey>1234567890</apiKey>
  18. *<title>nothing</title>
  19. *<message>jintiantianqibuycuo</message>
  20. *<uri>heoo</uri>
  21. *</notification>
  22. *</iq>
  23. *
  24. **/
  25. publicclassNotificationextendsIQ{
  26. privateNotifynotify;
  27. publicNotifygetNotify(){
  28. returnnotify;
  29. }
  30. publicvoidsetNotify(Notifynotify){
  31. this.notify=notify;
  32. }
  33. @Override
  34. publicStringgetChildElementXML(){
  35. StringBuilderbuf=newStringBuilder();
  36. if(notify!=null){
  37. buf.append(notify.toXML());
  38. }
  39. returnbuf.toString();
  40. }
  41. /**
  42. *Notify
  43. *Body部分,重写为<>
  44. *
  45. **/
  46. publicstaticclassNotify{
  47. privateStringid;
  48. privateStringapiKey;
  49. privateStringtitle;
  50. privateStringmessage;
  51. privateStringuri;
  52. publicStringgetId(){
  53. returnid;
  54. }
  55. publicvoidsetId(Stringid){
  56. this.id=id;
  57. }
  58. publicStringgetApiKey(){
  59. returnapiKey;
  60. }
  61. publicvoidsetApiKey(StringapiKey){
  62. this.apiKey=apiKey;
  63. }
  64. publicStringgetTitle(){
  65. returntitle;
  66. }
  67. publicvoidsetTitle(Stringtitle){
  68. this.title=title;
  69. }
  70. publicStringgetMessage(){
  71. returnmessage;
  72. }
  73. publicvoidsetMessage(Stringmessage){
  74. this.message=message;
  75. }
  76. publicStringgetUri(){
  77. returnuri;
  78. }
  79. publicvoidsetUri(Stringuri){
  80. this.uri=uri;
  81. }
  82. publicStringtoXML(){
  83. StringBuilderbuf=newStringBuilder();
  84. buf.append("<notificationxmlns=\"").append("androidpn:iq:notification\">");
  85. buf.append("<id>").append(id).append("</id>");
  86. buf.append("<apiKey>").append(apiKey).append("</apiKey>");
  87. buf.append("<title>").append(title).append("</title>");
  88. buf.append("<message>").append(message).append("</message>");
  89. buf.append("<uri>").append(uri).append("</uri>");
  90. buf.append("</notification>");
  91. returnbuf.toString();
  92. }
  93. }
  94. }

微信的研究(http://blog.csdn.net/chief1985/article/details/7902016

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


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


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://blog.csdn.net/chief1985/article/details/7905540

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值