Jabber开发

一,Jabber概述:

第一个Jabber技术的应用是由开源社区发起并一直领导的即时消息的实时系统。Jabber即时消息(IM)系统和现有IM服务相比较由以下几个关键特点

Jabber在设计上很大程度上沿袭了Internet上最成功的消息系统:即email。这样Jabber就可以在一个使用共同协议的服务器组成的分布式网络上提供通信,连接这个网络的客户端,可以象接收消息一样发送消息给同一个服务器或其他Internet上的服务器上的用户。不过,尽管email是一个存储-转发系统,但Jabber转发消息却是实时的,因为Jabber服务器(连同其他所有Jabber服务器在内)知道一个用户什么时候在线。这个能力被成为在线,也是即时消息的核心所在。Jabber通过两个附加功能提供这些IM标准特性,这也使得Jabber与众不同。首先是一个允许消息系统间协同作业的开放协议。其次是建立在XML上的强大根本,它使得非但是两个人之间的通信,甚至是应用软件之间的通信成为了可能。

Jabber 实现点对点(P2P)

Jabber 实现一个 Evolved 可变系统架构:

× Jabber In-Depth

Jabber 技术:

传统通讯工具本质:一是数据自动化处理工具,二是替代纸笔的数据输入工具

传统通讯工具特点:直接处理(鼠标键盘菜单工具栏工作区域一起上),即时回馈,非人性化(依赖机器和软件和枯燥的操作培训),与其他软件协作性差

传统通讯工具的缺点:通常不可无人托管,与其他软件协作性差,对话框等枯燥不可忍受,工具无法从操作者互动中自我学习

Jabber 是一种:

…内嵌服务:

Library Modules库模块:用C语言编写的库模块,耗费资源小,可以通过编一个库模块链入服务器来自己编写组件。

TCP/IP Sockets套接字:可以用C/Java/Python等编写TCP/IP套接字模块,好处是可以跨服务器连接组件以建立可伸缩的服务器群平衡负载。

STDIO:老版的应用可以通过STDIO方式在服务器启动时调用可执行文件而链入服务器,这种结合方式更紧密但也更具出错风险且难以部署和管理。所以将会渐渐被淘汰。

JID:Each service has a unique (within this server) Jabber identifier

<service jid=”weathercheck” name=”Weather Checker”>

<ns>jabber:iq:register</ns>

<ns>jabber:iq:gateway</ns>

</service>

服务端与客户端的互动:Jabber使用的是客户端-服务端的系统架构,而不是其它一些即时消息系统使用的客户端-客户端的系统架构。所有从一个客户端发给另一个客户端的Jabber消息和数据都必须通过服务端。任何一个客户端都可以通过商议与另一个客户端自由地建立一个直接地连接,但这些连接只用于特殊服务地应用。有一些实例被鼓励建立这种连接,比如文件传输,但这些实例必须先通过一个客户端-服务端形势进行协商,才能建立。

…基于客户端的服务:相关程序和脚本可以通过既定的XML格式作为客户端与其他客户端进行交互

…开放:开放的协议和内核代码,开源,文档齐备,

…异步:

…可扩展:模块化的、可扩展的系统架构

…分步:分布式网络。Jabber地网络体系是模仿e-mail系统地。每一个用户都有自己的服务器,并从该服务器上接收信息,消息和在线信息在这些服务器之间传输。可以添加任意数目的Jabber服务器,这些服务器接受客户端的连接,并与其它Jabber服务器进行通信。每一个Jabber服务器都独立于其他Jabber服务器,并且拥有其自身的用户列表。通过Internet,任一Jabber服务器都可以与其他Jabber服务器进行通话。

…安全:Secure Socket Layer(SSL)

…XML 协议:XML可以说是Jabber存在的理由。

使用TCP/IP

提供实时信息交换

…上线信息和可用性管理:CORBA, RMI, XML-RPC, SOAP, 和其它基于HTTP的XML信息传输,都无法验证网络节点是否可用。

上线信息通常如下:presence Information

