`
Clayz
  • 浏览: 298549 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

基于XML的即时消息开发Jabber

阅读更多

Jabber对于即时消 息是一个开放的、基于XML的数据模型和协议。联系不断增加的基于Jabber开放资源和商业产品的数目,这种协议提供了摆脱即时消息服务器所有权束缚的 一种方法。多种多样的开放资源Java APIs能够帮助你建立基于Jabber的服务器并将即时消息整合到你的应用程序中去。在这篇文章中专门阐述了这一点。

即时消息作为个人——个人通迅工具取得了显著的成功。在有些地方它已经作为在线联系的首选方法取代了email。现在,开发者正将这一技术应用到应用程序——个人和应用程序——应用程序通迅上。  

直到最近,也只有少数服务提供商掌握了这一技术。通常流行的即时消息服务是建立在所有权协议基础上的通迅孤岛。实施面临一个困难的决策:支持多协议或锁定到一个单独的。不管哪种选择,实现都必须依赖一个属于即时消息(IM)服务提供商的服务器。  

开放式协议能够帮助开发者摆脱所有权 陷阱。其优势有多种:开放协议鼓励竞争实现的发展(一些开放资源)。他们鼓励广泛采用一种公共协议,这样可以阻止通迅孤岛和服务供应的孤立主义方法的发 展。用多种方法,开放协议使因特网成为可能。在即时消息领域,开放协议确保封闭系统及协议不会阻碍基于IM服务器的发展的互操作性。  

Jabber是一种针对即时消息和现场服务的开放协议。作为一个公共协议的最主要的侯选者,Jabber有潜力打破所有权在即时消息服务的控制。  

这篇文章将解释如何实践发送简单Jabber消息和开发一个简单的基于开放标准及开放资源APIs和产品的布告服务器。  

为什么使用Jabber?

Jabber 标准和结构帮助创建一个分布式的IM系统,使人联想到分布在因特网上的email系统,用户在本地连接到这些系统。这个方法直接与象AIM(AOL即时信 使)、ICQ、MSN(Microsoft网络)及Yahoo这样的流行服务提供商提供的单一系统结构作对,在那里一个单独的中央服务器或集中服务器组提 供消息服务。Jabber在其他情形也类似于email结构:Jabber使用一个几乎与基本SMTP(简单邮件传输协议)方案一样的地址方案确定它的终 点(人,机器,软件)地址。例如myname@elogex.com是一个有效的Jabber地址,或使用Jabber说法叫JID(Jabber ID)。因为这些原因,基于Jabber的系统衡量起来好于已存在的专有系统。加之,对于专有即时消息服务的网关允许的协议是必需的。  

多种多样的Jabber服务器,包括我们在这篇文章中使用的其中之一,都是自由可使用的,意思就是说你不再需要依赖一个第三方IM服务提供商(第三方Jabber服务对于那些要求第三方主机服务的来说也是有用的)。  

标准化

当讨论Jabber标准的益处时,我应该提及IETF IM标准的工作。在写这篇文章时,其IMPPWG(即时消息和现场协议工作组)已有多个RFC有效,其中最重要的是:  
·RFC 2778:现场和即时消息模型  
·RFC 2779:即时消息/现场协议要求

IMPPWG已经起草了一个名叫CPIM(公共现场和即时消息)协议的因特网标准。Jabber协议也是一个草拟的因特网标准,但不是IMPPWG工作的部份。  

Jabber在哪儿适合这一标准工作 呢?依照Jabber网站,Jabber是“承诺完全支持任何开放实时消息协议,包括IETF协议”。如果当对于这个 IETF协议的支持增长时,Jabber打算将自己定位为IETF协议的领导开放资源的平台。到目前为止,IETF的工作更多地主要集中在收集要求上而不 是执行。暂时,Jabber仅是一个带有重要开放资源支持的开放即时消息和现场服务协议。结果,它成为开放即时消息事实上的标准。  

另一个值得密切注意的竞争对手是Sun微系统的Jxta协议,另一个基于XML针对peer-to-peer(P2P)应用程序开发者的协议。各种各样的 Jxta实施在今天已经能够被提供。但是,由于其起源相对较近,Jxta比起Jabber只有很少的牵引力。  

下载并安装

要开始使用Jabber,你首先需要下载必要的工具:你需要一个Jabber服务器,一个Jabber客户端,一个帮助管理和隐藏一些复杂socket处理的API,XML语法分析,消息创建等等。  

Jabber服务器

为了运行Jabber,你选择的 Jabber服务器不能有问题,自从他们都接受了标准Jabber XML及与终端应用程序通迅以释放负荷,其也是标准Jabber XML。Jabberd,最初的Jabber服务器,是开放资源(但不是基于Java),安装配置简单并在多数平台上都有效,包括Unix、Linux、 Windows和Mac OS X。JabaServer开放资源方案也值得提及,但现在,这些基于Java的方案仍不如Jabberd成熟。同时,JabaServer安装不怎么简单 易懂,因为你必须下载、安装并配置一个第三方数据库,加上创建必需的数据库规划。  

对于这篇文章的例子,我选择 Jabberd。当二进制及源下载对于jabberd都有效时,我就不在这儿描述怎样建立一个源发布。除非你真想自己编译,可以从jabberd 主页下载二进制发布。在Windows平台上安装是相对容易的。发布是一个.exe程序,按照安装向导一步一步执行。  

安装完成后,你无需配置。在Windows2000,不要求配置。只要双击二进制程序就可启动服务器。  

用户代理/客户

我决定使用Exodus客户端,对于 这个方案这是另一个开放资源技术。我尤其喜欢Exodus的调试标签,可以允许你正确地查看客户发送和接收的XML。另外你能够作为纯粹的XML键入 Jabber消息并将它们发送给服务器。所有这些都证明用Jabber协议和服务器测试的有用性。  

Exodus的安装简单易懂。下载Exodus 压缩文件(我在文章中使用的是0.6版本)。将文件直接解压到你想要安装客户端的目录。在这个版本中,文件是些简单的二进制文件和一个.dll文件。你可以从 Muse 主页下载Muse API。

发送你的第一个Jabber消息

要发送一个Jabber即时消息,你必须初始化Muse Jabber API。通过创建一个JabberContext 类的实例来完成,接下来使用内容作为一个参数到Jabber session factory类的createSession()方法:

java 代码
 
  1. //初始化Jabber context       
  2. JabberContext jabberContext = new JabberContex  
  3. ("user""pass""localhost");       
  4. //创建一个Jabber session factory的实例       
  5. Jabber jabber = new Jabber();       
  6. //创建新会话       
  7. JabberSession jabberSession = jabber.createSession(jabberContext);  

上面的例子在第2行显示了一个新 context的创建。JabberContext存储了指定的用户相关信息(用户名、密码、用户地址)以及稍后要使用 context建立session时包含的一个唯一的会话标识。为了阐述意图,我直接使用了username、password和server。

在第5行,一个Jabber session factory被创建,我们在第7行使用它创建了一个新的JabberSession,Muse进入由Jabber服务器提供的服务的主要接口。服务器的主要服务是:  
·连接服务: 从Jabber服务器连接和断开  
·用户服务: 针对用户鉴定及注册  
·现场服务: 接收从其它用户/服务来的及你自己广播的现场信息  
·登记表服务: 密友列表或地址薄  
·聊天服务: 发送多种类型的消息—组聊、私聊、标题等等  
·服务器服务: 获得与由这个Jabber服务器提供的服务相关的信息  
·客户服务: 获得关于其他用户的信息,比如用户登录的最后时间

现在我们已经有了一个已经初始化的Jabber session,我们能够用它在我们才创建的JabberSession对象中使用connect()方法去连接到Jabber 服务器:

//连接到服务器     
jabberSession.connect("localhost", 5222);

要连接到一个Jabber服务器,我们指定地址及在指定服务器上的机器端口号。标准来说,缺省Jabber端口是5222。  
现在JabberSession已经连接到服务器,我们能够在我们的服务中用login()方法登录:

//登录到Jabber服务器     
jabberSession.getUserService().login();

在第11行,我们使用 JabberSession获得一个到UserService的引用,接下来在我们服务中调用login()方法。注意方法自身不指定任何用户信息。当在 上面第7行JabberSession被创建时login()从与JabberSession相关的JabberContext中获得这些信息。  

现在我们已经成功登录到Jabber服务器,我们能够开始发送和接收消息。下面代码段显示了如何构造一个简单的标题风格的消息:

//构造测试消息     
java 代码
 
  1. JabberChatMessage msg = new       
  2. JabberChatMessage(JabberChatMessage.TYPE_HEADLINE);       
  3. msg.setSubject("Hello world");       
  4. msg.setBody("Hello world");       
  5. msg.setTo("user2@localhost");  

在第13行,我们创建了一个 JabberChatMessage实例。单个参数指定了我们要求的消息类型:TYPE_HEADLINE。 JabberChatMessage类的名字容易引起误解,实际上,它可以用来包含在Jabber协议中定义的消息的任何四种类型—普通、聊天、标题及错 误。在第15行,setSubject()和setBody()分别指定主题和内容。最后,setTo()在第17行设置消息接收器的JID。  

在封装下,JabberChatMessage将所有这些信息转换成一个内在的DOM(文档对象模型)树,这样当我们已经准备好发送消息给Jabber服务器时能够轻松产生XML。  

最后步骤:用sendMessage()方法发送消息:

//发送消息     
jabberSession.sendMessage(msg);   

在封装下

依 据上面例子所得的事实,Muse API有效地隐藏了与连接管理和XML语法分析有关的所有细节,因此允许你集中精力在手边的任务上:创建一个消息服务。然而,理解一些基础协议交换证明是 有用的。让我们关注一下当我们连接到服务器时发生的XML交换,登录,并象上面代码描述的一样发送消息。在下面的XML交换中,被客户接收的消息(我们例 子代码)带了RECV前缀,送到服务器的消息带有SEND前缀:

xml 代码
 
  1. SEND: xml version="1.0" encoding="UTF-8" ?>       
  2. <stream:stream to="localhost"        
  3. xmlns="jabber:client"        
  4. xmlns:stream="http://etherx.jabber.org/streams">        
  5. RECV: <stream:stream from="localhost" id="3D160545">     

所有的Jabber交换都发生在一个XML流的上下文。在我们客户与Jabber服务器之间连接的生命期间,两个完全的XML文档在一个时间传输一个片段。上面显示的最初交换允许客户开始发送XML流文档到服务器并且服务器开始发送XML流文档到客户。  
下面,一个要求鉴定的信息被发送给服务器:

xml 代码
 
  1. SEND:  
  2. <iq xmlns="jabber:client" type='get' id='id_10028'>       
  3. <query xmlns="jabber:iq:auth">       
  4.     <username>user</username>       
  5. </query>       
  6. </iq>       
  7. RECV:  
  8. <iq xmlns="jabber:client" type='result' id='id_10028'>       
  9. <query xmlns="jabber:iq:auth">       
  10.     <username>user</username>       
  11.     <password/>       
  12.     <digest/>       
  13.     <sequence>482</sequence>       
  14.     <token>3D15E63A</token>       
  15.     <resource />       
  16. </query>       
  17. </iq>    

在用户鉴定程序前述那段显示了第一次交换。开始,客户向服务器询问哪种鉴定方式对于给定用户是有效的。服务器段用下面的鉴定方法回答:  
·Plain 文本:标签  
·零知识鉴定:使用和标签  
·:象plain文本,但密码是SHA-1 (安全无序运算法则)-用用户的plain文本密码进行编码

我们实际上使用,象下面代码段描述的一样:

xml 代码
 
  1. SEND:  
  2. <iq xmlns="jabber:client" type='set' id='id_10030'>       
  3. <query xmlns="jabber:iq:auth">       
  4.     <username>user</username>       
  5.     <hash>425c73373237061edcc5f23ba239c6cc69556f5c</hash>       
  6.     <resource>Home</resource>       
  7. </query>       
  8. </iq>       
  9. RECV: <iq xmlns="jabber:client" type='result' id='id_10030'></iq>  

在这一点,用户连接到服务器并能够开始发送和接收消息:

xml 代码
 
  1. SEND: <message xmlns="jabber:client" type='headline'        
  2. id='id_10032' to='user2@localhost'>       
  3. <thread xmlns="jabber:client">id_10033</thread>       
  4. <subject xmlns="jabber:client">Hello world</subject>       
  5. <body xmlns="jabber:client">Hello world</body>       
  6. </message>  

上面片段显示了我们发送给接收者user2@localhost的测试标题消息。  

你可能已经注意到在前述协议段有一个重复出现元素:ID标签。因为session能够由多个异步会话组成,ID标签匹配查询并响应。  

接收消息

自 从这篇文章的主要方向是向你显示如何开发一个报警系统,我就很少注意消息接收。然而,为了完整性的利益,我应该讨论在Muse API中处理接收消息的一些有用特性。另外,因为报警服务是被登录到Jabber服务器的用户执行的,你能够适当地期望一些消息接收者试图与发送者通信。    

Muse 使用一个listener附在session上以接收进入消息的提示。下面代码显示了如何创建一个listener并将其附到session—— listener实际上附加到连接上,但自从我们的接口是在session级别并且JabberSession类有一个便利的方法添加一个 listener,我们就将其附加到session:

java 代码
 
  1. jabberSession.addMessageListener(       
  2.     new JabberMessageListener() {       
  3.         public void messageReceived(JabberMessageEvent event) {       
  4.             if (event.getMessageType() == JabberCode.MSG_CHAT ) {       
  5.                 JabberChatMessage msg = (JabberChatMessage)event.getMessage();       
  6.                 JabberChatMessage reply = new JabberChatMessage(JabberChatMessage.TYPE_HEADLINE);  
  7.   
  8.                 reply.setTo(msg.getFrom());       
  9.                 reply.setSubject("Re: "+msg.getSubject());       
  10.                 reply.setBody("I'm just a sender: please send messages to someone else");       
  11.        
  12.                 //发送消息       
  13.                 jabberSession.sendMessage(reply);       
  14.             }       
  15.         }       
  16.     }       
  17. );     

客户能够添加几个消息 listeners,每次一个消息被接收它们都要被调用。典型的,你为要处理的每一个类型的消息添加一个listener。另一个选择:为同一种消息类型 但在那些消息中的每一种不同的行为添加多个listeners。然而另一种选择将添加一个要处理所有消息类型的listener。选择依赖于你想完成什 么。  

在 上面的例子中,一个单独的listener被附加。Listener必须是实现JabberMessageListener接口的类的一个实例。这个接口 要求一个要被执行的单个方法: void messageReceived(JabberMessageEvent)。当一个消息从服务器被接收时这个方法将被调用。在例子代码中, messageReceived()方法首先检查在第4行接收的消息类型。自从Jabber用户代理使用了MSG_CHAT类型发送消息,就只对这种类型 消息才感兴趣。在第5行,Jabber消息从JabberMessageEvent 提取。在第9行通过设置收件人接收消息被用来构成一个给消息发送者的回复并且在第10行拷贝接收消息的主题。一个缺省错误文本被作为消息体在第11行被设 置,并且,在第15行,消息使用前面例子同样的方法利用JabberSession对象的sendMessage()方法传输。  

试试Jabber

这 篇文章提供了一个对于Jabber协议及少量你能够将这一技术应用到你的应用程序中去的开放资源方案的基本介绍。对这个协议有用的应用程序多种多样,并不 限于传统P2P感觉的即时消息领域。例如,jogger.jabber.org提供的Jogger,一个允许你通过发送一个消息给Weblog应用程序 (blog)就能更新个人网络杂志的有趣服务。Jabber在用户服务应用程序及其它结构的协作类型应用程序同样有很大的影响。  

象 上面例子所显示的一样,你使用一个API如Muse或JabberBeans在少许几行Java代码中就能够完成即时消息功能。记住我不能掩盖一些 Jabber其它重要的特征,如现场服务和登记表管理,这些在使用时都是相关的。另一个重要的特征是Jabber服务器的模块性和可扩展性,它允许一个开 发者创建新的服务直接整合进服务器。

分享到:
评论

相关推荐

    Delphi11.3基于XMPP(JABBER)协议的IM即时通讯客户端源码.zip

    XMPP是一种基于XML的开放标准协议,用于即时消息传递和在线状态管理。它以分散式架构设计,具有良好的可扩展性和安全性,被广泛应用于企业级通讯系统和各种IM应用中。JABBER是XMPP的一个早期实现,如今两者常被互换...

    Jabber协议概述

    Jabber协议,全称为Extensible Messaging and Presence Protocol(XMPP),是一种基于XML的即时通信协议。它最初由Jabber开源社区开发,并在2002年被互联网工程任务组(IETF)采纳为RFC 3920和RFC 3921标准。XMPP...

    wildfire_src_3_1_1.zip_ 即时消息_install4j_jabber server_wildfire_wi

    总结起来,这个压缩包提供的内容涵盖了即时消息服务器的关键组件,包括基于Jabber协议的Wildfire服务器源代码和一个可能的安装指南。开发者和IT专业人员可以利用这些资源来搭建自己的即时通讯系统,或者对现有系统...

    网络通信 jabber协议

    Jabber协议是一种基于XML的即时通讯协议,由开源社区主导开发,主要用于实现即时消息和在线状态的交换。它的核心优势在于其开放性,允许开发者根据需求进行扩展和定制。Jabber协议主要包括三个顶级XML元素:`...

    jabber/xmpp技术研究与应用

    Jabber/XMPP(eXtensible Messaging and Presence Protocol)是一种基于XML的即时消息传递和在线状态服务协议。它最初由Jabber开发,后被IETF采纳为正式标准。该协议的核心优势在于其开放性、灵活性以及跨平台的特性...

    JeCat-Jabber

    它基于XML,允许用户进行实时通信,包括文本聊天、语音通话、视频通话等。XMPP的优势在于其可扩展性,允许开发者添加各种定制的功能和服务,比如群聊、文件传输等。 JeCat-Jabber结合了这两种技术,创建了一个能够...

    instance_message_system_for_java.rar_Jabber_java 即时通讯_java 通讯_即时

    Java即时通讯系统是一种用于实现实时数据交换的应用程序,它基于Jabber协议,这是一个开放标准的即时消息和Presence协议。本项目实例“instance_message_system_for_java.rar”提供了一个使用Java实现的Jabber服务器...

    基于java的即时消息传输平台 Openfire.zip

    XMPP是一种基于XML的协议,最初由Jabber项目开发,后来被互联网工程任务组(IETF)标准化。它支持点对点以及多对多的通信模式,适用于企业内部通信、社交网络、协作工具等多种场景。XMPP的核心特点是其可扩展性,允许...

    Sams.Jabber.Developer's.Handbook

    3. **移动通信**:随着智能手机的普及,Jabber也被用于开发移动通信应用,为用户提供便捷的即时消息服务。 4. **物联网通信**:Jabber的XML基础使其成为物联网设备间通信的理想选择之一,支持设备之间的数据交换和...

    基于Jabber的IM系统的研究与实现

    Jabber是最早实现XMPP协议的开源项目,而XMPP则是一种基于XML的开放标准,用于实时通讯和协作。XMPP设计的核心理念是灵活性和可扩展性,使得开发者能够轻易地添加新的功能和特性。XMPP支持一对一聊天、群聊、文件...

    jxa1.2—jabber开源框架

    Jabber 协议基于 XML,因此具有高度的扩展性和灵活性。 **J2ME简介** Java 2 Micro Edition (J2ME) 是 Java 平台的一个子集,主要用于嵌入式系统和移动设备,如手机、PDA 和智能家电。J2ME 包含一组可配置的配置...

    简单的基于XMPP协议的即时通信的实现

    XMPP是一种基于XML的开放标准,常用于实现聊天、状态更新和实时通信。 **XMPP协议介绍** XMPP最初设计用于即时消息传递,但其灵活性使其可以扩展到其他领域,如语音和视频聊天、文件传输、群组聊天等。该协议的核心...

    基于Android的即时通讯源码

    Jabber/XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准协议,广泛应用于即时通讯系统中。它支持实时通信、状态发布和订阅、多用户聊天室等功能。在Android即时通讯系统中,Jabber/XMPP...

    基于openfire为服务器的xmpp即时通信 Android客户端

    Openfire是一款开源、免费的即时通讯服务器,而XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛应用于即时通讯系统,提供实时、双向的通信功能。 【描述】:“基于openfire为...

    jabber protocol in java

    Java中的Jabber协议是一个基于XML的即时通讯(IM)协议,它允许用户进行实时通信,包括文本消息、文件传输、语音和视频通话等。这个协议是开放源代码且标准化的,由XMPP(可扩展消息处理现场协议)基金会维护。在...

    XMPP权威指南 (利用jabber构建实时聊天应用).pdf

    由于XMPP是一种基于XML架构的开放式协议,在IM通讯中被广泛采用。 XMPP的基础部分已经在2002-2004年得到了互联网工程任务组(IETF)的批准, 这意味着XMPP在将来就像我们认为理所当然的Internet协议TCP/IP、HTTP、FTP...

    基于ArgsXMPP即时通讯实例

    XMPP是一种开放标准的即时通讯协议,它基于XML,并且广泛应用于各种即时通讯软件,如Google Talk、Facebook Messenger等。ArgsXMPP库提供了连接到XMPP服务器、发送和接收消息、处理用户状态等功能,使得开发者可以...

    Streaming XML with xmpp.pdf

    XMPP则是一种基于XML的即时消息和在线状态协议,它定义了如何在客户端与服务器之间以及服务器与服务器之间高效地流式传输XML数据。 #### Jabber/XMPP的历史与发展 Jabber/XMPP技术最初由来自美国爱荷华州卡斯凯德...

    安装和配置jabber服务器教程

    Jabber作为一种基于XML的开放通信协议,由Jabber软件基金会开发和支持。它主要用于即时消息传递,并且采用自由许可(GPL/JOSL),这意味着任何人都可以免费使用并进行扩展。 Jabber与其他主要的即时通讯服务(如AIM...

    基于XMPP的即时通信程序

    XMPP的核心设计基于XML流,使得数据传输具有良好的可扩展性和结构化特性。它的主要组件包括客户端、服务器和服务器之间的连接。在XMPP架构中,每个用户都有一个唯一的JID(Jabber ID),类似于电子邮件地址,用于...

Global site tag (gtag.js) - Google Analytics