即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能,常见的即时通讯工具有QQ、微信等。然而如果要搭建一个即时通讯系统,离不开即时通讯协议,今天要介绍的是基于XMPP协议的即时通讯系统。
即时通讯协议就是即时通讯系统在通讯时所需要遵循的规范,它定义了一些标准化的通讯数据格式和网络架构等。
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它继承了在XML环境中灵活的发展性,可用于实时消息传递、呈现和请求/响应业务。XMPP使用TCP传输XML数据流,属于应用层协议,而非传输层协议。XMPP官网 XMPP中文
XMPP协议的前身是Jabber
,采取XMPP协议来实现IM主要是考虑XMPP协议是以XML为基础的。这表明XMPP是可扩展的,所以XMPP信息不仅可以是简单的文本,而且可以携带复杂的数据和各种格式的文件,也就是说XMPP协议不仅可以用在人与人之间的交流,而且可以实现软件与软件或软件与人之间的交流,目前支持XMPP协议的即时通讯工具有Gtalk、FaceBook IM、Twitter、网易POPO等等通讯工具,具有非常好的发展情景。
资料:即时通讯协议的选型之XMPP
XMPP中定义了三个角色,客户端,服务器,网关。
XMPP通讯过程中传输的是与即时通讯相关的指令。只是协议的形式变成了XML格式的纯文本。
下面是一个XMPP通讯过程示例:
客户端(minstone)连接到一个XMPP服务器(127.0.0.1:5222/TCP),发送一条消息“Bye Bye”到另一个客户端(test),然后注销。
客户端:
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" to="127.0.0.1">
服务器:
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'
from='127.0.0.1' id='1461777714'>
客户端:
<iq type="set" id="auth_2" to="127.0.0.1" >
<query xmlns="jabber:iq:auth">
<username>minstoneusername>
<password>mypasswordpassword>
<resource>Workresource>
query>
iq>
服务器:
<iq from="127.0.0.1" id='auth_2' type='result'/>
客户端:
<message to="[email protected]" >
<subject>Bye Byesubject>
<body>test 1449body>
message>
<presence type="unavailable" >
<status>Logged outstatus>
presence>
stream:stream>
服务器:
stream:stream>
以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从
到构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream(XML流)。在
与中间的那些
这样的XML元素就是所谓的XML Stanza(XML节点)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一方发信给另外一方。通信的最后阶段是关闭流。
资料:xmpp基本概念
Jingle
。Openfire一款基于Java开发的开源实时协作(RTC)服务器,基于XMPP(Jabber)协议。您可以使用它轻易的构建高效率的即时通信服务器。
Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登录服务。
资料: 官网 github地址 Openfire教程网
安装配置过程请参照:Openfire安装教程
Spark是一款使用java开发的开源即时通讯工具,它可以登录基于XMPP协议搭建的即时通讯服务器并在其之上进行通讯(可理解为精简版QQ)。
登录方式请参考上述Openfire安装教程
博客内容,这里不再赘述。
Smack是一个开源,易于使用的XMPP(jabber)客户端类库。它封装了针对XMPP协议的即时通讯过程中的一些操作,如登录,注册,发送消息等等,使得开发者不必关心XMPP中大量的xml数据的处理。Spark就是使用了smack开发。
github地址
缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,一般1台机器只能模拟有限(数千个)客户。
注:
Smack是针对java开发的,所以适用于Android,smack所依赖的jar包可以通过FindJar找到,也可以通过gradle
引用Maven库里面的library。
针对iOS,通常使用第三方库XMPPFramework
针对JS,网络上也提供了许多第三方库 Converse.js Strophe.js
下面是一段smack的登录示例代码:
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setXmppDomain("jabber.org") //xmpp服务器域名
.setHost("earl.jabber.org") //xmpp服务器主机地址
.setPort(8222) //xmpp服务器端口
.build();
AbstractXMPPConnection conn = new XMPPTCPConnection(config);
conn.connect();//建立连接
conn.login("username", "password");//用户登录
smack一直在更新升级,不同版本代码差异巨大,而且官方文档不够详细,网上找的资料基本是旧版本的代码,这个很坑!
有兴趣的同学可以去github上看看本人写的安卓端的xmpp示例应用Android XMPP Demo