<presence

from=’weatherservice@mpathsoftware.com/20715’

to=’eeyore@thewoods.com/Services’>

<status>Online</status>

</presence>

当接收方无效(不在线或者网络不通)时,Jabber进行可用性(availability)管理,自动保存信息并在接收方有效时按序发出。

…使用公共网络手段通讯:Jabber的ID使用类似SMTP电邮格式:user@host。这使得Jabber依赖于公共网络技术如DNS进行寻址,但也使得Jabber不需要ID的统一命名授权而方便扩展。

…企业内部网:要先建立一个Jabber服务器或邮件服务器,才能进行通讯

实用又有趣的一个应用

A Practical User Creation Script (Java version)

A Practical User Creation Script (Python version)

Jabber’s Open Source Development Heritage (And Its Implications) 33

Conclusion (or Rather,The Beginning)

二,安装与配置Jabber软件

1,下载服务端软件:http://jabberd.jabberstudio.org/downloads

2,安装服务端软件:

Linux and Unix:jabber-1.4.2.tar.gz

Windows:JabberD-1.4.2.exe

3,初始化服务端配置:

Jabberd 命令行参数:如# ./jabberd/jabberd –D –Z mio,log 查看mio.c和 log.c的调试信息。

Option Description

-c <file> Specifies the location of the jabber.xml configuration file.

-i <file,file> Specifies a number of config files to be parsed.

-D Enables debug output and keeps jabberd as the foreground process.

-H Location where jabberd will look for jabber.xml.This defaults to the directory in which you compiled jabberd.

-B Causes the jabberd process to detach from the terminal and run in the background.This is useful when starting jabberd from a system startup script.

-Z <zones> Debug zones.This is useful if you want to see debug messages from just certain parts of the server.

-v (or V) Server version.

-U <user> Attempts to run jabberd as the specified user.

jabber.xml文件:是Jabber服务器的配置文件。

默认的Jabberd服务:

Default Jabber Services Internal Service Name

Jabber session manager (JSM) sessions

Client-to-server connections c2s

Server-to-server connections s2s

Host name resolution (DNS) services dnsrv

Database services xdb

Transaction logging rlogger

Error logging elogger

其中<jabberd:cmdline>是一个特殊的标签,表示可以在命令行里用指定的参数覆盖xml配置文件里的相应设置。

<update><jabberd:cmdline flag=”h”>update.jabber.org</jabberd:cmdline></update> 表示jabber启动时自动到指定地址查看软件新版本

<vcard2jud/> 表示使用users.jabber.org的Jabber User Directory进行注册新用户

<browse>

<service type=”jud” jid=”users.jabber.org” name=”Jabber User Directory”>

<ns>jabber:iq:search</ns>

<ns>jabber:iq:register</ns>

</service>

</browse>

<ip port=”5222”/> c2s的端口

<ip port=”5269”/> s2s的端口

启动Jabber服务器:# ./jabberd/jabberd 加参数B则会在后台运行

停止Jabber服务:Ctrl+C 或 # kill `cat jabber.pid`

4,服务详细配置:

XDB服务:(for XML database),Jabber的数据库,保存在./spool子目录下的XML文件中

<xdb id=”xdb”> ///定义一个XDB服务实例

<host/> ///表示该服务组件会处理来自所有主机(包括虚拟主机)的访问请求

<load>

<xdb_file>./xdb_file/xdb_file.so</xdb_file> ///该组件的应用路径

</load>

<xdb_file xmlns=”jabber:config:xdb_file”>

<spool><jabberd:cmdline flag=’s’>./spool</jabberd:cmdline></spool> ///XDB的XML文件所在路径,可以通过s参数覆盖修改

</xdb_file>

</xdb>

Service io

Service c2s

Service s2s

Service dnsrv

Log Services

The Sessions Service

5,常用可选服务

Jabber 客户目录:Jabber User Directory (JUD)

会议

6,即时通讯客户端

三,Jabber 客户端

1,Jabber 客户端概述

