1、什么是XMPP?
维基百科上给出了如下的定义:
XMPP(Extensible Messaging and Presence Protocol,前称Jabber[1])是一种以XML为基础的开放式实时通信协定,是经由互联网工程工作小组(IETF)通过的互联网标准。XMPP因为被Google Talk应用而被广大网民所接触。
2、XMPP的特点是什么?
先说他又什么优点:
开放—XMPP协议是自由、开放、公开的,并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自有多种实现。
标准—互联网工程工作小组(IETF)已经将Jabber的核心XML流协定以XMPP之名,正式列为认可的实时通信及Presence技术。而XMPP的技术规格已被定义在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。
证实可用—第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努力。今日的互联网上有数以万计的XMPP服务器运作著,并有数以百万计的人们使用XMPP实时传讯软件。
分散式—XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
安全—任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自带于核心XMPP技术规格中。
可扩展—XML命名空间的威力可使任何人在核心协定的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP Standards Foundation。
弹性佳—XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。
多样性—用XMPP协定来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。
PS:有关于的详细的实现细节,可以参加上边提到的和这两个标准文件,我读了差不多一半,英语着实有些拙计了,但是发现这些标准文件真的写的特别的规范,如果大家想对于有个非常详尽的认识,建议还是仔细阅读一下这两个文件!
当然其实XMPP还是有其不可避免的缺陷的:
数据负载太重:随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复 转发,XMPP协议目前拥有一个大型架空中存在的数据提供给多个收件人。新的议定书正在研究, 以减轻这一问题。
没有二进制数据:XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。因此, 文件传输协议一样使用外部的HTTP。如果不可避免,XMPP协议还提供了带编码的文件传输的所有数据使用的Base64。至于其他二进制数据加密会话(encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。
这些都是我从维基上拷贝下来的,对于这两个缺陷,主要还是由于XMPP规定必须以XML协议来传输消息导致的。
3、运行机制
XMPP网络是基于服务器的(即客户端之间彼此不直接交谈),但是也是分散式的。不像AOL实时通或MSN Messenger等服务,XMPP没有中央官方服务器。Jabber.org的公众服务器上有大量的用户,所以有些人误解了,以为它是官方服务器,不过事实上任何人都可以在自己的网域上运行XMPP服务器。
Jabber识别符(JID)是用户登录时所使用的帐号,看起来通常像一个电子邮件地址,如[email protected];前半部分为用户名,后半部分为XMPP服务器域名,两个字段以@符号区隔。
假如我们在本机架设了一个XMPP的服务器,用户的服务器域名的值:就是你的本机的主机名称以我的电脑为例子,服务器的域名为:mini-thinkpad-t420,一定要注意这个域名,尤其是在自己电脑架设服务器写demo的时候,很多人就直接使用localhost去作为域名,或者127.0.0.1作为域名,结果导致了很多连接错误,对于域名有个很简单的方式查看,打开你的服务器,在服务器信息里可以看到服务域名,当然还有其他的方法去查看,这个我们后面再详细说明。
下面我们举个简单的例子来说明如何通过XMPP协议进行即时通讯:我们这里就以最简单的服务模式为例子,现在我们有一个基于XMPP协议的通信的服务器,服务器上有两个注册的用户user1和user2,如果user1想要跟user2进行聊天:
user1通过客户端登录到XMPP服务器上,此时服务端会维持与user1的一个长连接,然后user1通过客户端将发送给user2的消息先发送到服务器,同时在客户端上建立一个消息的监听程序,监听有没有消息从服务器端返回!
一旦user2登录到了服务器上,服务器也会维持一个与user2的长连接, 这个时候服务器会将user1发送给user2的消息,发给user2,在发送的时候,消息会背user2的监听线程捕获,然后将消息显示给user2,这样就完成了一次通话!
这里需要说明一下:
在原来的规格,XMPP协议可以使用HTTP的方式有两种:轮询(polling)[4]与绑定(binding)[5]。 轮询现在不推荐,基本上,轮询意味着HTTP邮件存储在服务器端的数据库上,客户端必须一再地以HTTP的GET和POST的方式去抓取(以及刊出)其中 的信息。然而使用绑定的方式时,客户端会保留一个长存的HTTP连接,等待一旦服务器有新的信息时,就立刻接收信息。因为轮询的结果往往是服务端没有新信 息,这种推送的通知模式比轮询的方式更有效率。
由于客户端使用HTTP,大多数防火墙允许客户端获取和留言没有任何障碍。因此,即使使用XMPP协议的TCP端口被拦截,服务器也能正常地倾听一 般的HTTP端口,其上的信息也能保持畅通。还有一些网站更允许大众经由浏览器登录进XMPP。尤有甚者,还有一些公共的服务器同时拥有标准 HTTP(80端口)和HTTPS(443端口),因此又有助于通过防火墙。
现在我们对于XMPP协议大概有了一个简单的了解,为了帮助我们更好的理解这种通信,方式在下一节中我们会来实现一个基于XMPP服务器openfire和Android的简单的聊天室应用!