<presence type="probe" from="friendlyuser@somewhereelse" to="boreduser@somewhere"/> Boreduser@somewhere's server would then respond with a tailored presence response: <presence xml:lang="en" from="boreduser@somewhere" to="friendlyuser@somewhereelse"> <show>chat</show> <status>Bored out of my mind</status> <priority>1</priority> </presence>
这些联机状态值源自 “个人-个人” 消息传递软件。show 元素的值 — 通常用于确定将向其他用户显示的状态图标 — 在聊天应用程序之外如何使用现在还不清楚。状态值可能会在微博工具中找到用武之地;例如,Google Talk(一个 XMPP 聊天服务)中的用户状态字段的更改可以被导入为 Google Buzz 中的微博条目。
另一种可能性就是将状态值用作每用户应用程序状态数据的携带者。尽管此规范将状态定义为可读,但没有什么能够阻止您在那里存储任意字符串来满足您的要求。对于某些应用程序而言,它可以不是可读的,或者,它可以携带微格式形态的数据负载。
您可以为一个 XMPP 实体拥有的每个资源独立设置联机状态信息,以便访问和接收连接到一个应用程序中的单个用户的所有工具和上下文的数据只需一个用户帐户。每个资源都可以被分配一个独立的优先级;XMPP 服务器将首先尝试将消息传递给优先级较高的资源。
XMPP 使用 BOSH 越过 HTTP要通过使用 JavaScript 的 XMPP 进行通信的 web 应用程序必须符合一些特殊要求。出于安全考虑,不允许 JavaScript 从 web 页面的域与不同域上的多个服务器通信。如果您的 web 应用程序界面被托管在 application.mydomain.com,所有 XMPP 通信也必须发生在 application.mydomain.com。
防火墙是另一个问题所在。理想情况下,如果您将 XMPP 用作您的 web 界面的实时元素的基础,那么您希望它对防火墙后面的用户有效。但是,公司防火墙通常只对少数几个协议开放几个端口,以便允许 web 数据、电子邮件和类似的通信通过。默认情况下,XMPP 使用端口 5222,这很可能是公司防火墙阻止的端口。
假设您知道您的用户前面的防火墙在端口 80 上允许 HTTP(这是用于访问 web 的默认协议和端口)。理想情况是您的 XMPP 通信能够越过该端口上的 HTTP。但是,HTTP 的设计并不针对持续连接。web 的架构不同于实时数据所需的通信架构。
下面我们看看 Bidirectional-streams Over Synchronous HTTP (BOSH) 的标准,该标准为双向同步数据提供一个模拟层。借助这个标准,可以与一个 XMPP 服务器建立一个较长的 HTTP 连接(时长一分钟或两分钟)。如果新数据在那个期间到达,则 HTTP 请求返回数据并关闭;否则,该请求只是失效。不管是哪种情况,一旦一个请求关闭,另一个请求将重新建立。尽管结果是对一个 web 服务器的一系列重复连接,但它是一个比 Ajax 轮询更有效的数量级,特别是因为连接到的是一个专业服务器而不是直接连接到 web 应用程序。
BOSH 上的 XMPP 允许 web 应用程序通过一个原生连接持续与 XMPP 服务器通信。客户端通过端口 80 上的 HTTP 上的一个标准 URL 连接。然后,web 服务器将这个连接代理到由 XMPP 服务器操作的一个不同端口 — 通常是 7070 — 上的 HTTP URL。这样,无论何时数据被发送到 XMPP 服务器,web 应用程序只需使用一些资源,而 web 客户端可以使用通常支持的 web 标准从防火墙后操作。维持 BOSH 的较长 HTTP 轮询的开销主要由 XMPP 服务器而不是 web 服务器或 web 应用程序承担。web 服务器和 XMPP 服务器都不会受到与使用 JavaScript 进行通信一样的域限制,正是因为这一点,消息才能够被发送到其他 XMPP 服务器和客户端。
现在,您理解了 XMPP 如何适合实时 web,可以下载并设置它,以便开始创建这个 Pingstream 应用程序。
获取和安装一个 XMPP 服务器在本小节中,您将安装 Openfire XMPP 服务器并配置它来支持您的实时 web 应用程序。
选择一个 XMPP 服务器有两个领先的开源 XMPP 服务器可以免费下载。它们都应用广泛并通过 GNU Public License version 2 许可,每个服务器都有自己的优势和缺点:
图 1. 在 phpMyAdmin 中添加一个 Openfire 数据库添加用户和数据库后,就可以安装 Openfire 服务器了。
安装 Openfire下载 Openfire 安装程序并运行它,将 Openfire 安装到您选择的位置(参见 )。(您也可以选择从 Openfire 的 Subversion 源代码知识库检查 Openfire 的最新版本并本地构建它,但这个主题超出了本教程的范围。)收到提示时,告知 Openfire 安装程序在安装完成时启动服务器。
服务器启动后,您应该看到服务器状态窗口,如 所示:
图 2. Openfire 的状态窗口单击 Launch Admin 打开一个基于 web 的向导,如 所示,该向导将带您逐步配置您的 Openfire 服务器:
图 3. 配置向导配置向导允许您选择使用标准数据库连接或嵌入式数据库连接。选择标准数据库连接,以便您能够使用您的 MySQL 数据库。
从 Database Driver Presets 列表选择 MySQL。将您的服务器和数据库名称插入 Database URL 字段。例如,对于在 localhost 上设置、名为 openfire 的 MySQL 数据库而言,应输入:
jdbc:mysql://localhost:3306/openfire
在向导的下一屏幕上,选择将用户帐户存储在数据库中。输入此前创建的数据库用户的用户名和密码,然后一直继续到配置向导结束。此时,您应该已经为您的 XMPP 服务器创建了一个服务器管理员并设置了域位置。
每用户通知的插件