对此,业界标准的解决方案: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





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


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通信.
定义一套自己的数据包格式:

微信的研究()

1. -<iqid="11111"to="aa@qq.com"type="get">
2. -<notificatinotallow="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的部分. 代码如下: 


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

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