2,会话技巧:Session Mechanics

3,协议技巧Protocol Mechanics

4,协议详细Protocol Details

The <stream:stream>标签

The <iq> 元素

Jabber Presence

Presence Attributes

The <presence> 元素

The <message> 元素

The <body/> 子元素

附加的 <message/> 子元素

使用 <message/> 传输任意数据:

四,Jabber服务端架构:

1,高级架构:

2,信息与会话:

远程信息:

客户端初始化:

3,可浏览代理:

4,即时通讯网关:

五,扩展Jabber服务器

1,数据库服务

配置服务:

源码列表:

连接到服务器:

JDBC Survival 技巧:

浏览:

搜索:

2,报告服务:

源码列表:

注册:

3,小离题: 一个用于JabberBeans的自定义包类型

XDB自定义存储:

定时报告生成:

4,库存管理服务:

5,分解库存管理服务:

六,Jabber 安全性:

1,服务端注册:

取消自动注册:

注册数据:

2,客户端认证:

简单认证:

概要认证:

零知识认证:

3,自定义认证组件:

连接认证服务:

处理认证包:

4,使用SSL客户端连接

SSL 概要

在Jabber服务中启用 SSL

5,服务端到服务端连接认证(回拨)

II 基于Jabber的网络应用

七,Web Services概要

1,第一代应用:服务器和弱终端:Servers and Glass Terminals,大型主机和工作站终端通过电缆连接

2,第二代应用:服务器与客户端: 即C/S结构,最流行的是MVC三层架构(数据库主机,应用控制主机,客户端)

3,第三代应用:Enter the Web:即简单的B/S结构,HTTP和HTML是它的两大要点

4,第四代应用:XML and Web :为了描述与搜寻特定服务,和调用服务器返回的数据等

Services

XML-RPC:XML-based Remote Procedure Call,是建立于HTTP上的XML传输

SOAP : Simple Object Access Protocol,是XML-RPC的扩展,不再依赖于IP的传输

WSDL : Web Services Description Language,是进一步的扩展,目前JABBER上无成熟实现

UDDI : Universal Description, Discovery, and Integration,是WEB SERVICE的最高层次,但目前尚未普及

5,Jabber and XML-RPC : Jabber可以穿透防火墙访问其后的IP

6,Jabber-Based RPC : Jabber-RPC取代了XML-RPC中的HTTP的作用

Jabber RPC Invoker

Jabber RPC Service Provider (First Version)

Jabber RPC Service Provider (Second Version)

7,Jabber-RPC Object Lessons

八,Jabber 和聊天软件代理

1,聊天机器人的起因: 用户可以更自然的方式去调用一个基于命令行的应用程序,开发者也可以用于复杂的服务和用户进行友好的交互。

2,采用的技术: 开源的项目Alice及其AIML

3,Alice概述:www.alicebot.org,其JAVA版使用Rhino ECMAScript解析器,使得用户可以通过HTTP 或 sockets调用任意JAVA类和资源

4,Alice工作原理:由于人们习惯于使用总量相对不大的常用的语法和词句来表达意思,所以开发者可以据此制作相对有效的AI系统

5,Alice设计原则: 和JABBER很相似,使用基于XML的数据库 startup.xml (通常位于 <ALICE-installdir>/conf)。Alice有一个内置的交互解析器,一个消息回馈机制,支持多种GUI客户端,还有一个多用户分时处理器(multiplexor)

6,Alicebot服务器:

AIML 目录—Alice的内置知识基础库的根目录,.aiml文件存储知识点,

Lib 目录—Alice的ProgramD版本的Java库。aliceserver.jar包含基本的Alice逻辑,JabberLib.jar是Jabber分时处理器,Jabberbeans.jar是标准Java Jabber功能,js.jar是Rhino ECMAScript解释器。其余是mysql.jar(数据库服务), servlet.jar (用于HTML Alice 客户端), xerces.jar (XML 解析器),org.mortbay.jetty.jar (内嵌WEB服务器功能)。

