2.1.5
逐步分析:一个消息在
jabber
中的传输
设想我们有一个
jabber
客户端,
jabberID是bigwig@manning.com/work
。我们发送一个
<message>
包到用户
iain
,所在的
jabber
域名是
shigelka.com
。这个包如下:
<message to=’iain@shigeoka.com’/>
然后,我们发送到我们的
mainning.com
服务器。服务器检测接受者的属性:
jabberID
,隐藏的发送地址,发送包到达的目的地
shigeoka.com jabber
服务:
<message to=’iain@shigeoka.com’ from =’bigwig@mainning.com/work’/>
shigeoka.com服务得到inin@shigeoka.com
地址之后查找用户
iain
。如果在线用户没有登记
iain
这个用户,消息将存储在晚些时候发送。当资源被验证,
shigeoka.com
服务能够交付一个完整的
<message>packets
到资源。下面的这个包将被接受:
<message from =’bigwig@mainning.com/work’/>
注意接受地址已经被剥离。在这个案例中,客户假设信息的地址是她自己。
Jabber
服务不必剥离接受地址因此客户将能处理包有或没有接受地址。
2.2jabber
协议的核心
jabber
协议定义了实现
Im
相关任务的一个关于数据结构的集合以及交换他们的规定。
Jabber
协议是简单和实用的,为使用者体统了强大的保证和可扩展性。他建立在普通的技术至上,例如
tpc/ip
,
URI
,以及
XML
,因此学习曲线比较平坦。
Jabber
协议有三个核心:
Message
Presence
Info/Query
每个都是
Jabber
的重要组成。我们下面大概的论述一下:
2.2.1 Message:
发送数据
message
是一最简单
jabber
协议。在大部分的情况下,多数的包都是遵循
message
规则,因他的简单性、易用性使得它成为最好的消息模式。因为他用简单的设计逻辑设计,使得事情变得简单而且优秀变得可能。
如你所想的,在用户之间交互的
message
用的人类可识别的。这些消息能够像
email
或在线聊天。
Message
在第四章有详细介绍。
2
.
2.2
出席:更新用户在线状态
另外一个常常会用到的核心协议是出席协议。这个协议包括预约、核准和更新
jabber
系统的出席信息。和
Message
一样他也是设计简单的逻辑,有效的管理出席。
出席在第
5
、
8
章详细介绍。
2.2.3info/Query :
处理一切
IQ
协议是最后一个核心协议,如果一个协议不是
message,
也不是出席,那么它就是
IQ
协议。
IQ
是一个一般的
Request-respose
协议。它是设计简单和扩展的。
一个一般的
Iq
包的格式就如同一个普通的信封包含发生的
iq
协议的类型和查询接受者,通常是调用
IQ
句柄。
IQ
信封下是
0
个或多个
<query>
包。
<query>
包确定了一个默认地命名空间,而每个
<query>
能够包含已定义的子包。这个命名空间保证了时的
<query>
包内容避免放生明名冲突。
例如:如果一个客户端希望得到一个
IQ
回复:
iq
:
auth IQ
扩展协议,这个包看起来如下:
<iq type='get' to='handlerJID'>
<query xmlns='jabber:iq:auth'>
<username>iain</username>
</query>
</iq>
有
20
多个
IQ
扩展标准和协议。这些协议覆盖了
jabber
用户注册、当前时间查询的验证或服务器或客户端的版本。另外,开发人员可以自由的开发他们自己的
IQ
扩展协议,他们不能用标准
IQ
扩展协议的命名空间。
这种简单的可扩展结构允许开发人员任意的并且快捷容易的扩展
Jabber
系统。另外,因为查询的内容是一个在
XML
命名空间,并且
Jabber
路由信息外部包围
IQ
,自定义的
IQ
扩展包不需要修改
Jabber
软件就可以在
jabber
系统发送信息。仅仅接收者和处理者需要懂得扩展协议的意思。客户端或服务端不支持此扩展协议时只需发送一个错误指明不支持。
例如:设想我们创建一个
IQ
扩展协议
httP://shigeoka.com/game/character为一个jabber在线游戏
,它为其他用户描述了在游戏中的字符。一个客户可以发送下面的
IQ
包到服务器:
<iq type='set' to='evilwizard@shigeoka.com'>
<query xmlns='http://shigeoka.com/game/character'>
<name>Mario</name>
<sex>male</sex>
<occupation>plumber</occupation>
<lives>3</lives> <level>5</level>
<score>4200</score>
</query>
</iq>
Jabber
服务器完整的接收这个包,发送到
shigeoka.com
服务器。固定的
shigeoka.com
服务把它交付给
evilwizard
用户。那个
evilwizard
的用户客户端接收到包并更新它的显示。没有哪个服务器知道自定义
IQ
包但是能够适当发送包。
现在让我们看一个具体的例子。