XMPP协议作为IM开源协议的事实标准,已经广泛应用于很多的IM通信软件当中,GTalk、MSN位列其中,另外现在移动互联网领域中的WhatsApp也是使用的该协议。当然腾讯QQ和微信使用的私有协议,在这方面腾讯的协议相比于xmpp协议,在流量和功能方面都要更优。但我们现在只能使用xmpp这个协议在实现我们的功能,实际上xmpp协议已经可以满足我们大部分的需求。
XMPP仅仅是一个协议,符合该协议的服务器和客户端产品有很多,首先说服务器产品
服务器 | 许可证 | 操作系统 | 国家及地区 | 公司或组织 | 是否支持任意客户端登录 | 信息来源 | 备注 |
---|---|---|---|---|---|---|---|
ejabberd | 开源 | Erlang,跨平台 | 俄罗斯 | Process One | 支持 | 服务商官网ejabberd | 支持虚拟主机,支持集群,Ejabberd2:安装和操作指南 |
jabberd2.x | GPLv2 | C,主要是Linux,Windows版本很旧 | 波兰 | Xiaoka | 支持 | 服务商官网jabberd2.x | 支持虚拟主机,不支持集群,注意它并不是jabberd1.4的升级版本, Jabberd2:安装和管理指南 |
Openfire | 开源(Apache License) | Java,跨平台 | 美国 | Ignit Realtime | 支持 | 服务商官网Openfire | 就是最早的jive,后来的wildfire,现在他们XMPP服务器叫Openfire了,Openfire:安装指南 |
Prosody | 开源(MIT/X11 License) | Lua,跨平台 | 美国 | Prosody | 支持 | 服务商官网Prosody | xmpp.org用的他们家的服务器软件 |
Tigase | 开源(GPLv3 License) | Java,跨平台 | 不详 | Tigase | 支持 | 服务商官网 Tigase | 出来得比较晚,支持虚拟主机,支持集群,Tigase:用GUI安装包安装 |
网上使用openfire的最多,主要是因为是使用java编写,插件方式可以扩展其功能,我们的项目开始也是使用这个平台来实现功能,但是实际测试发现openfire的单机承载用户量极为有限,而且其集群能力很差,一旦用户量到达一定的瓶颈,将难以扩展,而且在实际使用中发现消息延时较长,经常丢失。后来选用了ejabberd,ejabber服务器采用erlang编写,集群配置方便,可扩展性强,及其稳定,且有多家大型互联网及移动互联网公司采用。但是erlang这种语言相对较为小众,源码晦涩,修改起来困难较大。
xmpp群的概念和qq群有很大的差别,功能较弱。xmpp中的术语并不是“群”而是conference,这个概念是不用与群的。举例来说,当用户A、B、C、D都加入一个conference,同时在线时,和群类似,群消息,所有人都可以实时接收,但是当用户C离开时,他自动退出了该会议,会议的消息将不会为其离线保存,当用户C在此进入会议时,会议会把历史记录中的数条消息推送给他。这种方式有很大的局限性,如果我们假定设置的历史消息条数为10,用户C如果错过了100条消息,则只能收到10条,如果一条都没错过,仍然收到10条,可见和QQ群是不同的,这样的设计和实际我们的需求还是有一定的差距,可能是由于某种特殊考虑,另外conference这个术语也表明这是一种会议,这样的设计作为会议来讲是没有问题的。综上,我们可以这样理解,xmpp是没有群的概念的,如果希望有类似的功能,可以使用conference来替代。
那我们有一对多消息的需求,那该怎么实现呢,单从概念上来理解的话,QQ群是可以满足需求的,但是根据上面的分析xmpp的conference是无法满足的。在反复思索和探寻中终于找到了xmpp中提供的一种方式,pubsub方式,一个发布者,多个订阅者
。XEP-0060协议描述了这种方式。详情见协议说明:http://wiki.jabbercn.org/XEP-0060
在这个协议中可以满足一对多消息机制。在ios端的xmpp framework和android asmack以及java通用的smack框架中都已经实现了该拓展协议,所以可以直接使用其来实现一对多消息。
详细使用方法,在以后的博文中在做阐述吧。