Alice 配置文件:startup.xml

7,ALICE 静态知识 (AIML) 文件

目录标签:<category>…</category>

模型标签:<pattern>…</pattern>

模板标签:<template>…</template>

主题标签:<topic>

8,小结: 安装步骤,框架

sites.google.com_a_deepcast.net_delphi_exodus_jabber_e5_bc_80_e5_8f_91_alice-jabber-architecture.jpg

9,The AliceJabber Mux 源码

10,使用Jabber运行 ALICE: 例如:www.verbots.com。Alicebot和Jabber这两个开源软件的结合天衣无缝,他们的作用因此难以想象。

九,Jabber 和系统控制与管理

1,Jabber 用于系统事件监视: 可以使用PYTHON等编程接收从WINDOWS,LINUX,UNIX服务器来的系统事件信息,并可过滤

2,Jabber 用于版本管理: 可使用PYTHON访问分布式组件的TIME和VERSION信息

3,Jabber 用于分布式控制: 可调用远程服务器于上的程序,可以群发调用,但须另外注意安全问题

4,Jabber 用于应用程序监视:激活APACHE的mod_status模块,就可阅读状态信息于http://<servername>/server-status(加个?auto参数就可以得到适于机器阅读的纯TXT文件),这样就可以用IM客户端读取状态信息并进行分析。

十,Jabber 与 JXTA

1,JXTA 技术介绍:juxtapose是SUN公司2001年创立的开源P2P项目。

2,JXTA 技术要素

Identifiers:使用随机产生的uniform resource names (URNs)进行定位

Advertisements: 是描述一个节点或服务的XML文档,比较重要的标签有:<jxta:PA> (PA指peer advertisement) <PID> 是peer的唯一标识; <GID> 是group的唯一标识; <Name> 是供人工识别的peer名称;<Svc> 是该节点提供的服务,每个服务都有自己的参数如:contact URLs 和 cryptographic certificates.

Messages :是peer之间传递的数据,是XML的片断,而非JABBER的完全的XML文件包格式。

Peers: 节点,端点

Peer Groups :Net Peer Group,节点群组

Pipes:是节点之间传递信息的可靠的管道

Modules (Services) : 主要的模块与服务有:Discovery Service.Membership Service.Pipe Service.Resolver Service.

3,Roles for JXTA Peers

Rendezvous Peers : 会集转播节点,提供把广播信息传递给其它节点的功能;

Relay Peers : 中继转播节点,可穿透防火墙或NAT(network address translation网络地址转换)障碍。

Proxy Peers : 代理节点 ,用于资源受限的设备如手机、PDA等

4,试用JXTA: http://www.jxta.org

5,The JXTA Java Binding API

6,Example: A Jabber-to-JXTA Bridge

Details of the talk Protocol

7,小结: Jabber的简单却可扩展的架构和JXTA的动态配置结合起来可以创建一个强大的P2P 应用。

十一,为多种流行语言提供的Jabber库:www.jabberstudio.org

1,Jabber-Net— .NET环境下的JABBER: http://www.jabberstudio.org/projects/jabber-net.功能齐备但代码稍复杂

Building the Examples

2,iksemel—Jabber for C/C++: ,小巧,功能精简

3,JabberBeans—Jabber for Java,稳健成熟而且功能齐备,但使用代码稍复杂

4,JabberPy—Jabber for Python: http://jabberpy.sourceforge.net,轻量级的易用的

A Cross-Language Example

5,Jabberlib—Jabber for TCL,虽然封包得并不完美,但在TCL下的IM有不少好用的功能

6,Net::Jabber—Jabber for Perl ,功能强大而齐备

7,Jabber4R—Jabber for Ruby,封包尚不完备,但简单易用

参考资料:

基于jabber(XMPP)架设内部即时通讯服务

Jabber 技 术 概 况

Jabber管理员手册中文版

Jabber.Developer's.Handbook.rar 1927k

JabberD-1.4.2.rar 961k

Jabberd 1.4 Windows 环境安装步骤.rar 3k