全部博文(82)
分类: Python/Ruby
2010-04-02 11:20:22
1 XMPP 的地址和数据结构
1.1 实体地址
XMPP 整体框架下图 所示。图中, XMPP 框架的各类实体(如XMPP 客户、服务器和网关等) 的地址称为Jabber地址(Jabber Identifier, JID)。JID 惟一确定进行即时消息和在线状态信息通信的独立对象或实体, 并可兼容其他即时通信系统( 如MSN 等) 相应的实体标识及其在线状态信息。其语法规则为: [节点″@″] 域名[″/″资源], 其中各个域的长度不能超过1 023 字节, 总长度最大为3 071 字节。
此主题相关图片如下:
域名指定了实体连接的XMPP 服务器。每个可用XMPP 服务器都拥有一个完整域名, 域名可在域名系统(DNS)中查找; 节点可表示某用户、一类应用或某项服务,所有节点都对应一个精确的域名; 资源用来识别属于用户的特殊对象(如设备或位置), 允许一个用户同时以多个资源与同一XMPP 服务器连接, 如yb@sdpt.com/lab、yb@sdpt.com/chat。
1.2 XMPP 的数据结构
由于XMPP 是基于XML 的协议, 因此用户可根据自己的需要定义标记, 表述几乎任何一种结构化数据, 并可方便地创建定制的应用或增加功能。
1.2.1 三个顶级XML 元素
XMPP 定义的3 个关键顶级XML 元素为
实体间的会话, 并且允许实体间来回传送XML 格式的请求和响应以便取得或设置公共的用户信息, 如名字等。
即时通信中名字冲突问题使用XML 的命名空间特性来解决。XML 命名空间定义了一种将XML 中使用的元素和属性与统一资源定位符(Uniform Resource Locator,URL)引用联系起来对元素和属性进行定义的方法。
1.2.2 XMPP 的数据结构
从结构上看, XMPP 有3 种数据: XML 流、流认证和XML 节。XML 流是实体交换XML 元素的容器,以
XMPP 为XML 流扮演通用“传输层”的角色。XML 流中包含传输的认证信息和现场消息, XMPP 能使数据高效路由至最合适的请求源, 并最大限度地简化客户机上的实现, 使跨应用实时交流信息成为可能。
2 工作过程
(1)节点(如yb、pt)向本地服务器连接。
①XMPP 用户通过开启一个从客户端到服务器端的XML 流, 来申请一个在服务器上的Socket 连接。
SEND:
xmlns=′jabber: client′
xmlns: stream=′http: //etherx.jabber.org/streams′>
②服务器通过开启一个从服务器到客户端的XML 流进行回复。
RECV:
id=′180763465′
xmlns=′jabber: client′
xmlns: stream=′http: //etherx.jabber.org/streams′>
(2)节点向本地服务器申请登录。
①用户询问登录服务器时需提供的信息。
SEND:
②服务器回应用户, 告知用户登录所需要的信息。
③用户提供所需的信息。
④服务器响应一个空的类型为“result”的iq 元素, 表明登录成功。
RECV:
⑤yb 用户发送当前状态给服务器, 表明其在线。
SEND:
(3)用户获得花名册, 好友增加一个联系人( 如yb 获知朋友sd 在线) 。
(4)用户间发送消息( 如yb 向sd 发送消息) 。
用户发送一条消息:
SEND:
Where are you?
服务器会根据XMPP 用户的会话信息加上一个源地址, 这样接收者收到消息时, 消息中已经包含了源地址。
(5)XMPP 服务器根据目标JID 中的域名查找、连接到目标服务器并进行认证(如sdpt.com 使用DNS 查找jabber.org, 连接到jabber.org 服务器上并进行认证) 。
(6)XMPP 服务器jabber.org 证实sd 连接到该服务器上, yb 被授权与sd 进行通信。
(7)数据在yb 与sd 间流动。
(8)用户退出, 退出时只需要关闭
3 结束语
简单的接口、开放的协议、互联的架构、权威的标准再加上坚实的用户基础是XMPP 的优势。相信XMPP 将为即时通信技术的运用提供更为广阔的空间。