我们有ICQ,OICQ,AIM,Messenger等等,虽然都是聊天联络工具,但是它们之间甚至不能交换信息。好友很多,每个人的口味也不一样,难道要把所有的xICQ都打开?看,人家e-mail 多好,从不用管伊人用的什么系统。xICQ的本意是联系、聊天,不是说聊天不好,但是如果还能做点别的不是更好吗?等待,厂商给我们提供的功能太少了。要不,你自己开发,但是xICQ系统后面庞大的用户群却不可忽视。如果开放标准,提供全面的 SDK……好了,现在我们有了Jabber……
不仅仅是Jabber
虽然Jabber是设计为一个即时消息传递系统,但是它的XML架构使得它可以做得更多。
by Steve Gillmor and Sean Gallagher
Jabber是一个开放源码、跨平台、基于XML的消息传递系统,在这个平台上,用户可以传递文本、声音和视频,甚至是在程序之间进行直接通讯。DevX.com的编导Sean Gallagher和主编 Steve Gillor对Jabber 的创建者Jeremie Miller就Jabber的XML架构进行了采访。
Miller: 即时消息传递系统的客户端是一个用于收发消息,并将其显示给用户的程序。而在服务器端,服务器分别与不同的即时消息传递系统(服务)进行通讯(这些对客户来说是透明的),从而使得不同的服务之间可以相互对话,进行数据交换和处理。
从一般意义上来说,Jabber是一个即时消息传递平台。但更深入一点,则是一个在服务(services)和应用程序之间、应用程序和应用程序之间进行XML数据传递的平台。你会发现以这样一种模型来看Jabber,将比简单的即时消息传递具有更广的应用范围。
Gillmor: 能举个例子吗?
Miller: 有许多应用程序以白板(WhiteBoard)形式在浏览器里进行文件共享,称为合作浏览。而我们所做的,就是为这些应用程序的后端处理提供一个通用的框架。比如你想同步你的通讯录。如果你的通讯录是以XML的格式存放的,那么应用SyncML程序把它传到服务器上。这些应用程序可能会使用Jabber来完成发送和接收数据。当你在一个程序里更新了通讯录的时候,它们将会自动传送到服务器上。于是,服务器会通知所有正在监听该通讯录XML数据的程序。
Gillmor: 为什么要使用XML?
Miller: 在1998年,我刚刚开始着手开始Jabber。那时候,通过反向工程,已经有了很多的开放源码函数库可以用来与不同的即时消息传递系统(AIM,ICQ和Yahoo)进行通讯。但是要完成这样一个客户端,你必须以不同的方式来使用这些函数库。其实,只要你对这些系统的数据流进行分析的话,会发现其实就是简单的消息、简单的通知和好友列表。如果,要定义一个通用的数据格式,你只有选择XML了。
Gallagher: 请问 Jabber 是如何扩展这些传统的消息传递(聊天)功能的?
Miller: 比如,我们已经为RSS(Rich Site Summary)写了扩展模块----RSS代理。你知道,现在已经有很多的站点在以RSSS的方式发布新闻标题和简要新闻,比如SlashDot,CNN等等。使用 Jabber客户程序,你就可以让 RSS代理跟踪指定站点。当它发现有新闻标题时,就会马上发送回来。
Gallagher: 当你向RSS代理发出请求的时候,这个代理是集成于客户程序本身呢,还是属于服务器端类型的代理?
Miller: 就现在来说,是在客户端完成的。在客户端,会有一个注册屏幕,用来注册代理。你可以是在ICQ或AIM上进行注册,并同时与双方的用户进行通讯。而且不管你在任何地方,在任何时候启动任何的客户程序,RSS代理都会自动把新闻标题传送给你。
Gillmor: 是不是像AIM的用户一样以ticker的形式表现出来?还是以窗口文本的方式?
Miller: 都可以。客户程序可以把它显示为文本。但是如果客户程序可以提取消息里的XML数据的话,它就可以用ticker的形式或是其他任意的方式显示。
Gillmor: 这些数据可以被服务器使用,并重新以 DHTML的形式发布出来吗,打个比方?
Miller: 当然可以。 接收者可以是其他的服务器,并发布到其他的Web站点上----Web服务模型。
Gillmor: Do you have an edge-server philosophy as part of the Jabber server?
Miller: 到现在为止,还没有这个必要。我们正在写的下一代服务器,将可以包容任意的客户。并将把服务器与客户更加紧密的结合在一起。
Gillmor: 这听起来好像peer-to-peer.
Miller: 太对了。在server-to-server的层次上,Jabber就是peer-to-peer。我们让服务器与客户靠得更近,这很明显是peer-to-peer技术嘛。从技术上来说,即时消息传递系统是依赖于中央服务器的。但是从用户的角度来看,则更像是 Napster 的peer-to-peer交互方式,虽然Naspster也有一个中央服务器。
Gillmor: 你有看到过何种以peer-to-peer方式工作的程序,超过了传统的客户/服务器程序所做的?
Miller: 让我们来看一看e-mail服务器吧,它们是100%以peer-to-peer的方式工作的。每一个e-mai服务器(SMTP服务器)都可以平等的与网络上其它的任意一台SMTP服务器进行通讯。从服务器到客户,这段是客户/服务器关系。但是从服务器到服务器,这完全就是peer-to-peer网络了。只有peer-to-peer才能真正让一个后台处理系统具有世界范围的扩展性。
Gallagher: 如何可以很容易的把Jabber变成XML格式数据的输送器(transport)?
Miller: 要回答这个问题,让我们首先来看一看XML是如何应用于Jabber中的。在即时消息传递系统里,客户需要与服务器建立并维持关系(表明你当前在线)。服务器必须能够在任意时刻产生消息,并发送给客户。我们通过简单的TCP Socket来完成。任意客户都可以与服务器建立一条Socket 连接。(见图一)
接着,我们必须决定如何发送和接收这些数据。我们想要使用XML,而且客户和服务器必须能以异步模式发送,在任意时刻。在那个时候,还没有其他的什么传输层协议可以完成这个工作。HTTP无法在这个模式下工作,SMTP虽然可以,但不是我们想要的异步方式。
最后我们决定把这个TCP Socket连接称为 XML文档。在连接双方刚开始建立关系时,我们从文档的根节点开始往下不断的发送 XML数据片断。在连接的另一方,不断的对接收到的数据进行解码,这个工作随便一个SAX解码器都可以做。
在XML数据流的上层,我们定义了三种协议类型:消息(message)、表现(presence)和信息查询(InfoQuery----IQ)。信息查询是在其他 XML的外面加的一层通用包装,比如好友列表,V-Card。其实,除去消息和表现,剩下的就一定是信息查询了。你可以把自己定义的XML数据插入到消息中,或是表现里,但是一定要在自己的名字空间里哦。
Gallagher: 我可以使用在IQ标签里的任何东西吗?比如客户到客户之间的其它类型函数调用?
Miller: 当然可以。
Gillmor: 可以把 SOAP调用封装在IQ标签里吗?
Miller: 没有问题,事实上我们已经这么做了。而且,我们还在服务器端放置了一个HTTP输送器(HTTP transport),用来把包装后的调用还原成真正的 SOAP调用。看看那些XML 名字空间和DTD,你可以把 XML数据插入这些消息、表现和IQ中。可以在服务端提供一些服务,要么产生,要么直接插入XML数据,比如往你正在进行的对话中添加数据。而在客户端,如果它认识这些添加的XML数据,就可以显示出来。否则,就当作没有看见,而你仍然可以取得其它消息内容。
Gallagher: 把Jabber接口应用于一个应用程序,使其具有聊天功能,显示好友列表,并通过Jabbber 消息与其它用户交流,这些是不是很简单?
Miller: 我很希望能够去写这些应用程序。这根本不是一件难事。
Gillmor: Jabber 的架构会不会成为其它架构的一部分或是原型?比如Ray Ozzie 的Groove 系统结构?
Miller: Jabber 被设计成为与协议无关的。在服务器端,我们取得基本的 XML数据片,转换到其它的传输层,比如放入ICQ 网络或是其它的即时消息系统中。基于 SMTP网关和HTTP网关,我们建立了SOAP和XML RPC。添加一个新的网关,比如连接到Ray Ozzie建立的系统,无非就是接入其网络,并在服务器端对Jabber 所用的XML数据和其他网络的XML或是随便什么格式的数据进行转换。这样做的优势在于,Jabber应用程序或是客户端可以透明的访问被连接方的网络上的任何东西,因为转换工作是在服务器端完成的。在Jabber的上层建构的应用程序不需要做任何的修改和添加,就可以支持其它新增网络。
Gillmor: 你们使用Apache的工具吗?比如 Parser 和XSL引擎?
Miller: Jabber服务器是基于C的。所以我们使用 James Clark写的 基于C的Parser。项目中有些部分用到了Apache的工具。
Gillmor: 对文档对象模型(DOM)有任何的支持吗?
Miller: 因为我们没有涉及 HTML和XML的界面显示,在客户端也没有用到任何的脚本语言,所以没有理由使用DOM。
Gallagher: 你们真的只需要用SAX的事件驱动模型吗?
Miller: 是的,用于提取消息和表现。假如你需要对提取出来的XML数据以定制的方式显示,你可以随便怎么做。
Gillmor: 你有没有什么想法,关于如何应用你们这套协议?是直接嵌入浏览器呢?还是做成一个单独的即时消息客户端?
Miller: 事实上,已经有一个基于Mozilla的Jabber客户端 在开发当中。这是一个外插组件,作为一个平台,可以利用Jabber的优势。但是浏览器设计的本意不是用来接收这些实时的事件消息的,处理Socket的方式也不是我们想要的,浏览器是基于” 拖(Pull)”模型的。而且操作必须在 浏览器里初始化,所以很难把一些即时消息模型映射到浏览器里,因为它们本来就不是这样设计的。
Gillmor: 对于带宽的考虑是怎样的?
Miller: 我们曾经对Jabber.org 和Jabber.com的出入数据流量进行过统计,你完全可以在300波特的modem上运行 Jabber。有人说XML效率太低,但是甚至在我们不进行压缩的情况下,XML对带宽的影响也很小。
Gillmor: 安全性如何, 有没有对数据流进行加密?
Miller: 服务器支持SSL;对于客户端,是可选的。我们已经定义了一个选项,客户可以决定是对消息和表现进行加密或是数字签名,包括消息里的XML数据。你可以把XML放在消息和表现中的任意地方。
Jabber架构对于正在传输的XML数据是毫不知情的,而交给服务和应用程序来处理。Jabber仅仅是一个通用的XML路由框架。它是根据用户标示(某种类型)来与对方,或是对方的程序进行通讯的,而不仅仅是URL和 IP地址。
Gallagher: 因为你它只包括最基本的结构,所以开辟了很广的应用潜力。
Miller: 想到可以有这么多的应用,我们感到很高兴。我们有一个模块可以在你的聊天的时候,把你的说话内容转换成为另一种语言,然后传送。1997年我第一次看到XML,时间飞逝。在未来,所有的应用程序数据都将用XML来定义。我们要让网络系统更多的了解XML,让XML数据被灵活路由,在需要它的节点之间灵活穿梭,这样我们就可以很方便的把XML融合进我们的程序当中。
相关链接:
www.jabber.org