Jabber即时通讯客户端(一)(转)

约定:
  [JPO]代表[Jabber Protocol Overview]
  [JPG]代表[Jabber Programmers Guid]

  现在网络中最流行的程序,莫过于即时通讯软件了,从ICQ到QQ,全世界约有7000万人每天在使用它们。人们利用它来沟通、交流,它是继电子邮件之后另一个最成功的通讯工具。如此成功的软件模式引出了一系列出色产品的诞生:ICQ,Yahoo! Messenger,AOL Instant Messenger,MSN Instant Messenger及中国人用的最多的QQ,而其中有一个较之其他通讯程序更璀璨夺目的明珠,那就是Jabber工程。

  Jabber是一个基于开放模式的软件工程,现在的主要目的运用于即时通讯(Instant Messaging System),Jabber并非第一个发明者,但它拥有几个非同一般的特点:
  
  *基于XML
  *分布式构架
  *开放式协议与代码库
  *方便的、可扩展的组件模式

  这些特点使得jabber一出世,便深受瞩目,可以毫不避讳的说,几大流行通讯软件(如Yahoo!,AOL Messager,还有tencent的QQ)都是从jabber的代码库中发展而来的。而它基于XML的通讯协议,使得跨平台很容易就能实现,现在的jabber已经可以使PC,Palm(掌上电脑类)以及SMS(短信息)、WAP互相沟通无碍了。总之,jabber的发展激动人心,它极有可能成为未来的即时通讯标准。

  以下介绍的是Jabber的工作状态,依据版本为最新的1.4。

  
Jabber前介
  
  Jabber Session
  整个Jabber的交流是基于一个会话(session)过程的,Jabber会话开始后,就会同指定服务器的端口5222(或者是5223,如果使用SSL进行加密的话)进行TCP连接。WellJabber作为一个演示性程序,没有将SSL选项包含在内——需要注意的是,并非所有的服务器端都支持SSL。

  Jabber发送的数据流是由一个连续不断的XML文档构成的,它的根元素为,而只有当C/S两端都注销时——即发出关闭标记,这个XML文档才算彻底结束。在里的子元素们都是做为命令出现的,各自包括自己的属性、内嵌元素,以此作为参数。

  服务器/客户端两边的连接都是异步传输模式,这不同于诸如POP这样的协议,在你发出一个命令时,不需要等待另一端的回应,可以直接发出下一个(命令)。此外,服务器可以随时向你发出指示(比如说,当你的一个好友上线或离线时),这就意味着你得随时作好处理这些指示的准备。

  那如何将一个回应同特定的命令对应起来呢?这是id属性需要做的事。你发出一个命令时,需要包含这个属性——以一个恰当的唯一值出现,而从服务器返回的回应,也包括同样的属性值。具体处理时,可以用一个散列表(Hash Table)作为id值,以此来标识那些需要回应的请求等数据。当然,设置合适的id值是服务器端的事,客户端所要做的是随时接收server发来的指示,在编写代码时,可以开辟一条单独的线程或利用一个select/event来响应接收的信息。这些在C/C++中都拥有良好的支持,但PHP则不行,因为它毕竟是脚本语言,不能进行系统函数的调用,所以WellJabber暂时只能做到请求/回应的模式,不能做到随时处理主动接收的信息,也就是当好友发一个信息给你时,你没有办法去判断、接收它。因为这个至少需要一个循环来处理接收,但在脚本中出现这个循环意味着你的程序在信息到来之前始终不能完成,这是相当可怕的。对 WellJabber来说,这的确是个不小的遗憾。

  Parsing XML
  实际处理时,最困难的部分可能就是解析XML文档了,但幸运的是XML不同于HTML,它有着严格的语法定义和格式,比如所有标记和属性都是大小写敏感的,所有的属性结束时都要求明确的关闭标记,属性值、标记外的文本内容都不得与XML保留字相同(如、&、’、” 这样一些,如果需要可以用&entity;的形式代替),还有就是非ASCII码字符集的文档要求在中明确标识,通常中文可以处理为:

  <?xml version="1.0" encoding="GB2312" ?>
  或<?xml version="1.0" encoding="BIG5" ?>

  自己写出一个XML解析程序是完全有可能的,但幸运的是,有很多标准的XML解析程序(库)可供我们使用,比如使用PHP编写的WellJabber实际上就是利用expat作为解析模块。这里要注意的一点是,你的解析程序必须能处理任何得到的XML数据片段,因为前面已经说过,jabber中传递的XML数据并非完整的,一个彻底结束的数据流(以结尾)要到程序注销时才能出现。

  补充:Expat是一个很有名的XML解析程序,很多出色的软件工程使用它做为XML文档的解析模块,譬如PHP及Perl等。

  Writing XML
  写XML数据相对来说比较简单了,但仍要注意必须写得符合语法要求,少一个引号都可能引起服务器拒绝处理、甚至是断开连接。


  
登录/注销Jabber会话

  Opening the session
  当你打开位于5222(或5333)端口上的socket后,需要发送一个标准的XML头,以此来打开一个以开始的完整jabber会话。

<?xml version=”1.0” encoding =”UTF-8”?>
<stream:stream
to=”jabber.org”
xmlns=”jabber:client”
xmlns:stream=http://etherx.jabber.org/streams>

  这样就可以唤醒服务器了,这时服务器会回应大致如下信息:
<?xml version=”1.0” encoding=”UTF-8”?>
<stream:stream
from=”jabber.org”
id=”39ABA7D2”
xmlns=”jabber:client”
xmlns:stream=http://etherx.jabber.org/streams>

  这时XML解析器就可以发挥作用了,它提取并保留当前的id值,因为本次Jabber Session就依靠它来标识了。

  我使用TCP Echo Client测试了一下,的确是如[JPO]中所述的一样,只是要手工输入XML代码比较麻烦。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126324/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126324/

你可能感兴趣的:(Jabber即时通讯客户端(一)(转))