大家好,欢迎来到IT知识分享网。
概述
XMPP是一个开放式的XML协议,设计用于准实时消息和出席信息以及请求-响应服务。
通用的架构
通常采用客户端服务器架构进行实现,其中客户端通过TCP方式使用XMPP访问服务器,服务器之间也采用TCP方式进行通信。
服务器
充当xmpp通信的一个智能抽象层,负责
- 对受验证的客户端,服务器以及其他实体之间以xml流的形式的连接和会话进行管理。
- 在这些实体间使用xml流对合理编址的xml节进行路由
- 存储和处理客户端使用的数据
客户端
通过TCP连接直接连接到服务器,并通过xmpp获得由服务器以及联合服务器所提供的全部功能。多个不同的客户端可以同时登陆并且并发的连接到一个服务器,每个不同资源的客户端通过xmpp地址的资源标识符来区分。建议的客户端和服务器连接的端口时5222
网关
网关是一个特殊用途的服务器端的服务,主要功能是把xmpp翻译成外部消息系统,并把返回的消息翻译成xmpp.
网络
每个服务器都是由一个网络地址来标识的并且服务器之间的通信是客户-服务器协议的直接拓展。任意两个服务器之间的通信是可选的,如果被激活,那么这种通信应该通过XML流绑定到TCP连接上进行。建议的服务器和服务器连接的端口时5269
注
xmpp系统涉及更多的域间连接,当你给不在同一个域中的联系人发送xmpp消息时,你的客户端连接到你的“家用”服务器,然后直接连接到你的联系人的服务器,而没有中间跳过。
地址空间
概述
因为xmpp通讯实在网络上,所以每个xmpp实体都需要一个地址,称为JabberID(JID)。一个合法的JID包括一组排列好的元素,包括域名(domain identifier), 节点名(node identifier), 和资源名(resource identifier)。<user@host/resource>这种结构,最常用来标识一个即时消息用户,这个用户所连接的服务器,以及这个用户用于连接对资源。一个JID的每一个合法部分的长度不能超过1023字节,也就是整体长度(包括@和/)不能超过3071.
注
节点类型不一定是客户端,比如:聊天室中 room@service这里的room是聊天室的名字,service是多用户聊天服务的主机名,而加入了这个聊天室的某个特定的用户多地址则是<room@service/nick>
域名
域名是一个主要的ID,并且是JID中唯一必须的元素。(一个纯粹的域名也是一个合法的JID)。它通常代表网络的网关或者“主”服务器,其他实体通过连接它来实现xml转发和数据管理功能。然而,由一个域名标识引用的实体,并非总是一个服务器,也可能是一个服务器子域名地址。
节点名
XML流
C: <stream:stream> C: <presence/> C: <iq type="get"> <query xmlns="jabber:iq:roster"/> </iq> S: <iq type="result"> <query xmlns="jabber:iq:roster"> <item jid=""xs/> <item jid=""/> <item jid=""/> </query> </iq> C: <message from="" to=""> <body>Off with his head!</body> </message> S: <message from="" to=" "> <body>You are all pardoned.</body> </message> C: <presence type="unavailable"/> C: </stream:stream>
绑定到TCP
消息
<message from="" to="" type="chat"> <body>Who are you?</body> <subject>Query</subject> </message>
出席
<presence from=""> <show>xa</show> <status>down the rabbit hole!</status> </presence> 在XMPP的IM应用中,出席通常显示在你的允许出席的一种联系人列表的名册中(roster)。你的名册包含JabberIDs列表和你的出席订阅状态。当你在线时,你向你的服务器宣告你的出席,然后服务器将你在线通知告诉你的联系人,并且获得他们的当前出席显示在你的客户端界面上。
信息/查询
<iq from="" id="rr82a1z7" to="skh.whu.edu.cn" type="get"> <query xmlns="jabber:iq:roster"/> </iq>
服务器回复该命名空间限定一个非空的有效载荷,在这种情况下,包含一个<item/>元素对应名册中的一个联系人。
<iq from="skh.whu.edu.cn" id="rr82a1z7" to="" type="result"> <query xmlns="jabber:iq:roster"> <item jid=""/> <item jid=""/> <item jid=""/> </query> </iq>
苏克使用IQ-set向名册中添加一个新的联系人:
<iq from="" id="ru761vd7" to="skh.whu.edu.cn" type="set"> <query xmlns="jabber:iq:roster"> <item jid=""/> </query> </iq>
苏克也可以使用IQ-set向名册中添加一个新的联系人:
<iq from=" skh.whu.edu.cn " id="ru761vd7" to=" /Psi" type="result"/> </iq>
IQ-get或IQ-set的有效载荷总是通过由一个特定的XML命名空间限定的自有格式,这些命名空间由许多XMPP协议文档之一来指定。你可以想象每个有效载荷作为一个命令由接收人处理。IQ-get请求一种特定的信息,例如注册表、配置数据、服务发现信息或联系人列表。IQ-set创建、更新或删除一种特定的信息,例如已完成的表单、已更新的配置数据或者向联系人列表添加。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120648.html