<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jabbercn.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sprint20092010</id>
		<title>Jabber/XMPP中文翻译计划 - 用户贡献 [zh-cn]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jabbercn.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sprint20092010"/>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Sprint20092010"/>
		<updated>2026-04-23T22:44:27Z</updated>
		<subtitle>用户贡献</subtitle>
		<generator>MediaWiki 1.18.2</generator>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0128</id>
		<title>XEP-0128</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0128"/>
				<updated>2010-10-11T08:10:13Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 附录G:备注 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0128.html XEP-0128]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0128: 发现服务扩展'''&lt;br /&gt;
&lt;br /&gt;
摘要: 这个文件规定了发现服务的扩展信息的最佳做法。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Saint-Andre &lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0030#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
现状: 活跃 &lt;br /&gt;
&lt;br /&gt;
类型: 信息 &lt;br /&gt;
&lt;br /&gt;
版本: 1.0 &lt;br /&gt;
&lt;br /&gt;
最后更新: 2004-10-20 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：注意：此信息规范定义了一个最佳实践或协议配置文件已被批准的XMPP理事会和/或董事XSF局。实现是鼓励和最佳做法或协议配置文件是在生产系统中部署适当的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
开发人员觉得[http://xmpp.org/extensions/xep-0030.html 发现服务]不能包含更多的信息. 例如, &amp;lt;identity/&amp;gt; 元素不包含'description'属性, 我们可以增加这个属性吗? 答案是可以,但现在不行,太迟了(因为XEP-0030是最终版). 因此,最好的办法是制定一个扩充机制.&lt;br /&gt;
&lt;br /&gt;
让我们参考一个示例. 一个[http://xmpp.org/extensions/xep-0045.html 多用户聊天室][http://xmpp.org/extensions/xep-0128.html#nt-id92624[2]] 可能想要获取更多的信息, 包括房间描述信息,房间主题,房间在线人数和房间所有者的JID.&lt;br /&gt;
&lt;br /&gt;
增加一个新属性的服务发现架构(即使真的是一个选项)不能解决的问题,因为一MUC的服务可能需要提供某些信息，而发布，[http://xmpp.org/extensions/xep-0060.html 订阅] [http://xmpp.org/extensions/xep-0128.html#nt-id92653[3]]服务可能需要提供其信息。 &lt;br /&gt;
&lt;br /&gt;
一个更好的解决办法是通过一个扩展的信息包括命名空间，提供了一种灵活的结构化数据格式定义合格。 谢天谢地，我们已经拥有了这样一个协议： [http://xmpp.org/extensions/xep-0004.html 数据表格] [http://xmpp.org/extensions/xep-0128.html#nt-id92681[4]]。 此外，我们拥有一个共同的方式来定义字段形式用于数据： [http://xmpp.org/extensions/xep-0068.html 数据表格现场标准化] [http://xmpp.org/extensions/xep-0128.html#nt-id92702 [5]]。 使用这些构建模块，我们可以定义为扩展服务发现结果的一些最佳做法。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==建议==&lt;br /&gt;
如果一个实体的希望提供服务发现协议的扩展信息,出现在回复信息内,它应该这样做:每个独立的&amp;lt;field/&amp;gt;元素包含&amp;lt;value/&amp;gt;点数据信息子节点,所有&amp;lt;field/&amp;gt;元素包含在一个类型为&amp;quot;result&amp;quot;命名空间值为'jabber:x:data'的&amp;lt;x/&amp;gt;元素里.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type=&amp;quot;result&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns=&amp;quot;http://jabber.org/protocol/disco#info&amp;quot;&amp;gt;  &lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;x type='result' xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='[var-name]' label='[optional]'&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;[var-value]&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果数据字段被用来在由XMPP标准基金会核准的议定书时，他们应该符合相关的XMPP扩展协议规范并按照XEP - 0068定义的规则注册，返回信息中包含一个&amp;lt;field/&amp;gt;元素,其'var'属性为&amp;quot;FORM_TYPE&amp;quot;，其'type'属性的值为&amp;quot;hidden&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
一个实体不能提供'http://jabber.org/protocol/disco#items' 命名空间相关子信息,因为服务发现的核心原则是：一个实体必须确定其身份,不界定的身份与子节点的实体.&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==示例==&lt;br /&gt;
===IM服务器===&lt;br /&gt;
&lt;br /&gt;
以下是即时消息服务器返回一个标准的服务查询的例子.&lt;br /&gt;
&lt;br /&gt;
'''例1. 实体查询信息服务器'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='capulet.com' &lt;br /&gt;
    to='shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='shakespeare.lit' &lt;br /&gt;
    to='capulet.com' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='server' &lt;br /&gt;
        type='im' &lt;br /&gt;
        name='shakespeare.lit jabber server'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/network/serverinfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5222&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port_ssl'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5223&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='http_access'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/jabber&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='ip_version'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv4&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv6&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='info_url'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/support.php&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===群===&lt;br /&gt;
&lt;br /&gt;
下面是在多用户房间里查询服务的例子.&lt;br /&gt;
&lt;br /&gt;
'''例2. 用户查询房间信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='hag66@shakespeare.lit/pda' &lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    to='hag66@shakespeare.lit/pda' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='conference' &lt;br /&gt;
        type='text' &lt;br /&gt;
        name='A Dark Cave'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实现说明==&lt;br /&gt;
&lt;br /&gt;
一般来说，XMPP标准基金会给每一个发现服务在注册登记时指定一个FORM_TYPE.此外，特定的应用可以定义应用程序以及具体FORM_TYPEs，一个实体可以有多个服务发现的身份（例如，一个XMPP服务器也可能作为一个发布，订阅服务）。因此，它是可能的（允许一个单一的服务发现的结果，发现含有多种服务扩展元素（可能高达2为每个标识元素））。然而，在实践中是不可能发现任何特定服务的结果将包含多个服务扩展元素的发现。&lt;br /&gt;
&lt;br /&gt;
==安全注意事项==&lt;br /&gt;
&lt;br /&gt;
应用程序应确网络上任何实体都能发现服务扩展信息.&lt;br /&gt;
&lt;br /&gt;
==IANA注意事项==&lt;br /&gt;
&lt;br /&gt;
这份文件并不需要与互联网分配编码机构(IANA) [6]互动.&lt;br /&gt;
&lt;br /&gt;
==XMPP协议注册事项==&lt;br /&gt;
&lt;br /&gt;
本文件并不需要的相互作用的XMPP注册 [ 7 ]，但是，最佳做法是在XMPP的登记FORM_TYPEs和field值.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0128&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2004-10-20&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[XEP-0004|XEP-0030|XEP-0068|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
取代: 无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：N/A&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0128.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0128.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0030.xml XML] [http://xmpp.org/extensions/xep-0128.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
1. XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
7. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
If you are looking for a pair of pretty UGG Boots, you shouldn't miss this chance for purchasing UGG Classic Cardy Boots this season in our shop. Ugg Bailey Button would give people such a deep impression. UGG Classic Short Boots appreciate it not only by the high quality with steady innovations but also by its stylish designs. There is no doubt that it could go well with you casual outfits. There are many kinds of UGG Classic Tall Boots for different ages and tastes online. So pick up your own UGG Sandals now.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用 &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2004-10-20)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Active; also added implementation notes. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-03-15)&lt;br /&gt;
&lt;br /&gt;
Clarified syntax and corrected several errors; added IM server example. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-03-05)&lt;br /&gt;
&lt;br /&gt;
Initial version. (psa) &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
结束&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0128</id>
		<title>XEP-0128</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0128"/>
				<updated>2010-10-11T08:09:29Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 简介 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0128.html XEP-0128]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0128: 发现服务扩展'''&lt;br /&gt;
&lt;br /&gt;
摘要: 这个文件规定了发现服务的扩展信息的最佳做法。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Saint-Andre &lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0030#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
现状: 活跃 &lt;br /&gt;
&lt;br /&gt;
类型: 信息 &lt;br /&gt;
&lt;br /&gt;
版本: 1.0 &lt;br /&gt;
&lt;br /&gt;
最后更新: 2004-10-20 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：注意：此信息规范定义了一个最佳实践或协议配置文件已被批准的XMPP理事会和/或董事XSF局。实现是鼓励和最佳做法或协议配置文件是在生产系统中部署适当的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
开发人员觉得[http://xmpp.org/extensions/xep-0030.html 发现服务]不能包含更多的信息. 例如, &amp;lt;identity/&amp;gt; 元素不包含'description'属性, 我们可以增加这个属性吗? 答案是可以,但现在不行,太迟了(因为XEP-0030是最终版). 因此,最好的办法是制定一个扩充机制.&lt;br /&gt;
&lt;br /&gt;
让我们参考一个示例. 一个[http://xmpp.org/extensions/xep-0045.html 多用户聊天室][http://xmpp.org/extensions/xep-0128.html#nt-id92624[2]] 可能想要获取更多的信息, 包括房间描述信息,房间主题,房间在线人数和房间所有者的JID.&lt;br /&gt;
&lt;br /&gt;
增加一个新属性的服务发现架构(即使真的是一个选项)不能解决的问题,因为一MUC的服务可能需要提供某些信息，而发布，[http://xmpp.org/extensions/xep-0060.html 订阅] [http://xmpp.org/extensions/xep-0128.html#nt-id92653[3]]服务可能需要提供其信息。 &lt;br /&gt;
&lt;br /&gt;
一个更好的解决办法是通过一个扩展的信息包括命名空间，提供了一种灵活的结构化数据格式定义合格。 谢天谢地，我们已经拥有了这样一个协议： [http://xmpp.org/extensions/xep-0004.html 数据表格] [http://xmpp.org/extensions/xep-0128.html#nt-id92681[4]]。 此外，我们拥有一个共同的方式来定义字段形式用于数据： [http://xmpp.org/extensions/xep-0068.html 数据表格现场标准化] [http://xmpp.org/extensions/xep-0128.html#nt-id92702 [5]]。 使用这些构建模块，我们可以定义为扩展服务发现结果的一些最佳做法。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==建议==&lt;br /&gt;
如果一个实体的希望提供服务发现协议的扩展信息,出现在回复信息内,它应该这样做:每个独立的&amp;lt;field/&amp;gt;元素包含&amp;lt;value/&amp;gt;点数据信息子节点,所有&amp;lt;field/&amp;gt;元素包含在一个类型为&amp;quot;result&amp;quot;命名空间值为'jabber:x:data'的&amp;lt;x/&amp;gt;元素里.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type=&amp;quot;result&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns=&amp;quot;http://jabber.org/protocol/disco#info&amp;quot;&amp;gt;  &lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;x type='result' xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='[var-name]' label='[optional]'&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;[var-value]&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果数据字段被用来在由XMPP标准基金会核准的议定书时，他们应该符合相关的XMPP扩展协议规范并按照XEP - 0068定义的规则注册，返回信息中包含一个&amp;lt;field/&amp;gt;元素,其'var'属性为&amp;quot;FORM_TYPE&amp;quot;，其'type'属性的值为&amp;quot;hidden&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
一个实体不能提供'http://jabber.org/protocol/disco#items' 命名空间相关子信息,因为服务发现的核心原则是：一个实体必须确定其身份,不界定的身份与子节点的实体.&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==示例==&lt;br /&gt;
===IM服务器===&lt;br /&gt;
&lt;br /&gt;
以下是即时消息服务器返回一个标准的服务查询的例子.&lt;br /&gt;
&lt;br /&gt;
'''例1. 实体查询信息服务器'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='capulet.com' &lt;br /&gt;
    to='shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='shakespeare.lit' &lt;br /&gt;
    to='capulet.com' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='server' &lt;br /&gt;
        type='im' &lt;br /&gt;
        name='shakespeare.lit jabber server'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/network/serverinfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5222&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port_ssl'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5223&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='http_access'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/jabber&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='ip_version'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv4&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv6&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='info_url'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/support.php&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===群===&lt;br /&gt;
&lt;br /&gt;
下面是在多用户房间里查询服务的例子.&lt;br /&gt;
&lt;br /&gt;
'''例2. 用户查询房间信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='hag66@shakespeare.lit/pda' &lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    to='hag66@shakespeare.lit/pda' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='conference' &lt;br /&gt;
        type='text' &lt;br /&gt;
        name='A Dark Cave'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实现说明==&lt;br /&gt;
&lt;br /&gt;
一般来说，XMPP标准基金会给每一个发现服务在注册登记时指定一个FORM_TYPE.此外，特定的应用可以定义应用程序以及具体FORM_TYPEs，一个实体可以有多个服务发现的身份（例如，一个XMPP服务器也可能作为一个发布，订阅服务）。因此，它是可能的（允许一个单一的服务发现的结果，发现含有多种服务扩展元素（可能高达2为每个标识元素））。然而，在实践中是不可能发现任何特定服务的结果将包含多个服务扩展元素的发现。&lt;br /&gt;
&lt;br /&gt;
==安全注意事项==&lt;br /&gt;
&lt;br /&gt;
应用程序应确网络上任何实体都能发现服务扩展信息.&lt;br /&gt;
&lt;br /&gt;
==IANA注意事项==&lt;br /&gt;
&lt;br /&gt;
这份文件并不需要与互联网分配编码机构(IANA) [6]互动.&lt;br /&gt;
&lt;br /&gt;
==XMPP协议注册事项==&lt;br /&gt;
&lt;br /&gt;
本文件并不需要的相互作用的XMPP注册 [ 7 ]，但是，最佳做法是在XMPP的登记FORM_TYPEs和field值.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0128&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2004-10-20&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[XEP-0004|XEP-0030|XEP-0068|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
取代: 无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：N/A&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0128.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0128.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0030.xml XML] [http://xmpp.org/extensions/xep-0128.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
1. XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
7. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用 &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2004-10-20)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Active; also added implementation notes. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-03-15)&lt;br /&gt;
&lt;br /&gt;
Clarified syntax and corrected several errors; added IM server example. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-03-05)&lt;br /&gt;
&lt;br /&gt;
Initial version. (psa) &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
结束&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0004</id>
		<title>XEP-0004</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0004"/>
				<updated>2010-10-11T08:07:10Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 绪论 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0004.html XEP-0004]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0004: 数据表单'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP扩展协议用于数据表单，可以用于worklows如服务配置以及特定应用的数据描述和报告。这个协议包括表单处理的轻量级语义(如请求,响应,提交和取消),定义了几种常见的字段类型(布尔、单个或多个选择的列表选项、单行或多行的文本,单个或多个JabberID、隐藏字段,等等),为以后的数据类型提供扩展性,可以用在广泛的应用中。该协议并不是要提供完整的表格处理功能（由W3C XForms技术提供），而是提供这种功能的基本子集给XMPP使用。&lt;br /&gt;
&lt;br /&gt;
作者:	Ryan Eatmon, Joe Hildebrand, Jeremie Miller, Thomas Muldowney, Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0004#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 最终&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 2.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2007-08-13&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个最终标准.对于实现和布署来说可以被认为是一个稳定技术.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
几个现有的Jabber/XMPP的协议包含用户和应用程序之间的结构数据交换，为常用的任务，如注册（[http://xmpp.org/extensions/xep-0077.html In-Band Registration][[XEP-0004#附录G:备注|1]]）和搜索（[http://xmpp.org/extensions/xep-0055.html Jabber Search] [[XEP-0004#附录G:备注|2]]）。不幸的是，这些早期的协议是“硬编码”，因此很大的限制了可交换信息的范围。此外，其他协议(如，[http://xmpp.org/extensions/xep-0045.html Multi-User Chat] [[XEP-0004#附录G:备注|3]])可能需要以交换数据为目的，例如配置，但是配置选项可能根据具体实施或部署不同。最后，开发人员可能要以灵活的方式扩展其他协议(如, [http://xmpp.org/extensions/xep-0030.html Service Discovery][[XEP-0004#附录G:备注|4]])，以提供在基本协议没有定义的信息。在所有这些情况下，这将有助于使用一个通用的数据描述格式，可以用于动态表单生成和各种情况下的数据“建模”。&lt;br /&gt;
&lt;br /&gt;
一个例子可能会有帮助。试想一下，当用户创建一个文本会议服务的多用户聊天室，该服务允许用户以各种方式配置房间。虽然大多数实现可能提供了一个较为常见的可配置功能集（讨论记录，房间拥有者的最大数量，等等）。还会有一些分歧：也许一个实现允许把房间日志以各种文件类型（XML，HTML，PDF等格式）和各种时间周期（每小时，每天，每周等）保存。而另一个实现，可能只存在登录的开/关选择一种格式（如，在HTML保存每日日志）。很明显，第一个实现比第二个实现有更多的配置选项。而不像“硬编码”每个选项通过不同的XML元素（如，&amp;lt;room_logging_period/&amp;gt;），一个好的设计应该包含更多灵活的格式。&lt;br /&gt;
&lt;br /&gt;
此处所描述的'jabber:x:data'协议为Jabber/XMPP实体的使用定义了灵活的格式，控制在“名称值”对的简单和[http://www.w3.org/TR/xforms/ XForms 1.0] [[XEP-0004#附录G:备注|5]]（当这个协议被设计时才开始发展的）的复杂之间。在很多方面，'jabber:x:data' 与[http://www.w3.org/TR/xhtml1/ XHTML 1.0][[XEP-0004#附录G:备注|6]]的表单模块类似。但它提供一些Jabber特有的数据类型，允许应用程序请求数据字段，更自然地集成到IQ节的“workflow”语义中。而且它可以作为现有的Jabber/XMPP协议的扩展，而当这个协议被开发出来时，XHTML的表单模块却不能（尤其是当时并没有[http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/ Modularization of XHTML] [[XEP-0004#附录G:备注|7]]）。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文档涉及下列需求:&lt;br /&gt;
&lt;br /&gt;
# '''数据收集''' -- 该协议应允许表单处理实体（通常是一个服务器，服务，或bot）从表单提交实体（通常是一个由用户控制的客户端）收集数据。应该是通过不同的数据字段来做，每个都可以是不同的数据“类型”，而且允许自由格式的输入或多个选项的选择（就像HTML表单一样）。&lt;br /&gt;
# '''数据报告''' -- 该协议应允许表单处理的实体向表单提交的实体报告数据，再通过不同的数据字段。 &lt;br /&gt;
# '''可移植性''' -- 协议应该尽量只定义普通数据格式和基本的数据类型。提示应该在相关的用户界面提供，但应该仅仅是提示，而不是严格的要求。 &lt;br /&gt;
# '''简单''' -- 协议在客户端的实施应该简单，并且大多数复杂的工作（如，数据有效性和处理）应由服务器和组件去完成，而不是客户端。 &lt;br /&gt;
# '''灵活性''' -- 协议应该具有灵活性和可扩展性，而不像“硬编码”。&lt;br /&gt;
# '''兼容性''' -- 协议应该为已有的Jabber/XMPP协议定义一个扩展，而且不破坏已有的实现，除非绝对必要。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==协议==&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data' 命名空间的基本语法如下（正式的描述可以在下面的XML节中找到）:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='{form-type}'&amp;gt; &lt;br /&gt;
  &amp;lt;title/&amp;gt; &lt;br /&gt;
  &amp;lt;instructions/&amp;gt; &lt;br /&gt;
  &amp;lt;field var='field-name' &lt;br /&gt;
         type='{field-type}' &lt;br /&gt;
         label='description'&amp;gt; &lt;br /&gt;
    &amp;lt;desc/&amp;gt; &lt;br /&gt;
    &amp;lt;required/&amp;gt; &lt;br /&gt;
    &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
  &amp;lt;/field&amp;gt; &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素，应该包括直接作为&amp;lt;message/&amp;gt;节第一级子元素或作为&amp;lt;iq/&amp;gt; 节（其中第一级子元素是由一个&amp;quot;wrapper&amp;quot;命名空间限制的）的第二级子节。参见下文列举的限制。&lt;br /&gt;
&lt;br /&gt;
可选项&amp;lt;title/&amp;gt;和&amp;lt;instructions/&amp;gt;元素，允许表单处理实体把表单标记为一个整体并指定自然语言指令，后面跟着表单提交实体。这些元素的XML字符数据不应包含换行符（\n和\r字符），而任何换行符操作（如，在用户界面显示）在这里不是特指的。但&amp;lt;instructions/&amp;gt;元素的多个实体可以被包括在内。&lt;br /&gt;
&lt;br /&gt;
===表单类型===&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data'表单中数据的收集或提供可以位于不同的上下文。例子包括一个需要填写的空表单，填好的表单，一个提交结果，一个搜索结果，或仅仅是用'jabber:x:data'命名空间封装的一组数据。完整的数据上下文由3个条件提供：&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;wrapper&amp;quot;协议（即，以&amp;lt;iq/&amp;gt;节直接子元素为根元素的命名空间和受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素的父元素）。&lt;br /&gt;
# 一个包含事务（如，一个IQ &amp;quot;set&amp;quot;或&amp;quot;result&amp;quot;）或会话结构（如，一个消息&amp;lt;thread/&amp;gt;）的表单的位置。&lt;br /&gt;
# 表单中&amp;lt;x/&amp;gt;根元素的类型属性&lt;br /&gt;
&lt;br /&gt;
前面2件上下文信息有其他协议提供，而表单类型见下表描述。&lt;br /&gt;
&lt;br /&gt;
:'''表1：表单类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|表单 || 表单处理实体请求表单提交实体去完成表单。&lt;br /&gt;
|-&lt;br /&gt;
|提交 || 表单提交实体提交数据给表单处理实体。提交信息可以包含不是空表单提供的字段，但表单处理实体必须忽略任何无法识别的字段。&lt;br /&gt;
|-&lt;br /&gt;
|取消 || 表单提交实体取消给表单处理实体提交的数据。&lt;br /&gt;
|-&lt;br /&gt;
|结果 || 单处理实体返回数据（如查询结果）给表单提交实体，或数据是一个通用的数据集。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了维护表单类型中获取的数据的上下文，必须遵守以下规则:&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;iq/&amp;gt;节，受&amp;quot;wrapper&amp;quot; 命名空间限制的根元素，以&amp;quot;form&amp;quot; 或&amp;quot;submit&amp;quot;的一种形式，必须以一种&amp;quot;result&amp;quot;形式的表单返回。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;quot;wrapper&amp;quot;命名空间根元素的子元素。根据[http://tools.ietf.org/html/rfc3920 XMPP Core] [[XEP-0004#附录G:备注|8]]所定义， 'id' 属性必须在IQ结果中被复制。对于表单类型为&amp;quot;form&amp;quot; 或 &amp;quot;result&amp;quot;,&amp;lt;iq/&amp;gt;节应该是&amp;quot;result&amp;quot;类型。对于表单类型为&amp;quot;submit&amp;quot; 或&amp;quot;cancel&amp;quot;，  &amp;lt;iq/&amp;gt;节应该是&amp;quot;set&amp;quot;类型。&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;message/&amp;gt;节，如果提供的话，&amp;lt;thread/&amp;gt;应该在回复中被复制。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;lt;message/&amp;gt;节的子元素。&lt;br /&gt;
&lt;br /&gt;
===字段元素===&lt;br /&gt;
&lt;br /&gt;
一个&amp;quot;form&amp;quot;，&amp;quot;submit&amp;quot;，或 &amp;quot;result&amp;quot;类型的数据表单应该包含至少一个&amp;lt;field/&amp;gt;元素。一个&amp;quot;cancel&amp;quot;类型的表单，不应该包含任何&amp;lt;field/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field/&amp;gt;元素可以包含以下任何子元素:&lt;br /&gt;
&lt;br /&gt;
:'''&amp;lt;desc/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据提供了该字段一个自然语言的描述，为了在用户代理中介绍（如，作为一个&amp;quot;tool-tip&amp;quot;，帮助按钮，或在字段附近的文本标记）。&amp;lt;desc/&amp;gt;元素不应包含换行符（\n和\r字符），因为布局负责用户代理，任何换行的处理（如，在用户界面演示）在这里是未指明的。（注意：提供一个字段的描述，使用&amp;lt;desc/&amp;gt;元素是被推荐的，而不是一个单独的&amp;quot;fixed&amp;quot;类型的&amp;lt;field/&amp;gt;元素。）&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;required/&amp;gt;'''&lt;br /&gt;
:该元素必须为空，标记所需的字段，为了被表单识别为有效字段。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;value/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据定义了在&amp;quot;form&amp;quot;类型数据表单中的字段（根据表单处理实体）的默认值，在&amp;quot;submit&amp;quot;类型数据表单中由表单提交实体提供的数据，或在&amp;quot;result&amp;quot;类型数据表单中的数据结果。在&amp;quot;form&amp;quot;类型数据表单中，如果表单处理实体通过&amp;lt;value/&amp;gt;元素提供了一个默认值，表单提交实体就不应该尝试去执行一个不同的默认值。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;option/&amp;gt;'''&lt;br /&gt;
:在&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;字段类型中的一个选项。&amp;lt;value/&amp;gt;子元素的XML字符定义了选项的值，而且标签属性为选项定义了一个人们易读的名称。&amp;lt;option/&amp;gt;元素必须且只能包含一个&amp;lt;value/&amp;gt;子元素。如果字段类型不是&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;，就一定不能包含&amp;lt;option/&amp;gt;元素。&lt;br /&gt;
 &lt;br /&gt;
如果&amp;lt;field/&amp;gt;元素类型是其他的而不是“fixed”（见下文），它必须拥有一个'var'属性在表单中唯一标识字段（如果是“fixed”，可以拥有一个'var'属性）。&amp;lt;field/&amp;gt;元素可以拥有一个标签属性，为字段定义一个人们易读的名称。对于“form”类型的数据表单，每个&amp;lt;field/&amp;gt;元素应该拥有'type'属性，它定义了字段数据的数据 &amp;quot;type&amp;quot;（如果没有'type'被指定，则默认为&amp;quot;text-single&amp;quot;）。在其他表单类型的上下文中提供的字段，也可以拥有一个'type'属性。对于&amp;quot;submit&amp;quot;类型的数据表单，'type'中包含的属性是可选的，因为表单处理实体被假定知道它处理的表单的数据类型。&lt;br /&gt;
&lt;br /&gt;
如果字段出现在用户页面上（如，问卷中的项或表单结果），在XML中的字段元素的顺序，应该决定出现在用户处的项目的顺序。&lt;br /&gt;
&lt;br /&gt;
===字段类型===&lt;br /&gt;
以下字段类型代表Jabber/XMPP实体之间通用的数据类型。这些字段并打算像数据类型一样被广泛定义，如[http://www.w3.org/TR/xmlschema-2/ XML Schema Part 2] [[XEP-0004#附录G:备注|9]], 也没有定义用户界面元素。&lt;br /&gt;
&lt;br /&gt;
:'''表2:字段类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|布尔型 || 该字段允许一个实体收集或提供一个在两个选项中只能二选一的选择。默认值为&amp;quot;false&amp;quot;。[[XEP-0004#附录G:备注|10]]&lt;br /&gt;
|-&lt;br /&gt;
|固定 || 该字段是用于数据的描述（如，人们易读的&amp;quot;section&amp;quot;头信息）而不是数据的收集或提供。&amp;lt;value/&amp;gt;子元素不应该包含换行符（\n和\r字符）；然而一个应用应该生成多个固定的字段，每个都包含&amp;lt;value/&amp;gt;子元素。&lt;br /&gt;
|-&lt;br /&gt;
|隐藏 || 该字段未展现给表单提交实体，但是和表单一起返回。表单提交实体不能修改隐藏字段的值，但如果这种行为被定义为是“使用协议”时可以这样做。&lt;br /&gt;
|-&lt;br /&gt;
|多jid || 该字段允许一个实体收集或提供多个Jabber ID。每个提供的JID应该是唯一的（比较确定的，包括Nodeprep的应用、Nameprep和Resourceprep profiles of Stringprep，按XMPP Core中说明的），而重复的JID一定会被忽略。*&lt;br /&gt;
|-&lt;br /&gt;
|单jid || 该字段允许一个实体收集或提供单个的Jabber ID。&lt;br /&gt;
|-&lt;br /&gt;
|多选项列表 || 该字段允许一个实体从很多选项中收集或提供一个或多个选项。表单提交实体从表单处理实体提交的选项中选择一个或多个项，而且不能插入新的选项。表单处理实体不能修改从表单处理实体处获取的项目的顺序，因为项目的顺序可能很重要。**&lt;br /&gt;
|-&lt;br /&gt;
|单选项列表|| 该字段允许一个实体从很多选项中收集或提供一个选项。表单提交实体从表单处理实体提交的选项中选择一个项，而且不能插入新的选项。**&lt;br /&gt;
|-&lt;br /&gt;
|多文本|| 该字段允许一个实体收集或提供多行的文本。***&lt;br /&gt;
|-&lt;br /&gt;
|私有文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上遮蔽。（如，星号显示的多个实体）&lt;br /&gt;
|-&lt;br /&gt;
|单文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上显示。这个字段类型是缺省的而且必须假定，当一个表单提交实体收到一个不知道的字段类型时。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;jid-single&amp;quot;或&amp;quot;jid-multi&amp;quot;提供的数据必须包含一个或一个以上的有效Jabber ID，有效性是由XMPP Core（参看后面章节的Data Validation）定义的寻址规则决定的。&lt;br /&gt;
&lt;br /&gt;
注意：在list-multi和list-single中的&amp;lt;option/&amp;gt;元素必须是唯一的，唯一性是由‘label’属性的值和&amp;lt;value/&amp;gt;元素中的XML字符数据决定的。（即，2个都必须是唯一的）&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;text-multi&amp;quot;提供的数据不应该包含任何换行符（\n和\r字符）。而应用程序应该把数据分为多个字符串（基于平台插入的换行符），然后用不同的&amp;lt;value/&amp;gt;元素中的XML字符数据指定每一个字符串。同样的，以&amp;quot;text-multi&amp;quot;字段类型接收了多个&amp;lt;value/&amp;gt;元素的应用程序，应该把value元素中的XML字符数据合并成一个文本块以提交给用户。每一个字符串为平台适时的通过换行符分开。&lt;br /&gt;
&lt;br /&gt;
===表单结果中的多个项目===&lt;br /&gt;
在某些情况下（如，查询请求的结果），传达多个项目是必须的。因此，一个&amp;quot;result&amp;quot;类型的数据表单可能包含2个上面基本语法没有描述的子元素:&lt;br /&gt;
&lt;br /&gt;
#只有一个&amp;lt;reported/&amp;gt;元素，可以理解为一个“表头”描述数据去遵循。 &lt;br /&gt;
#零个或更多&amp;lt;item/&amp;gt;元素，可以理解为包含符合请求的数据（如果有的话）的&amp;quot;table cells&amp;quot;。 &lt;br /&gt;
&lt;br /&gt;
其语法如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='result'&amp;gt; &lt;br /&gt;
  &amp;lt;reported&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name' label='description' type='{field-type}'/&amp;gt; &lt;br /&gt;
  &amp;lt;/reported&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些元素每个都必须包含一个或多个&amp;lt;field/&amp;gt;子元素。&amp;lt;reported/&amp;gt;元素为结果项定义数据格式，通过为每个项目指定所期望的字段。为此，除了'var'属性，&amp;lt;field/&amp;gt;元素还应该有'type'属性'label'属性；而且不能包含&amp;lt;value/&amp;gt;元素。在结果集中，每个&amp;lt;item/&amp;gt;元素定义一个项目，而且必须包含在&amp;lt;reported/&amp;gt;元素（虽然&amp;lt;value/&amp;gt;元素中的XML字符数据可能为空）中指定的字段。&lt;br /&gt;
&lt;br /&gt;
==数据有效性==&lt;br /&gt;
&lt;br /&gt;
数据有效性是表单处理实体（通常是一个服务器，服务，或bot）的责任，而不是表单提交实体（通常是一个由用户控制的客户端）。这有助于满足保持客户端实现简单的要求。如果表单处理实体确定提供的数据是无效的，它应该返回一个“不接受”的错误。选择在XMPP &amp;lt;text/&amp;gt;元素中提供文字说明，或识别问题的特殊应用子元素（参考[http://xmpp.org/extensions/xep-0086.html Error Condition Mappings] [[XEP-0004#附录G:备注|11]]中的映射和格式）。&lt;br /&gt;
&lt;br /&gt;
==例子==&lt;br /&gt;
&lt;br /&gt;
对于下面的例子，我们假设存在一个bot hosting服务在Jabber network上，位于&amp;lt;botster.shakespeare.lit&amp;gt;。这个服务允许注册用户创建和配置新的bots，对已经存在的bots查找和交互，等等。我们假定这些交互的发生使用的Ad-Hoc Commands [12]协议，协议被用作表单的&amp;quot;wrapper&amp;quot;协议，受'jabber:x:data'命名空间限制。下面章节中的例子，体现了前文中描述的数据表单协议的大部分特性。&lt;br /&gt;
&lt;br /&gt;
注意：额外的例子可以通过各种“使用协议”的说明书中找到。如XEP-0045:Multi-User Chat和XEP-0055:Jabber Search。&lt;br /&gt;
&lt;br /&gt;
===配置===&lt;br /&gt;
&lt;br /&gt;
:第一步是为用户在主机上创建一个新的bot。我们假设这是通过发送一个“创建”命令给期望的bot来实现的:&lt;br /&gt;
&lt;br /&gt;
:'''例1.用户请求Bot创建'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='create' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后主服务返回一个数据表单个用户:&lt;br /&gt;
&lt;br /&gt;
:'''例2.服务返回一个Bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Bot Configuration&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to configure your new bot!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' &lt;br /&gt;
             var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 1: Bot Info&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             label='The name of your bot' &lt;br /&gt;
             var='botname'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' &lt;br /&gt;
             label='Helpful description of your bot' &lt;br /&gt;
             var='description'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' &lt;br /&gt;
             label='Public bot?' &lt;br /&gt;
             var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' &lt;br /&gt;
             label='Password for special access' &lt;br /&gt;
             var='password'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 2: Features&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' &lt;br /&gt;
             label='What features will the bot support?' &lt;br /&gt;
             var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Contests'&amp;gt;&amp;lt;value&amp;gt;contests&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='News'&amp;gt;&amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Polls'&amp;gt;&amp;lt;value&amp;gt;polls&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Reminders'&amp;gt;&amp;lt;value&amp;gt;reminders&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Search'&amp;gt;&amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 3: Subscriber List&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' &lt;br /&gt;
             label='Maximum number of subscribers' &lt;br /&gt;
             var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 4: Invitations&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' &lt;br /&gt;
             label='People to invite' &lt;br /&gt;
             var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;desc&amp;gt;Tell all your friends about your new bot!&amp;lt;/desc&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后用户提交配置表单:&lt;br /&gt;
&lt;br /&gt;
:'''例3.用户提交bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='set' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' var='description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;This bot enables you to send requests to&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Google and receive the search results right&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;in your Jabber client. It&amp;amp;apos; really cool!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;It even supports Google News!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后服务返回结果给用户:&lt;br /&gt;
&lt;br /&gt;
:'''例4.服务返回bot创建的结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===搜索===&lt;br /&gt;
&lt;br /&gt;
既然用户已经创建了这个搜索bot,我们假设他所邀请的好友中的一个，决定通过发送一个搜索请求来试一试:&lt;br /&gt;
&lt;br /&gt;
:'''例5.用户请求搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例6.服务返回搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to search for information!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例7.用户提交搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;verona&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例8.服务返回搜索结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search: verona&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;reported&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'/&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'/&amp;gt; &lt;br /&gt;
      &amp;lt;/reported&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Comune di Verona - Benvenuti nel sito ufficiale&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.comune.verona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;benvenuto!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.hellasverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Universita degli Studi di Verona - Home Page&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.univr.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Aeroporti del Garda&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.aeroportoverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Veronafiere - fiera di Verona&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.veronafiere.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==服务发现==&lt;br /&gt;
&lt;br /&gt;
如果一个实体支持包含受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素作为&amp;lt;message/&amp;gt;节直接子元素，它必须报告支持包含一个&amp;quot;jabber:x:data&amp;quot;（参看Protocol Namespaces中关于一个或多个永久命名空间的发行）的服务搜索特征，去响应服务搜索信息请求:&lt;br /&gt;
&lt;br /&gt;
:'''例9.服务搜索信息请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='romeo@montague.net/orchard' &lt;br /&gt;
    to='juliet@capulet.com/balcony' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例10.服务搜索信息响应'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='juliet@capulet.com/balcony' &lt;br /&gt;
    to='romeo@montague.net/orchard' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
    &amp;lt;feature var='jabber:x:data'/&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果实体支持数据表单，间接的通过在wrapper命名空间中包含数据表单，它不能为'jabber:x:data'命名空间通知支持，因为在wrapper协助中的支持是隐性的。&lt;br /&gt;
&lt;br /&gt;
==安全性考虑==&lt;br /&gt;
&lt;br /&gt;
没有安全问题与上述的规范和XMPP Core中相关章节的描述有关。&lt;br /&gt;
&lt;br /&gt;
==IANA考虑==&lt;br /&gt;
&lt;br /&gt;
这份文档与[http://www.iana.org/ Internet Assigned Numbers Authority (IANA)] [[XEP-0004#附录G:备注|13]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册考虑==&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP Registrar] [[XEP-0004#附录G:备注|14]]在它注册的协议命名空间中包含'jabber:x:data'命名空间。&lt;br /&gt;
&lt;br /&gt;
===参数值===&lt;br /&gt;
&lt;br /&gt;
XMPP注册员维持着一个与'jabber:x:data'命名空间相关的注册参数值。具体定义在[http://xmpp.org/extensions/xep-0068.html Field Standardization for Data Forms] [[XEP-0004#附录G:备注|15]]。注册的地方是&amp;lt;http://xmpp.org/registrar/formtypes.html&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==XML 架构==&lt;br /&gt;
&lt;br /&gt;
该架构是描述性的，不是规范的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;xs:schema &lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema' &lt;br /&gt;
    targetNamespace='jabber:x:data' &lt;br /&gt;
    xmlns='jabber:x:data' &lt;br /&gt;
    elementFormDefault='qualified'&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
      The protocol documented by this schema is defined in &lt;br /&gt;
      XEP-0004: http://www.xmpp.org/extensions/xep-0004.html &lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='instructions'  &lt;br /&gt;
                    minOccurs='0'  &lt;br /&gt;
                    maxOccurs='unbounded'  &lt;br /&gt;
                    type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='title' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='reported' minOccurs='0' maxOccurs='1'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='cancel'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='form'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='result'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='submit'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='field'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='desc' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='required' minOccurs='0' type='empty'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='option' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='optional'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='boolean'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='fixed'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='hidden'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-private'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-single'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='var' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='option'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='value' type='xs:string'/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='reported'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
      &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
        When contained in a &amp;quot;reported&amp;quot; element, the &amp;quot;field&amp;quot; element &lt;br /&gt;
        SHOULD NOT contain a &amp;quot;value&amp;quot; child. &lt;br /&gt;
      &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt; &lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/xs:schema&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==最终状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范已经是最终状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* 指定的'var'属性是所有字段类型所必须的，除了&amp;quot;fixed&amp;quot;, 因为'var'属性是可选的。&lt;br /&gt;
&lt;br /&gt;
* 通过服务搜索指定何时去通知支持。&lt;br /&gt;
  &lt;br /&gt;
* 移除引用&amp;lt;presence/&amp;gt;节。&lt;br /&gt;
&lt;br /&gt;
==草稿状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范在草稿状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能直接包含在&amp;lt;message/&amp;gt;和&amp;lt;presence/&amp;gt;节中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能包含一个&amp;lt;title/&amp;gt;子元素，在表单或结果中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素必须拥有一个‘类型’属性。&lt;br /&gt;
* &amp;lt;field/&amp;gt;元素可能是类型='jid-single'。&lt;br /&gt;
* 结果可能以&amp;lt;item/&amp;gt;标签的方式返回报告。&lt;br /&gt;
* 结果可能包含一个&amp;lt;reported/&amp;gt;元素的结果集。&lt;br /&gt;
* &amp;lt;reported/&amp;gt;字段可能拥有一个‘类型’属性，提供如何与数据交互的提示（类型='jid-single'是最有用的）。&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0004&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：2.9&lt;br /&gt;
&lt;br /&gt;
最后更新：2007-07-13&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[RFC3920|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：x-data&lt;br /&gt;
&lt;br /&gt;
XML架构:&amp;lt;http://www.xmpp.org/schemas/x-data.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0004.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0004.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0004.xml XML] [http://xmpp.org/extensions/xep-0004.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Ryan Eatmon'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:reatmon@jabber.org reatmon@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: reatmon@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Joe Hildebrand'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jhildebr@cisco.com jhildebr@cisco.com]&lt;br /&gt;
&lt;br /&gt;
JabberID: hildjj@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Jeremie Miller'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jer@jabber.org jer@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: jer@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Thomas Muldowney'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:temas@jabber.org temas@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: temas@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
#XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
#XEP-0055: Jabber Search &amp;lt;http://xmpp.org/extensions/xep-0055.html&amp;gt;.&lt;br /&gt;
#XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
#XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
#XForms 1.0 &amp;lt;http://www.w3.org/TR/xforms&amp;gt;.&lt;br /&gt;
#XHTML 1.0 &amp;lt;http://www.w3.org/TR/xhtml1&amp;gt;.&lt;br /&gt;
#Modularization of XHTML &amp;lt;http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/&amp;gt;.&lt;br /&gt;
#RFC 3920: Extensible Messaging and Presence Protocol (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
#XML Schema Part 2: Datatypes &amp;lt;http://www.w3.org/TR/xmlschema-2/&amp;gt;.&lt;br /&gt;
#In accordance with Section 3.2.2.1 of XML Schema Part 2: Datatypes, the allowable lexical representations for the xs:boolean datatype are the strings &amp;quot;0&amp;quot; and &amp;quot;false&amp;quot; for the concept 'false' and the strings &amp;quot;1&amp;quot; and &amp;quot;true&amp;quot; for the concept 'true'; implementations MUST support both styles of lexical representation.&lt;br /&gt;
#XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
#XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
#The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
#The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
#XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: &lt;br /&gt;
&lt;br /&gt;
'''版本 2.9 (2007-08-13)'''&lt;br /&gt;
&lt;br /&gt;
Clarified the definition and handling of the list-multi and list-single field types; specified that hidden field values should not be modified unless such behavior is defined for the using protocol; specified that a submission should include all fields provided in the empty form and may include additional fields, but that additional fields must be ignored if not understood by the form-processing entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.8 (2007-05-21)'''&lt;br /&gt;
&lt;br /&gt;
Removed mentions of presence stanzas; added section on discovering support; added section on substantive changes in Final state.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.7 (2006-01-25)'''&lt;br /&gt;
&lt;br /&gt;
Incorporated errata: (1) clarified rules regarding inclusion of option and value elements depending on field type; (2) clarified handling of default values; (3) added value elements to list-multi field in Example 2; (4) harmonized spelling of form-processing entity and form-submitting entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 2.6 (2004-10-13)&lt;br /&gt;
Incorporated errata: (1) corrected syntax of &amp;lt;reported/&amp;gt; element (&amp;lt;field/&amp;gt; element should not contain a &amp;lt;value/&amp;gt; child); (2) corrected Example 8.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.5 (2004-05-07)&lt;br /&gt;
Clarified terminology regarding form-processing entities and form-submitting entities; corrected several small errors in the schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.4 (2004-05-04)&lt;br /&gt;
Per discussion by the authors and Jabber Council, specified that the 'var' attribute is required for all field types except &amp;quot;fixed&amp;quot;, for which the 'var' attribute is optional.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.3 (2004-03-31)&lt;br /&gt;
Formalization and further editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.2 (2004-01-22)&lt;br /&gt;
Editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.1 (2003-02-16)&lt;br /&gt;
Added schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.0 (2002-12-09)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Final.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 1.1 (2002-10-15)&lt;br /&gt;
Call for Experience changes (see Changes in Draft State section). This version voted to Final on 2002-12-09.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 1.0 (2002-04-24)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Draft.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 0.6 (2002-03-15)&lt;br /&gt;
Protocol tweaks based on Standards list discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.5 (2002-02-06)&lt;br /&gt;
Protocol tweaks based on implementation and discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.4 (2001-11-16)&lt;br /&gt;
Major redesign to attempt to clarify the scope of this document and limit what it is trying to solve.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.3 (2001-07-23)&lt;br /&gt;
Protocol update&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.2 (2001-06-29)&lt;br /&gt;
Protocol update and DocBook version&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.1 (2001-01-25)&lt;br /&gt;
Initial release&lt;br /&gt;
&lt;br /&gt;
(rwe)&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0128</id>
		<title>XEP-0128</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0128"/>
				<updated>2010-10-11T08:07:08Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 建议 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0128.html XEP-0128]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0128: 发现服务扩展'''&lt;br /&gt;
&lt;br /&gt;
摘要: 这个文件规定了发现服务的扩展信息的最佳做法。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Saint-Andre &lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0030#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
现状: 活跃 &lt;br /&gt;
&lt;br /&gt;
类型: 信息 &lt;br /&gt;
&lt;br /&gt;
版本: 1.0 &lt;br /&gt;
&lt;br /&gt;
最后更新: 2004-10-20 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：注意：此信息规范定义了一个最佳实践或协议配置文件已被批准的XMPP理事会和/或董事XSF局。实现是鼓励和最佳做法或协议配置文件是在生产系统中部署适当的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
开发人员觉得[http://xmpp.org/extensions/xep-0030.html 发现服务]不能包含更多的信息. 例如, &amp;lt;identity/&amp;gt; 元素不包含'description'属性, 我们可以增加这个属性吗? 答案是可以,但现在不行,太迟了(因为XEP-0030是最终版). 因此,最好的办法是制定一个扩充机制.&lt;br /&gt;
&lt;br /&gt;
让我们参考一个示例. 一个[http://xmpp.org/extensions/xep-0045.html 多用户聊天室][http://xmpp.org/extensions/xep-0128.html#nt-id92624[2]] 可能想要获取更多的信息, 包括房间描述信息,房间主题,房间在线人数和房间所有者的JID.&lt;br /&gt;
&lt;br /&gt;
增加一个新属性的服务发现架构(即使真的是一个选项)不能解决的问题,因为一MUC的服务可能需要提供某些信息，而发布，[http://xmpp.org/extensions/xep-0060.html 订阅] [http://xmpp.org/extensions/xep-0128.html#nt-id92653[3]]服务可能需要提供其信息。 &lt;br /&gt;
&lt;br /&gt;
一个更好的解决办法是通过一个扩展的信息包括命名空间，提供了一种灵活的结构化数据格式定义合格。 谢天谢地，我们已经拥有了这样一个协议： [http://xmpp.org/extensions/xep-0004.html 数据表格] [http://xmpp.org/extensions/xep-0128.html#nt-id92681[4]]。 此外，我们拥有一个共同的方式来定义字段形式用于数据： [http://xmpp.org/extensions/xep-0068.html 数据表格现场标准化] [http://xmpp.org/extensions/xep-0128.html#nt-id92702 [5]]。 使用这些构建模块，我们可以定义为扩展服务发现结果的一些最佳做法。&lt;br /&gt;
&lt;br /&gt;
==建议==&lt;br /&gt;
如果一个实体的希望提供服务发现协议的扩展信息,出现在回复信息内,它应该这样做:每个独立的&amp;lt;field/&amp;gt;元素包含&amp;lt;value/&amp;gt;点数据信息子节点,所有&amp;lt;field/&amp;gt;元素包含在一个类型为&amp;quot;result&amp;quot;命名空间值为'jabber:x:data'的&amp;lt;x/&amp;gt;元素里.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type=&amp;quot;result&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns=&amp;quot;http://jabber.org/protocol/disco#info&amp;quot;&amp;gt;  &lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;x type='result' xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='[var-name]' label='[optional]'&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;[var-value]&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果数据字段被用来在由XMPP标准基金会核准的议定书时，他们应该符合相关的XMPP扩展协议规范并按照XEP - 0068定义的规则注册，返回信息中包含一个&amp;lt;field/&amp;gt;元素,其'var'属性为&amp;quot;FORM_TYPE&amp;quot;，其'type'属性的值为&amp;quot;hidden&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
一个实体不能提供'http://jabber.org/protocol/disco#items' 命名空间相关子信息,因为服务发现的核心原则是：一个实体必须确定其身份,不界定的身份与子节点的实体.&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==示例==&lt;br /&gt;
===IM服务器===&lt;br /&gt;
&lt;br /&gt;
以下是即时消息服务器返回一个标准的服务查询的例子.&lt;br /&gt;
&lt;br /&gt;
'''例1. 实体查询信息服务器'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='capulet.com' &lt;br /&gt;
    to='shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='shakespeare.lit' &lt;br /&gt;
    to='capulet.com' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='server' &lt;br /&gt;
        type='im' &lt;br /&gt;
        name='shakespeare.lit jabber server'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/network/serverinfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5222&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port_ssl'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5223&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='http_access'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/jabber&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='ip_version'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv4&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv6&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='info_url'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/support.php&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===群===&lt;br /&gt;
&lt;br /&gt;
下面是在多用户房间里查询服务的例子.&lt;br /&gt;
&lt;br /&gt;
'''例2. 用户查询房间信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='hag66@shakespeare.lit/pda' &lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    to='hag66@shakespeare.lit/pda' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='conference' &lt;br /&gt;
        type='text' &lt;br /&gt;
        name='A Dark Cave'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实现说明==&lt;br /&gt;
&lt;br /&gt;
一般来说，XMPP标准基金会给每一个发现服务在注册登记时指定一个FORM_TYPE.此外，特定的应用可以定义应用程序以及具体FORM_TYPEs，一个实体可以有多个服务发现的身份（例如，一个XMPP服务器也可能作为一个发布，订阅服务）。因此，它是可能的（允许一个单一的服务发现的结果，发现含有多种服务扩展元素（可能高达2为每个标识元素））。然而，在实践中是不可能发现任何特定服务的结果将包含多个服务扩展元素的发现。&lt;br /&gt;
&lt;br /&gt;
==安全注意事项==&lt;br /&gt;
&lt;br /&gt;
应用程序应确网络上任何实体都能发现服务扩展信息.&lt;br /&gt;
&lt;br /&gt;
==IANA注意事项==&lt;br /&gt;
&lt;br /&gt;
这份文件并不需要与互联网分配编码机构(IANA) [6]互动.&lt;br /&gt;
&lt;br /&gt;
==XMPP协议注册事项==&lt;br /&gt;
&lt;br /&gt;
本文件并不需要的相互作用的XMPP注册 [ 7 ]，但是，最佳做法是在XMPP的登记FORM_TYPEs和field值.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0128&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2004-10-20&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[XEP-0004|XEP-0030|XEP-0068|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
取代: 无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：N/A&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0128.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0128.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0030.xml XML] [http://xmpp.org/extensions/xep-0128.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
1. XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
7. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用 &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2004-10-20)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Active; also added implementation notes. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-03-15)&lt;br /&gt;
&lt;br /&gt;
Clarified syntax and corrected several errors; added IM server example. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-03-05)&lt;br /&gt;
&lt;br /&gt;
Initial version. (psa) &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
结束&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0213</id>
		<title>XEP-0213</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0213"/>
				<updated>2010-10-11T08:07:07Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 绪论 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已废弃]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0213.html XEP-0213]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0213: XMPP中级客户端2008'''&lt;br /&gt;
&lt;br /&gt;
本文定义了XMPP中级客户端2008兼容级别.&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个草案标准.对本协议的执行是被鼓励的,也适于部署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
'''文档信息'''&lt;br /&gt;
&lt;br /&gt;
系列: [[XMPP扩展|XEP]]&lt;br /&gt;
&lt;br /&gt;
编号: 0213&lt;br /&gt;
&lt;br /&gt;
发行者: [[XMPP标准基金会]]&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.0&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2007-07-11&lt;br /&gt;
&lt;br /&gt;
批准机构: [[XMPP理事会]]&lt;br /&gt;
&lt;br /&gt;
依赖于: [[XEP-0211]], XEP-0016, [[XEP-0045]], XEP-0054, XEP-0085, XEP-0155&lt;br /&gt;
&lt;br /&gt;
上文: 无&lt;br /&gt;
&lt;br /&gt;
下文: 无&lt;br /&gt;
&lt;br /&gt;
简称: 无&lt;br /&gt;
&lt;br /&gt;
Wiki页: &amp;lt;http://wiki.jabber.org/index.php/XMPP Intermediate IM Client 2008 (XEP-0213)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''作者信息'''&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JabberID: [xmpp:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
'''法律通告'''&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2007)归XMPP标准化基金会(XSF)所有,并完全遵守XSF的知识产权策略&amp;lt;http://www.xmpp.org/extensions/ipr-policy.shtml&amp;gt;. 本文可以任意分发,仅受限于创作公用协议的第四条.(&amp;lt;http://creativecommons.org/licenses/by/2.5/&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''讨论地点'''&lt;br /&gt;
&lt;br /&gt;
首选的讨论的地方是标准讨论邮件列表: &amp;lt;http://mail.jabber.org/mailman/listinfo/standards&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''XMPP 相关信息'''&lt;br /&gt;
&lt;br /&gt;
XMPP 是由XSF(XMPP标准化基金会)按互联网标准程序贡献的,和 IETF的RFC 2026兼容的规范,包括 XMPP核心(RFC 3920)和 XMPP IM(RFC 3921).在本文中定义的任何协议,都是在互联网标准程序之外开发的,是扩展XMPP,而不是改变、发展和修改 XMPP本身.&lt;br /&gt;
&lt;br /&gt;
'''一致性术语'''&lt;br /&gt;
&lt;br /&gt;
本文中以下关键词的含义如 RFC 2119 所述: &amp;quot;MUST&amp;quot;, &amp;quot;SHALL&amp;quot;, &amp;quot;REQUIRED&amp;quot;; &amp;quot;MUST NOT&amp;quot;, &amp;quot;SHALL NOT&amp;quot;; &amp;quot;SHOULD&amp;quot;, &amp;quot;RECOMMENDED&amp;quot;; &amp;quot;SHOULD NOT&amp;quot;, &amp;quot;NOT RECOMMENDED&amp;quot;; &amp;quot;MAY&amp;quot;, &amp;quot;OPTIONAL&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
XMPP标准化基金会(XSF) [1|XMPP文档列表/XMPP扩展/XEP-0213#1] 定义了协议簇用于兼容性测试和软件认证. 本文定义了XMPP中级客户端认证级别.&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==定义==&lt;br /&gt;
&lt;br /&gt;
XMPP中级客户端2008认证级别定义如下:&lt;br /&gt;
&lt;br /&gt;
表1: 必需和建议的协议&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
!协议 !!必需级别&lt;br /&gt;
|-&lt;br /&gt;
|[[XEP-0211] [2] |	|必需&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xmpp.org/extensions/xep-0016.html Server-Based Privacy Rules] [3] ||推荐&lt;br /&gt;
|-&lt;br /&gt;
|[[XEP-0045]] [4], 实体用例和驻留者用例 ||必需&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xmpp.org/extensions/xep-0054.html vcard-temp] [5] ||推荐&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xmpp.org/extensions/xep-0085.html Chat State Notifications] [6] ||必需&lt;br /&gt;
|-&lt;br /&gt;
|[http://www.xmpp.org/extensions/xep-0155.html Stanza Session Negotiation] [7] ||推荐&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实施备注==&lt;br /&gt;
&lt;br /&gt;
在这里一些被引用的协议本身依赖于(别的协议); 开发者必须查阅相应的协议以得到更多的信息.&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
&lt;br /&gt;
本文没有引入超越本协议所以来的那些协议所规定的的额外的安全事项.&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文不需要和Internet Assigned Numbers Authority (IANA) [8|XMPP文档列表/XMPP扩展/XEP-0213#8] 的交互.&lt;br /&gt;
&lt;br /&gt;
==XMPP注册项事项==&lt;br /&gt;
&lt;br /&gt;
本文不需要和 XMPP Registrar [9|XMPP文档列表/XMPP扩展/XEP-0213#9] 交互.&lt;br /&gt;
&lt;br /&gt;
==备注==&lt;br /&gt;
&lt;br /&gt;
# XMPP标准化基金会(XSF)是一个独立的非营利的会员组织, 其宗旨是发展XMPP的开放扩展. 更多信息参见 &amp;lt;http://www.xmpp.org/xsf/&amp;gt;.&lt;br /&gt;
# XEP-0211: XMPP Basic Client 2008 &amp;lt;http://www.xmpp.org/extensions/xep-0211.html&amp;gt;.&lt;br /&gt;
# XEP-0016: Server-Based Privacy Rules &amp;lt;http://www.xmpp.org/extensions/xep-0016.html&amp;gt;.&lt;br /&gt;
# XEP-0045: Multi-User Chat &amp;lt;http://www.xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
# XEP-0054: vcard-temp &amp;lt;http://www.xmpp.org/extensions/xep-0054.html&amp;gt;.&lt;br /&gt;
# XEP-0085: Chat State Notifications &amp;lt;http://www.xmpp.org/extensions/xep-0085.html&amp;gt;.&lt;br /&gt;
# XEP-0155: Stanza Session Negotiation &amp;lt;http://www.xmpp.org/extensions/xep-0155.html&amp;gt;.&lt;br /&gt;
# 互联网分配号码授权(IANA) 是一个中枢协调者, 为互联网协议分配唯一的参数值, 例如端口号和URI 方案. 更多信息参见&amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记维护了保留的协议名字空间的列表, 以及XMPP标准化基金会批准的用于XMPP扩展协议中的已登记参数. 更多信息参见&amp;lt;http://www.xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==修订历史==&lt;br /&gt;
&lt;br /&gt;
'''Version 1.0 (2007-07-11)'''&lt;br /&gt;
&lt;br /&gt;
经过 XMPP理事会投票, 升级为草案.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.5 (2007-07-11)'''&lt;br /&gt;
&lt;br /&gt;
增加了 XEP-0155 作为推荐.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.4 (2007-06-11)'''&lt;br /&gt;
&lt;br /&gt;
增加了实施备注.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.3 (2007-05-30)'''&lt;br /&gt;
&lt;br /&gt;
经过列表讨论, 移除了 XHTML-IM.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.2 (2007-05-11)'''&lt;br /&gt;
&lt;br /&gt;
经过列表讨论, 修改了 MUC 支持, 增加了 privacy lists, 并增加了 vCard 支持.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.1 (2007-04-20)'''&lt;br /&gt;
&lt;br /&gt;
初始发行版本.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''Version 0.0.1 (2007-03-30)'''&lt;br /&gt;
&lt;br /&gt;
第一个草案, 从 XEP-0117 分离出来. (psa)&lt;br /&gt;
&lt;br /&gt;
结束&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0138</id>
		<title>XEP-0138</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0138"/>
				<updated>2010-10-11T08:07:06Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 用例 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0138.html XEP-0138]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0138: 流压缩'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展,用于协商XML流的压缩,特别在标准TLS压缩无法协商的情况下. 该协议提供了一个模块化框架,可以容纳广泛的压缩算法; ZLIB 压缩算法是强制性的实现，但实现也可以可能支持额外的其他算法.&lt;br /&gt;
&lt;br /&gt;
作者: Joe Hildebrand, Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0138#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 最终版&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 2.0&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2009-05-27&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''最终版''',可被认为是一个稳定的技术,供实现和布署.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
[[RFC3920|XMPP Core]] [[XEP-0138#附录G:备注|1]]指明了使用TLS(参考[http://tools.ietf.org/html/rfc4346 RFC 4346] [[XEP-0138#附录G:备注|2]] )加密XML流，TLS包括了压缩加密流量的能力(参考[http://tools.ietf.org/html/rfc3749 RFC 3749] [[XEP-0138#附录G:备注|3]] )。然而，不是所有计算机平台都实现了TLS，而流压缩可以使基于这些平台的应用实现互通。本文档定义了在TLS之外的协议XML流的压缩算法。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==用例==&lt;br /&gt;
&lt;br /&gt;
协议流如下：&lt;br /&gt;
&lt;br /&gt;
'''例子1. 收到实体提供的流压缩特征'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:features&amp;gt;&lt;br /&gt;
  &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
  &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
    &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
    &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
  &amp;lt;/compression&amp;gt;&lt;br /&gt;
&amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：&amp;lt;compression/&amp;gt;元素必须(MUST)包含至少一个&amp;lt;method/&amp;gt;子元素。每个&amp;lt;method/&amp;gt;必须(MUST)包含指定了压缩方法的XML字符，方法名应该(SHOULD)是在本文档的 [[XEP-0138#压缩方法注册|压缩方法注册]] 中注册的。&lt;br /&gt;
&lt;br /&gt;
初始实体可能(MAY)在收到的压缩方法中请求一个压缩方法。&lt;br /&gt;
&lt;br /&gt;
'''例子2. 初始实体请求流压缩'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ccompress xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/compress&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：如果初始实体不理解声明的压缩方法，它应该(SHOULD)忽略压缩选项，就像没有发布压缩方法一样处理。&lt;br /&gt;
&lt;br /&gt;
如果接受实体不支持初始实体请求的压缩方法，那么接收者实体必须(MUST)返回一个&amp;lt;unsupported-method/&amp;gt;错误&lt;br /&gt;
&lt;br /&gt;
'''例子3. 接收实体报告该方法不支持。'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;failure xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;unsupported-method/&amp;gt;&lt;br /&gt;
&amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果接收实体发现请求的方法不能接受或者由于其他原因而不能使用，它必须(MUST)返回一个&amp;lt;setup-failed/&amp;gt;错误：&lt;br /&gt;
&lt;br /&gt;
'''例子4. 接收实体报告流压缩协商失败'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;failure xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;setup-failed/&amp;gt;&lt;br /&gt;
&amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：协商失败不应该(SHOULD NOT)被看作不可挽救的错误，因此不应该(SHOULD NOT)导致流错误。特别的，初始实体可以在失败后，重新协商。&lt;br /&gt;
&lt;br /&gt;
如果没有错误，接收实体必须(MUST)通知初始实体协商成功。&lt;br /&gt;
&lt;br /&gt;
'''例子5. 接收实体通知流压缩的协商结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;compressed xmlns='http://jabber.org/protocol/compress'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在2个实体必须(MUST)都忽略先前的流(未压缩的)，就像TLS协商和SASL协商(在RFC3920指定)一样，必须(MUST)用一个新的(压缩的)流开始通讯。因此初始实体必须(MUST)初始一个新的流给接收实体：&lt;br /&gt;
&lt;br /&gt;
'''例子6. 初始实体初始新的(压缩)流'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:stream&lt;br /&gt;
    xmlns='jabber:client'&lt;br /&gt;
    xmlns:stream='http://etherx.jabber.org/streams'&lt;br /&gt;
    to='shakespeare.lit'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在新的(压缩)流发送之后处理失败，发现出错的实体应该(SHOULD)生成出错流并关闭流。&lt;br /&gt;
&lt;br /&gt;
'''例子7. 因为流错误实体关闭流'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:error&amp;gt;&lt;br /&gt;
  &amp;lt;undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
  &amp;lt;failure xmlns='http://jabber.org/protocol/compress'/&amp;gt;&lt;br /&gt;
    &amp;lt;processing-failed/&amp;gt;&lt;br /&gt;
  &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/stream:error&amp;gt;&lt;br /&gt;
&amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==业务规则==&lt;br /&gt;
&lt;br /&gt;
应用以下规则：&lt;br /&gt;
&lt;br /&gt;
* 如果正在协商流压缩，它必须(MUST)是双向的。&lt;br /&gt;
&lt;br /&gt;
* TLS压缩和流压缩不应该(SHOULD NOT)同时使用。&lt;br /&gt;
&lt;br /&gt;
* 如果TLS压缩失败了，那么之后可以再进行流压缩协商。&lt;br /&gt;
&lt;br /&gt;
关于流特性协商的顺序的细节，参考 [[XEP-0138#压缩方法注册|推荐的流特性协商顺序]]&lt;br /&gt;
&lt;br /&gt;
==强制实现的技术==&lt;br /&gt;
&lt;br /&gt;
在[http://tools.ietf.org/html/rfc1950 RFC 1950] [[XEP-0138#附录G:备注|5]] 中对ZLIB压缩方法的支持必需的(REQUIRED).&lt;br /&gt;
&lt;br /&gt;
所有其他方法是可选的;这些方法可能将来会进入本文的 [[XEP-0138#压缩方法注册|压缩方法注册]]章节所述的注册项.&lt;br /&gt;
&lt;br /&gt;
==可选的技术==&lt;br /&gt;
&lt;br /&gt;
除了ZLIB之外，具体的实现也可以(MAY)支持以下方法：&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0229.html LZW流压缩] [[XEP-013#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
==实现注意==&lt;br /&gt;
&lt;br /&gt;
当使用ZLIB压缩的时候，在当前的发送完成之后，发送方的应用应该(SHOULD)完成ZLIB流部分刷新。注意这些语句有点含糊的：发送方的应用可能在发送每个XML节后刷新流并且发送数据，但是另一方面也可能在发送了等待发送队列里的所有节点后刷新流并且发送数据。何时刷新压缩应用的状态取决于发送方的应用。&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
&lt;br /&gt;
通过TLS(在[[RFC3920 RFC 3920]]中定义)加密的流和压缩流(在本文档定义的)并不是互相排斥的，但是通过TLS加密的流必须(MUST)在流压缩协商之前先协商，这是确保流的安全性。&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档和互联网端口号授权组织 (IANA) [[XEP-0138#附录G:备注|7]]没有交互。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册事项==&lt;br /&gt;
&lt;br /&gt;
===流特性===&lt;br /&gt;
&lt;br /&gt;
在流特性的注册项中，[http://xmpp.org/registrar/ XMPP注册项] [[XEP-0138#附录G:备注|8]]中包含'http://jabber.org/features/compress'&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
在协议命名空间的注册项中，XMPP注册项中包含'http://jabber.org/protocol/compress'&lt;br /&gt;
&lt;br /&gt;
===压缩方法注册===&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;http://www.xmpp.org/registrar/compress.html&amp;gt;中，XMPP注册项维护了压缩方法的注册。&lt;br /&gt;
&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
为了提交新的注册项到注册登记处，登记者必须根据以下表单将其包含在相关的扩展协议中或者发送邮件到&amp;lt;registrar@xmpp.org&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;method&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;the XML character data of the method element&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;a natural-language description of the compression method&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;the document that specifies or registers the compression method&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
登记者可能同时登记多个压缩方法，每个方法都包含一个独立的&amp;lt;method/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
====注册====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;method&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;zlib&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;the ZLIB compression method&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;RFC 1950&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==XML Schemas==&lt;br /&gt;
&lt;br /&gt;
===流特性===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/features/compress'&lt;br /&gt;
    xmlns='http://jabber.org/features/compress'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0138: http://www.xmpp.org/extensions/xep-0138.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compression'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='method' type='xs:NCName' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/compress'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/compress'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0138: http://www.xmpp.org/extensions/xep-0138.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compress'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='method' type='xs:NCName' minOccurs='1' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compressed' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='failure'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='setup-failed' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='processing-failed' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='unsupported-method' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:group ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='err:text' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0138&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：2.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2009-05-27&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：compress&lt;br /&gt;
&lt;br /&gt;
compress名字空间的XML架构: &amp;lt;http://www.xmpp.org/schemas/compress.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
feature名字空间的XML架构: &amp;lt;http://www.xmpp.org/schemas/compress-feature.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://xmpp.org/registrar/compress.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0138.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0138.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0138.xml XML] [http://xmpp.org/extensions/xep-0138.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Joe Hildebrand'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:jhildebr@cisco.com jhildebr@cisco.com]&lt;br /&gt;
&lt;br /&gt;
:JabberID: hildjj@jabber.org&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
:URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# RFC 4346: TLS协议版本1.1 &amp;lt;http://tools.ietf.org/html/rfc4346&amp;gt;.&lt;br /&gt;
# RFC 3749: TLS协议压缩方法 &amp;lt;http://tools.ietf.org/html/rfc3749&amp;gt;.&lt;br /&gt;
# XEP-0170: 推荐的流特性协商顺序 &amp;lt;http://www.xmpp.org/extensions/xep-0170.html&amp;gt;.&lt;br /&gt;
# RFC 1950: ZLIB压缩数据格式规范版本 3.3 &amp;lt;http://tools.ietf.org/html/rfc1950&amp;gt;.&lt;br /&gt;
# XEP-0229: LZW流压缩 &amp;lt;http://www.xmpp.org/extensions/xep-0229.html&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构(IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
Version 2.0 (2009-05-27)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the XMPP Council, advanced status to Final.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.3 (2007-09-26)&lt;br /&gt;
&lt;br /&gt;
Moved specification of LZW algorithm to XEP-0229.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.2 (2007-08-22)&lt;br /&gt;
&lt;br /&gt;
Clarified when compression shall be considered to start; per XEP-0170, specified that compression should be negotiated after SASL.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.1 (2005-12-14)&lt;br /&gt;
&lt;br /&gt;
More completely specified error handling; mentioned LZW (DCLZ) method.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2005-06-16)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Draft.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.5 (2005-05-18)&lt;br /&gt;
&lt;br /&gt;
Modifications to address Council feedback: used RFC 3920 terminology; specified error conditions; specified ZLIB as mandatory to implement.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.4 (2005-05-11)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the schemas.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.3 (2005-03-28)&lt;br /&gt;
&lt;br /&gt;
Specified compression methods registry.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-09-28)&lt;br /&gt;
&lt;br /&gt;
Fixed TLS text per list discussion.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-07-16)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
&lt;br /&gt;
(jjh/psa) &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
结束&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97</id>
		<title>Openfire:安装指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97"/>
				<updated>2010-10-11T08:07:05Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 安装概述 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html '''&lt;br /&gt;
&lt;br /&gt;
'''安装指南'''&lt;br /&gt;
&lt;br /&gt;
Openfire是一个强大的即时消息（IM）和聊天服务器，它实现了XMPP协议。这份文件将引导您通过安装Openfire。对于更多的功能和信息的完整列表，请访问Openfire网站：http://www.igniterealtime.org/projects/openfire/&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
运行Openfire 安装包. 应用缺省将被安装于目录 c:\Program Files\Openfire .&lt;br /&gt;
&lt;br /&gt;
===Linux/Unix===&lt;br /&gt;
&lt;br /&gt;
可选择RPM包或tar.gz包. 如果使用RPM包, 用你的包管理器运行把它Openfire安装到目录 /opt/openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpm -ivh openfire_3_0_0.rpm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果使用.tar.gz包, 解压到目录 /opt 或 /usr/bin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xzvf openfire_3_0_0.tar.gz&lt;br /&gt;
mv openfire /opt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''注意''': .tar.gz包不一定包含Java虚拟机(JRE). 所以, 你必须之前就有 JDK 或 JRE 1.5.0 (Java 5) 或之后安装到你的系统里. 你可以在命令行键入 &amp;quot;java -version&amp;quot; 来检查你的java版本，然后 (如果必要) 访问 http://java.sun.com 更新你的Java安装.&lt;br /&gt;
&lt;br /&gt;
==安装概述==&lt;br /&gt;
&lt;br /&gt;
为了完成Openfire的安装, 你需要执行以下步骤:&lt;br /&gt;
&lt;br /&gt;
# [[Openfire:安装指南#安装数据库|数据库]] - 如果你选择使用一个外部数据库, 你必须准备为Openfire准备好你的数据库.&lt;br /&gt;
# [[Openfire:安装指南#安装服务器|安装]] - 使用内置的基于web的安装工具来安装和验证服务器的配置.&lt;br /&gt;
# [[Openfire:安装指南#管理控制台|管理控制台]] - 使用基于web的管理工具来管理服务器.&lt;br /&gt;
&lt;br /&gt;
本文也包括以下信息:&lt;br /&gt;
&lt;br /&gt;
* [[Openfire:安装指南#在Windows下运行Openfire|在Windows下运行]]&lt;br /&gt;
* [[Openfire:安装指南#在Unix/Linux下运行Openfire|在Unix/Linux下运行]]&lt;br /&gt;
* [[Openfire:安装指南#在Unix/插件|安装和使用插件]]&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==分发版里的文件==&lt;br /&gt;
&lt;br /&gt;
你的分发版里的文件应该像下面这样 (为了简短一点，一些子目录被忽略了):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openfire/&lt;br /&gt;
 |- readme.html&lt;br /&gt;
 |- license.html&lt;br /&gt;
 |- conf/&lt;br /&gt;
 |- bin/&lt;br /&gt;
 |- jre/&lt;br /&gt;
 |- lib/&lt;br /&gt;
 |- plugins/&lt;br /&gt;
     |- admin/&lt;br /&gt;
 |- resources/&lt;br /&gt;
     |-database/&lt;br /&gt;
     |-security/&lt;br /&gt;
 |- documentation/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''conf''' 目录Openfire用来存放配置文件.&lt;br /&gt;
* '''bin''' 目录包含了服务器的可执行文件. 根据你安装的不同分发版, 可用的执行文件也不同.&lt;br /&gt;
* '''jre''' 目录包含了一个 Java 5 虚拟机，打包在Windows和RPM版本Openfire里面的.&lt;br /&gt;
* '''lib''' 目录包含了运行Openfire所需要的库.&lt;br /&gt;
* '''plugins''' 目录包含了服务器插件. 缺省地, Openfire带了一个基于web的管理控制台插件.&lt;br /&gt;
* '''resources/database''' 目录包含 SQL 架构文件，用来新建Openfire数据库, 以及已有安装的更新脚本.&lt;br /&gt;
* '''resources/security''' 目录是Openfire维护keystores的地方，用来支持SSL连接安全性.&lt;br /&gt;
* '''documentation''' 目录包含了服务器文档.&lt;br /&gt;
&lt;br /&gt;
==安装数据库==&lt;br /&gt;
&lt;br /&gt;
Openfire能把它的数据存储在一个嵌入式的数据库里，你也能选择使用一个外部数据库,例如MySQL或Oracle. 如果你喜欢使用外部数据库, 你必须在开始安装之前准备好它. 更多信息见[http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database.html 数据库安装].&lt;br /&gt;
&lt;br /&gt;
==安装服务器==&lt;br /&gt;
&lt;br /&gt;
Openfire內建了一个基于web的, &amp;quot;向导&amp;quot;驱动的安装和配置工具. 简单地启动Openfire(分平台的指引如下) 并使用浏览器连接到管理控制台. 基于web的管理控制台的缺省端口是9090. 如果你和Openfire在同一台机器, 以下URL通常会起作用: http://127.0.0.1:9090.&lt;br /&gt;
&lt;br /&gt;
==管理控制台==&lt;br /&gt;
&lt;br /&gt;
在完成上述步骤之后, Openfire将被配置，你可以用基于web的管理控制台管理服务器. URL应该和你用来安装服务器用的那个一样，除非你在安装期间修改了那个端口.&lt;br /&gt;
&lt;br /&gt;
==在Windows下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你使用了Openfire安装包, 在你的开始菜单里会有一个快捷方式来启动图形化启动器. 否则, 在你的 Openfire 安装位置的 bin/ 目录运行 openfire.exe . 在启动界面上有一个按钮，允许你自动打开你的web浏览器连接正确的URL来完成服务器的安装&lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/launcher.png&lt;br /&gt;
&lt;br /&gt;
===Windows服务===&lt;br /&gt;
&lt;br /&gt;
如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作为一个标准的Windows来运行. 如果你使用Windows安装包, 一个 openfire-service.exe 文件将会出现在安装目录下的 bin 目录. 你可以使用这个可执行文件来安装和控制Openfire服务.&lt;br /&gt;
&lt;br /&gt;
从控制台窗口, 你可以运行以下命令:&lt;br /&gt;
&lt;br /&gt;
* '''openfire-service /install''' -- 安装服务.&lt;br /&gt;
* '''openfire-service /uninstall''' -- 卸载服务.&lt;br /&gt;
* '''openfire-service /start''' -- 启动服务.&lt;br /&gt;
* '''openfire-service /stop''' -- 停止服务. &lt;br /&gt;
&lt;br /&gt;
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/windows_service.png&lt;br /&gt;
&lt;br /&gt;
你也可以在Windows控制面板使用服务工具来启动和停止服务.&lt;br /&gt;
&lt;br /&gt;
注意: 那个图形化的启动器目前和Windows服务还不兼容. 如果你安装了服务, 你应该使用上述的服务控制台来控制服务而不是这个图形启动器.&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
-Xms512m&lt;br /&gt;
-Xmx1024m&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
要新建参数给普通的启动器, 新建一个文件，名为 openfired.vmoptions (因为 openfire.exe 启动器会调用 openfired.exe 可执行文件来实际地启动服务器).&lt;br /&gt;
&lt;br /&gt;
==在Linux/Unix下运行Openfire==&lt;br /&gt;
&lt;br /&gt;
如果你正在一个 Red Hat 或类 Red Hat 的系统上运行 (CentOS, Fedora, 等等), 我们建议使用RPM，因为它包含一些标准的类Red Hat环境的自定义处理. 假设你使用了RPM, 你可以使用 '''/etc/init.d/openfire''' 脚本启动和停止Openfire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# /etc/init.d/openfire&lt;br /&gt;
Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload}&lt;br /&gt;
# /etc/init.d/openfire start&lt;br /&gt;
Starting openfire:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你正在一个不同的Linux/Unix变种下运行, 并且/或你使用了tar.gz '安装包', 你可以使用你的Openfire安装目录下的 bin/openfire 脚本启动和停止Openfire:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ./openfire&lt;br /&gt;
Usage: ./openfire {start|stop}&lt;br /&gt;
# ./openfire start&lt;br /&gt;
Starting openfire&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你想把Openfire安装成一个服务, 在 bin/extra 目录提供了两个脚本:&lt;br /&gt;
&lt;br /&gt;
* redhat-postinstall.sh -- 自动把Openfire安装为Red Hat的服务. 它会新建一个&amp;quot;jive&amp;quot;用户，然后拷贝 openfired 脚本到你的 init.d 目录. 这个脚本必须以root身份来运行. 更多信息请看脚本里的注释.&lt;br /&gt;
* openfired -- 把Openfire当成服务运行的脚本. 你必须手工配置这个脚本. 更多信息请看脚本里的注释.&lt;br /&gt;
&lt;br /&gt;
'''如果你通过RPM安装，不推荐你使用这些脚本. RPM已经把这些脚本照顾得很好了.'''&lt;br /&gt;
&lt;br /&gt;
===自定义参数===&lt;br /&gt;
&lt;br /&gt;
你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:&lt;br /&gt;
&lt;br /&gt;
高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 如果你是通过RPM安装的, 你可以编辑 /etc/sysconfig/openfire 文件并找到 OPENFIRE_OPTS 选项来定制它. 如果你通过.tar.gz安装的, 你要调整你的启动脚本来满足你的需要.&lt;br /&gt;
&lt;br /&gt;
==插件==&lt;br /&gt;
&lt;br /&gt;
插件给Openfire增加了额外的特性和协议支持. 在安装完你的Openfire之后, 你可能想下载并安装插件以增进你的服务器. 插件可从 igniterealtime.org 的 plugins 页面下载或直接从内部的管理控制台直接下载.&lt;br /&gt;
&lt;br /&gt;
===安装插件===&lt;br /&gt;
&lt;br /&gt;
如果你从Openfire内部的管理控制台下载了一个插件, 它将被自动安装. 如果你手工下载这个插件(打包成一个.jar文件), 你可以通过把插件文件拷贝到Openfire安装目录下的 plugins/ 目录来布署它. 一个插件监控器将自动解包这个插件到一个目录并安装这个插件到Openfire. 你也可以在管理控制台使用&amp;quot;上传插件&amp;quot;功能(在 插件 标签页) 来从本地文件系统装入一个插件到服务器.&lt;br /&gt;
&lt;br /&gt;
===管理插件===&lt;br /&gt;
&lt;br /&gt;
插件可通过内部的Openfire管理控制台来管理. 你也可以在任何时候通过删除插件的JAR文件来手工删除一个插件(当你这么干了，Openfire将从内存自动移除这个插件并删除它的目录).&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/Ejabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97</id>
		<title>Ejabberd2:安装和操作指南</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/Ejabberd2:%E5%AE%89%E8%A3%85%E5%92%8C%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97"/>
				<updated>2010-10-11T08:07:02Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 绪论 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP服务器]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自 http://www.process-one.net/en/ejabberd/guide_en '''&lt;br /&gt;
&lt;br /&gt;
'''ejabberd 2.1.4 安装和管理指南'''&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
ejabberd是一个用[http://www.erlang.org/ Erlang/OTP]语言写的自由和开源的即时消息服务器.&lt;br /&gt;
&lt;br /&gt;
ejabberd是跨平台,分布式, 容错, 并基于开放标准的实时通讯系统.&lt;br /&gt;
&lt;br /&gt;
ejabberd的设计坚若磐石，是一个功能服丰富的XMPP服务器.&lt;br /&gt;
&lt;br /&gt;
ejabberd同时适合小规模布署和超大规模布署, 无论它们是否需要可伸缩性.&lt;br /&gt;
&lt;br /&gt;
===关键功能===&lt;br /&gt;
&lt;br /&gt;
ejabberd是:&lt;br /&gt;
&lt;br /&gt;
* 跨平台的: ejabberd可以运行在Microsoft Windows和Unix派生系统，例如Linux, FreeBSD和NetBSD.&lt;br /&gt;
* 分布式的: 你可以在一个集群的机器上运行ejabberd，并且所有的机器都服务于同一个或一些Jabbe域. 当你需要更大容量的时候，你可以简单地增加一个廉价节点到你的集群里. 因此, 你不需要买一个昂贵的高端机器来支持上万个并发用户.&lt;br /&gt;
* 容错: 你可以布署一个ejabberd集群，这样一个正常运行的服务的所有必需信息将被复制到所有节点. 这意味着如果其中一个节点崩溃了, 其他节点将无中断的继续运行. 另外, 也可以‘不停机’增加或更换节点.&lt;br /&gt;
* 易于管理: ejabberd建立于开源的Erlang. 所以你不需要安装外部服数据库, 外部web服务器, 除此以外因为每个东西都已经包含在里面, 并且处于开箱可用状态. 其他管理上的好处包括:&lt;br /&gt;
** 详尽的文档.&lt;br /&gt;
** 便捷的安装程序，包括在Linux, Mac OS X, 以及Windows系统下.&lt;br /&gt;
** Web管理.&lt;br /&gt;
** 共享名册组.&lt;br /&gt;
** 命令行管理工具.&lt;br /&gt;
** 可外部集成的验证机制.&lt;br /&gt;
** 发送匿名消息的能力. &lt;br /&gt;
* 国际化: ejabberd领导国际化. 非常适合全球化. 相关功能包括:&lt;br /&gt;
** 翻译成25种语言.&lt;br /&gt;
** 支持[http://www.ietf.org/rfc/rfc3490.txt IDNA]. &lt;br /&gt;
* 开放标准: ejabberd是的一个完全支持XMPP标准的开源Jabber服务器.&lt;br /&gt;
** 完全兼容XMPP.&lt;br /&gt;
** 基于XML的协议.&lt;br /&gt;
** 支持的[http://www.ejabberd.im/protocols 协议]很多.&lt;br /&gt;
&lt;br /&gt;
===额外功能===&lt;br /&gt;
&lt;br /&gt;
而且, ejabberd广泛支持的其他先进特性:&lt;br /&gt;
&lt;br /&gt;
* 模块化&lt;br /&gt;
** 只装在你想要的模块.&lt;br /&gt;
** 在你自己的自定义模块扩展ejabberd. &lt;br /&gt;
* 安全性&lt;br /&gt;
** 支持c2s和s2s连接的SASL和STARTTLS.&lt;br /&gt;
** 支持s2s连接的STARTTLS和Dialback.&lt;br /&gt;
** 可通过HTTPS安全访问的Web管理. &lt;br /&gt;
* 数据库&lt;br /&gt;
** 快速布署的内部数据库(Mnesia).&lt;br /&gt;
** 原生的MySQL支持.&lt;br /&gt;
** 原生的PostgreSQL支持.&lt;br /&gt;
** 支持ODBC数据存储.&lt;br /&gt;
** 支持Microsoft SQL Server. &lt;br /&gt;
* 验证&lt;br /&gt;
** 内部验证.&lt;br /&gt;
** PAM, LDAP 和 ODBC.&lt;br /&gt;
** 外部验证脚本. &lt;br /&gt;
* 其他&lt;br /&gt;
** 支持虚拟主机.&lt;br /&gt;
** XML流压缩 ([http://xmpp.org/extensions/xep-0138.html XEP-0138]).&lt;br /&gt;
** 统计 ([http://xmpp.org/extensions/xep-0039.html XEP-0039]).&lt;br /&gt;
** 支持IPv6的c2s和s2s连接.&lt;br /&gt;
** 支持集群和HTML日志的[[XEP-0045|多用户聊天]]模块.&lt;br /&gt;
** 基于用户vCards的用户目录.&lt;br /&gt;
** 支持[http://xmpp.org/extensions/xep-0163.html 基于PubSub的个人事件]的[http://xmpp.org/extensions/xep-0060.html 发行-订阅]组件.&lt;br /&gt;
** 支持web客户端: [http://xmpp.org/extensions/xep-0025.html HTTP轮询]和[http://xmpp.org/extensions/xep-0206.html HTTP绑定(BOSH)]服务.&lt;br /&gt;
** IRC网关.&lt;br /&gt;
** 组件支持: 安装特定网关之后和外部网络的接口，如 AIM, ICQ 和 MSN.&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==安装Installing ejabberd==&lt;br /&gt;
===用ejabberd二进制安装包安装===&lt;br /&gt;
&lt;br /&gt;
最简单的安装ejabberd即时消息服务器的方法可能是使用ProcessOne发布的二进制安装包. 已发布的ejabberd版本的二进制安装包在 ProcessOne ejabberd 下载页可以找到: http://www.process-one.net/en/ejabberd/downloads&lt;br /&gt;
&lt;br /&gt;
安装包将布署和配置一个完整的不需要任何依赖的ejabberd服务器.&lt;br /&gt;
&lt;br /&gt;
在 *nix 系统里, 记住启动之前把二进制安装包文件的属性设置成可执行的. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod +x ejabberd-2.0.0_1-linux-x86-installer.bin&lt;br /&gt;
./ejabberd-2.0.0_1-linux-x86-installer.bin&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ejabberd可以任何时候手工启动, 或在系统启动时由操作系统自动启动.&lt;br /&gt;
&lt;br /&gt;
要手动启动和停止, 可使用安装包建立的桌面快捷方式. 如果机器没有图形系统, 使用在ejabberd安装目录下的 ’bin’ 目录脚本 ’start’ 和 ’stop’.&lt;br /&gt;
&lt;br /&gt;
Windows安装包把ejabberd安装成了系统服务, 同时有一个快捷方式可以启动一个调试控制台给有经验的管理员使用. 如果你想ejabberd在开机时自动启动, 进入Windows服务设置界面并把ejabberd设置成自动启动. 注意Windows服务还是一个开发中的特性, 例如它不能读取ejabberdctl.cfg文件.&lt;br /&gt;
&lt;br /&gt;
在一个 *nix 系统, 如果你想ejabberd在开机时启动成为一个服务, 从 ’bin’目录拷贝 ejabberd.init 到类似 /etc/init.d/ejabberd (取决于你的操作系统的把本). 新建一个系统用户 ejabberd; 它将用于启动该服务的脚本. 然后你可以以root身份调用 /etc/inid.d/ejabberd 来启动服务.&lt;br /&gt;
&lt;br /&gt;
如果ejabberd不能在Windows里正确地启动, 尝试用启动菜单或桌面的快捷方式启动它. 如果window显式错误14001, 解决方案是安装: &amp;quot;Microsoft Visual C++ 2005 SP1 Redistributable Package&amp;quot;. 你可以从 http://www.microsoft.com/ 下载它. 然后卸载并再次安装ejabberd.&lt;br /&gt;
&lt;br /&gt;
如果ejabberd不能正确启动并且生成一个崩溃的dump, 表示有严重问题. 在Windows下你可以尝试使用 bin/live.bat 脚本启动ejabberd, 或在其它操作系统执行命令 bin/ejabberdctl live . 用这个办法你可以看到Erlang提供的错误消息并且辨别出确切的问题.&lt;br /&gt;
&lt;br /&gt;
ejabberdctl管理脚本位于 bin 目录. 关于ejabberdctl和用于微调Erlang运行时系统的可配置选项，详见 [[Ejabberd2:安装和操作指南#ejabberdctl|4.1]] 章.&lt;br /&gt;
&lt;br /&gt;
===用操作系统特定的包安装ejabberd===&lt;br /&gt;
&lt;br /&gt;
一些操作系统提供了特定的适应系统体系结构和库的ejabberd包. 它经常也会检查依赖的包并执行基本的配置任务，类似新建初始管理帐号. 例如Debian和Gentoo. 更多信息请查找你的操作系统提供的资源.&lt;br /&gt;
&lt;br /&gt;
那些包经常新建一个脚本，类似 /etc/init.d/ejabberd，在开机时启动和停止 ejabberd 服务.&lt;br /&gt;
&lt;br /&gt;
===用CEAN安装ejabberd===&lt;br /&gt;
&lt;br /&gt;
[http://cean.process-one.net/ CEAN] (Comprehensive Erlang Archive Network) 是一个存放了很多Erlang程序二进制包的仓库，包括了ejabberd和它所有的依赖包. 这些二进制包可用于多种不同的系统结构, 所以对于二进制安装包和操作系统的ejabberd包来说，这是一个备选.&lt;br /&gt;
&lt;br /&gt;
根据你如何处理你的CEAN安装而定，你需要新建自己的 ejabberd 启动脚本. 缺省的ejabberdctl脚本位于 ejabberd 的 priv 目录并且用作一个示例.&lt;br /&gt;
&lt;br /&gt;
===从源码安装ejabberd===&lt;br /&gt;
&lt;br /&gt;
发布ejabberd稳定版的规范方式是源码包. 从源码编译ejabberd在 *nix 系统是非常容易的, 只要你的系统拥有所有的依赖包.&lt;br /&gt;
&lt;br /&gt;
====需求====&lt;br /&gt;
&lt;br /&gt;
为了在一个‘类Unix’ 操作系统编译ejabberd, 你需要:&lt;br /&gt;
&lt;br /&gt;
* GNU Make&lt;br /&gt;
* GCC&lt;br /&gt;
* Libexpat 1.95 或更高版本&lt;br /&gt;
* Erlang/OTP R10B-9 或更高版本. 推荐的版本是 R12B-5. 对 R13 的支持是实验性质的.&lt;br /&gt;
* OpenSSL 0.9.6 或更高版本, 用于 STARTTLS, SASL 和 SSL 加密. 可选的, 高度推荐.&lt;br /&gt;
* Zlib 1.2.3 或更高版本, 用于支持流压缩 ([http://xmpp.org/extensions/xep-0138.html XEP-0138]). 可选的.&lt;br /&gt;
* Erlang mysql library. 可选的. 用于支持 MySQL 验证或存储. 见 [[Ejabberd2:安装和操作指南#MySQL|3.2.1]] 节.&lt;br /&gt;
* Erlang pgsql library. 可选的. 用于支持 PostgreSQL 验证或存储. 见 [[Ejabberd2:安装和操作指南#PostgreSQL|3.2.3]] 节.&lt;br /&gt;
* PAM library. 可选的. 用于F 可插拔的验证模块 (PAM). 见 [[Ejabberd2:安装和操作指南#PAM验证|3.1.4]] 节.&lt;br /&gt;
* GNU Iconv 1.8 或更高版本, 用于 IRC 网关 (mod_irc). 可选的. 在系统里不需要 GNU Libc. 见 [[Ejabberd2:安装和操作指南#mod_irc|3.3.8]] 节.&lt;br /&gt;
* ImageMagick’s 转换程序. 可选的. 用于 CAPTCHA 挑战. 见 [[Ejabberd2:安装和操作指南#CAPTCHA|3.1.8]] 节.&lt;br /&gt;
* exmpp 0.9.2 或更高版本. 可选的. 用于以 [http://xmpp.org/extensions/xep-0227.html XEP-0227] XML文件格式导入/导出用户数据.&lt;br /&gt;
&lt;br /&gt;
====下载源码====&lt;br /&gt;
&lt;br /&gt;
ejabberd的发布版本在 ProcessOne ejabberd 下载页: http://www.process-one.net/en/ejabberd/downloads&lt;br /&gt;
&lt;br /&gt;
另外, 最新的开发源码可使用命令行从 Git 仓库获得:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone git://git.process-one.net/ejabberd/mainline.git ejabberd&lt;br /&gt;
cd ejabberd&lt;br /&gt;
git checkout -b 2.1.x origin/2.1.x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====编译====&lt;br /&gt;
&lt;br /&gt;
编译ejabberd可执行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
编译配置脚本允许很多选项. 要获得所有选项列表执行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure --help&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一些你可能有兴趣修改的选项如下:&lt;br /&gt;
&lt;br /&gt;
'''--prefix=/'''&lt;br /&gt;
&lt;br /&gt;
指定运行make install命令时文件将要拷贝的路径.&lt;br /&gt;
&lt;br /&gt;
'''--enable-user[=USER]'''&lt;br /&gt;
&lt;br /&gt;
允许普通系统用户执行ejabberdctl脚本 (参见 [[Ejabberd2:安装和操作指南#ejabberd|4.1]] 节), 读取配置, 读写 spool 目录, 读写 log 目录. 这个帐号的用户和组必须在运行make install之前就存在于机器上. 这个帐号不需要一个暴露的 HOME 目录, 因为缺省将使用 /var/lib/ejabberd/ .&lt;br /&gt;
&lt;br /&gt;
'''--enable-pam'''&lt;br /&gt;
&lt;br /&gt;
允许PAM验证方法 (参见 [[Ejabberd2:安装和操作指南#PAM验证|3.1.4]] 节).&lt;br /&gt;
&lt;br /&gt;
'''--enable-odbc or --enable-mssql'''&lt;br /&gt;
&lt;br /&gt;
如果你想使用外部数据库则需要这个选项. 详见 [[Ejabberd2:安装和操作指南#数据库和LDAP配置|3.2]] 节.&lt;br /&gt;
&lt;br /&gt;
'''--enable-full-xml'''&lt;br /&gt;
&lt;br /&gt;
允许使用基于XML的优化. 例如它将使用 CDATA 来逃逸 XMPP 流中的字符串. 只有你确定你的XMPP客户端有一个全兼容的XML分析器才使用这个选项.&lt;br /&gt;
&lt;br /&gt;
'''--disable-transient-supervisors'''&lt;br /&gt;
&lt;br /&gt;
对临时进程禁止使用Erlang/OTP监督.&lt;br /&gt;
&lt;br /&gt;
====安装====&lt;br /&gt;
&lt;br /&gt;
安装ejabberd到目标目录, 执行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意安装ejabberd的时候你可能需要系统管理员的权限.&lt;br /&gt;
&lt;br /&gt;
缺省的新建文件和目录如下:&lt;br /&gt;
&lt;br /&gt;
 '''/etc/ejabberd/'''&lt;br /&gt;
    配置文件目录:&lt;br /&gt;
    '''ejabberd.cfg'''&lt;br /&gt;
        ejabberd配置文件&lt;br /&gt;
    '''ejabberdctl.cfg'''&lt;br /&gt;
        管理脚本配置文件&lt;br /&gt;
    '''inetrc'''&lt;br /&gt;
        网络DNS配置文件&lt;br /&gt;
&lt;br /&gt;
 '''/lib/ejabberd/'''&lt;br /&gt;
    '''ebin/'''&lt;br /&gt;
        Erlang二进制文件(*.beam) &lt;br /&gt;
    '''include/'''&lt;br /&gt;
        Erlang头文件(*.hrl) &lt;br /&gt;
    '''priv/'''&lt;br /&gt;
        运行时需要的其他文件&lt;br /&gt;
        '''bin/'''&lt;br /&gt;
            可执行程序&lt;br /&gt;
        '''lib/'''&lt;br /&gt;
            二进制系统文件(*.so) &lt;br /&gt;
        '''msgs/'''&lt;br /&gt;
            翻译文件(*.msgs) &lt;br /&gt;
&lt;br /&gt;
 '''/sbin/ejabberdctl'''&lt;br /&gt;
    管理脚本(见 [[Ejabberd2:安装和操作指南#ejabberdctl|4.1]] 节) &lt;br /&gt;
&lt;br /&gt;
 '''/share/doc/ejabberd/'''&lt;br /&gt;
    ejabberd文档&lt;br /&gt;
&lt;br /&gt;
 '''/var/lib/ejabberd/'''&lt;br /&gt;
    Spool目录:&lt;br /&gt;
    '''.erlang.cookie'''&lt;br /&gt;
        Erlang cookie文件(见 [[Ejabberd2:安装和操作指南# Erlang Cookie|5.3]] 节) &lt;br /&gt;
    '''acl.DCD, ...'''&lt;br /&gt;
        Mnesia数据库spool文件(*.DCD, *.DCL, *.DAT) &lt;br /&gt;
&lt;br /&gt;
 '''/var/log/ejabberd/'''&lt;br /&gt;
    日志目录(见 [[Ejabberd2:安装和操作指南#日志文件|7.1]] 节):&lt;br /&gt;
    '''ejabberd.log'''&lt;br /&gt;
        ejabberd服务日志&lt;br /&gt;
    '''erlang.log'''&lt;br /&gt;
        Erlang/OTP系统日志&lt;br /&gt;
&lt;br /&gt;
====启动====&lt;br /&gt;
&lt;br /&gt;
你可以使用ejabberdctl命令行管理脚本来启动和停止ejabberd. 如果你提供了配置选项 --enable-user=USER (见 [[Ejabberd2:安装和操作指南#编译|2.4.3]] 节), 你可以以那个系统帐号或root的身份执行ejabberdctl.&lt;br /&gt;
&lt;br /&gt;
用法示例:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ejabberdctl start&lt;br /&gt;
&lt;br /&gt;
ejabberdctl status&lt;br /&gt;
The node ejabberd@localhost is started with status: started&lt;br /&gt;
ejabberd is running in that node&lt;br /&gt;
&lt;br /&gt;
ejabberdctl stop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果ejabberd无法启动并生成一个崩溃dump, 表示有严重问题. 你可以尝试使用命令ejabberdctl live启动ejabberd来查看由Erlang提供的出错信息并识别出确切的问题.&lt;br /&gt;
&lt;br /&gt;
关于ejabberdctl和微调Erlang运行时系统的可配置选项，详见 [[Ejabberd2:安装和操作指南#ejabberdctl|4.1]] 节.&lt;br /&gt;
&lt;br /&gt;
如果你希望ejabberd在开机时以服务身份启动, 拷贝 ejabberd.init 到类似 /etc/init.d/ejabberd 目录(取决于你的操作系统版本). 新建一个系统用户ejabberd; 它将被启动该服务的脚本使用. 然后你可以以root身份在开机时调用 /etc/inid.d/ejabberd 来启动该服务.&lt;br /&gt;
&lt;br /&gt;
====BSD的具体说明====&lt;br /&gt;
&lt;br /&gt;
在BSD系统编译ejabberd的命令为:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
gmake&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Sun Solaris的具体说明====&lt;br /&gt;
&lt;br /&gt;
你需要一个GNU install, 但是Solaris里没有带. 如果你的Solaris系统是为 [http://www.blastwave.org/ blastwave.org] 包仓库配置的，这将很容易安装. 确保 /opt/csw/bin 目录在你的 PATH 参数里，然后运行:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pkg-get -i fileutils&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果那个软件名为 ginstall, 修改 ejabberd Makefile 脚本以适应你的系统, 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat Makefile | sed s/install/ginstall/ &amp;gt; Makefile.gi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最终这样安装ejabberd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gmake -f Makefile.gi ginstall&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Microsoft Windows的具体说明====&lt;br /&gt;
=====需求=====&lt;br /&gt;
&lt;br /&gt;
要在一个Microsoft Windows系统里编译ejabberd, 你需要:&lt;br /&gt;
&lt;br /&gt;
* MS Visual C++ 6.0 Compiler&lt;br /&gt;
* [http://www.erlang.org/download.html Erlang/OTP R11B-5]&lt;br /&gt;
* [http://sourceforge.net/project/showfiles.php?group_id=10127&amp;amp;package_id=11277 Expat 2.0.0或更高版本]&lt;br /&gt;
* [http://www.gnu.org/software/libiconv/ GNU Iconv 1.9.2 (可选的)]&lt;br /&gt;
* [http://www.slproweb.com/products/Win32OpenSSL.html Shining Light OpenSSL 0.9.8d或更高版本(使能SSL连接)]&lt;br /&gt;
* [http://www.zlib.net/ Zlib 1.2.3或更高版本]&lt;br /&gt;
&lt;br /&gt;
=====编译=====&lt;br /&gt;
&lt;br /&gt;
我们假定你将把很多库文件尽可能放在 C:\sdk\ 目录，这样更容易跟踪为了安装ejabberd都需要些什么.&lt;br /&gt;
&lt;br /&gt;
1. 安装 Erlang emulator (例如, 在 C:\sdk\erl5.5.5).&lt;br /&gt;
&lt;br /&gt;
2. 安装 Expat 库文件到 C:\sdk\Expat-2.0.0 目录.&lt;br /&gt;
&lt;br /&gt;
拷贝文件 C:\sdk\Expat-2.0.0\Libs\libexpat.dll 到你的Windows系统目录(例如, C:\WINNT 或 C:\WINNT\System32)&lt;br /&gt;
&lt;br /&gt;
3. 编译和安装 Iconv 库到目录 C:\sdk\GnuWin32.&lt;br /&gt;
&lt;br /&gt;
拷贝文件 C:\sdk\GnuWin32\bin\lib*.dll 到你的Windows系统目录(更多安装指引可在iconv分发版的 README.woe32 文件找到 ).&lt;br /&gt;
&lt;br /&gt;
注意: 也可以不拷贝 libexpat.dll 和 iconv.dll 到Windows系统目录, 而是把目录 C:\sdk\Expat-2.0.0\Libs 和 C:\sdk\GnuWin32\bin 加到 PATH 环境变量去.&lt;br /&gt;
&lt;br /&gt;
4. 安装 OpenSSL 到 C:\sdk\OpenSSL 目录并增加 C:\sdk\OpenSSL\lib\VC 到你的环境变量或拷贝二进制文件到你的系统目录.&lt;br /&gt;
&lt;br /&gt;
5. 安装 ZLib 到 C:\sdk\gnuWin32 目录. 拷贝 C:\sdk\GnuWin32\bin\zlib1.dll 到你的系统目录. 如果你修改了你的 path ，它应该在安装 libiconv 之后已经设置好了.&lt;br /&gt;
&lt;br /&gt;
6. 确保你能从你的路径访问Erlang二进制文件. 例如: set PATH=%PATH%;&amp;quot;C:\sdk\erl5.6.5\bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
7. 取决于你如果结束实际的库文件安装，你可能需要在文件configure.erl中检查和调整路径.&lt;br /&gt;
&lt;br /&gt;
8. 在目录ejabberd\src中运行:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      configure.bat&lt;br /&gt;
      nmake -f Makefile.win32&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. 编辑文件 ejabberd\src\ejabberd.cfg 并运行 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      werl -s ejabberd -name ejabberd&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===新建XMPP管理帐号===&lt;br /&gt;
&lt;br /&gt;
你需要一个XMPP帐号并赋予他管理权限来进行ejabberd Web管理:&lt;br /&gt;
&lt;br /&gt;
1. 在你的ejabberd服务器注册一个XMPP帐号, 例如admin1@example.org. 有两个办法来注册一个XMPP帐号:&lt;br /&gt;
&lt;br /&gt;
:1.1. 使用ejabberdctl (见 4.1 节):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
            ejabberdctl register admin1 example.org FgT5bk3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:1.2. 使用一个XMPP客户端进行带内注册(见 3.3.18 节). &lt;br /&gt;
&lt;br /&gt;
2. 编辑ejabberd配置文件来给你创建的XMPP帐号赋予管理权限:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, admins, {user, &amp;quot;admin1&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {access, configure, [{allow, admins}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你可以赋予管理权限给多个XMPP帐号, 也可以赋予权限给其他XMPP服务器.&lt;br /&gt;
&lt;br /&gt;
3. 重启ejabberd以装载新配置.&lt;br /&gt;
&lt;br /&gt;
4. 用你的浏览器打开Web管理界面(http://server:port/admin/). 确保键入了完整的JID作为用户名(在这个例子里是: admin1@example.org. 你需要加一个后缀的原因是因为ejabberd支持虚拟主机.&lt;br /&gt;
&lt;br /&gt;
===升级ejabberd===&lt;br /&gt;
&lt;br /&gt;
要升级一个ejabberd安装到一个新版本, 简单地卸载这个旧版本, 然后安装新版本就可以了. 当然, 重要的是配置文件和Mnesia数据库spool目录不能删除.&lt;br /&gt;
&lt;br /&gt;
在它需要的时候ejabberd在启动时会自动更新Mnesia数据表. 如果你也使用一个外部数据库来存储一些模块, 检查新的ejabberd版本的发布备注(release notes)是否指出也需要更新那些表.&lt;br /&gt;
&lt;br /&gt;
==配置ejabberd==&lt;br /&gt;
===基本配置===&lt;br /&gt;
&lt;br /&gt;
配置文件将在你第一次启动ejabberd时装载. 从该文件获得的内容将被解析并存储到内部的ejabberd数据库. 以后的配置将从数据库装载，并且任何配置文件里的命令都会被添加到数据库里.&lt;br /&gt;
&lt;br /&gt;
注意 ejabberd永远不编辑配置文件. 所以, 使用Web管理修改的配置被存储在数据库, 而不是反射到配置文件. 如果你想那些修改在ejabberd重启后还有效, 你可以同时也修改配置文件, 或删除它的所有内容.&lt;br /&gt;
&lt;br /&gt;
配置文件包含一系列Erlang条款. 以‘%’ 标志开始的行被忽略. 每个条款是一组元素，第一个元素是一个选项的名称, 任何更多的元素则是该选项的值. 如果配置文件不包含类似‘hosts’选项, 旧的存储在数据库的主机名(s)将被启用.&lt;br /&gt;
&lt;br /&gt;
你可以重写存储在数据库的值，通过在配置文件的开始部分增加下面几行:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
override_global.&lt;br /&gt;
override_local.&lt;br /&gt;
override_acls.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
有了这些行，旧的全局选项(在一个集群的所有ejabberd节点之间分享), 本地选项(特有的用于本地ejabberd节点的) 以及 ACLs 将在新配置添加之前被移除.&lt;br /&gt;
&lt;br /&gt;
====主机名====&lt;br /&gt;
&lt;br /&gt;
选项 hosts 定义了包含一个或多个ejabberd将为其提供服务的域名的列表.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{hosts, [HostName, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
示例:&lt;br /&gt;
&lt;br /&gt;
* 服务一个域:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 服务多个域:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {hosts, [&amp;quot;example.net&amp;quot;, &amp;quot;example.com&amp;quot;, &amp;quot;jabber.somesite.org&amp;quot;]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====虚拟主机====&lt;br /&gt;
&lt;br /&gt;
每个虚拟主机的选项可以被独立定义，使用 host_config 选项.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{host_config, HostName, [Option, ...]}'''&lt;br /&gt;
&lt;br /&gt;
示例:&lt;br /&gt;
&lt;br /&gt;
* 域example.net使用内部验证方法，同时域example.com使用运行在域localhost的LDAP服务器来进行验证:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;example.net&amp;quot;, [{auth_method,   internal}]}.&lt;br /&gt;
&lt;br /&gt;
      {host_config, &amp;quot;example.com&amp;quot;, [{auth_method,   ldap},&lt;br /&gt;
                                    {ldap_servers,  [&amp;quot;localhost&amp;quot;]},&lt;br /&gt;
                                    {ldap_uids,     [{&amp;quot;uid&amp;quot;}]},&lt;br /&gt;
                                    {ldap_rootdn,   &amp;quot;dc=localdomain&amp;quot;},&lt;br /&gt;
                                    {ldap_rootdn,   &amp;quot;dc=example,dc=com&amp;quot;},&lt;br /&gt;
                                    {ldap_password, &amp;quot;&amp;quot;}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 域example.net使用ODBC来进行验证，同时域example.com使用运行在域localhost和otherhost的LDAP服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;example.net&amp;quot;, [{auth_method, odbc},&lt;br /&gt;
                                    {odbc_server, &amp;quot;DSN=ejabberd;UID=ejabberd;PWD=ejabberd&amp;quot;}]}.&lt;br /&gt;
&lt;br /&gt;
      {host_config, &amp;quot;example.com&amp;quot;, [{auth_method,   ldap},&lt;br /&gt;
                                    {ldap_servers,  [&amp;quot;localhost&amp;quot;, &amp;quot;otherhost&amp;quot;]},&lt;br /&gt;
                                    {ldap_uids,     [{&amp;quot;uid&amp;quot;}]},&lt;br /&gt;
                                    {ldap_rootdn,   &amp;quot;dc=localdomain&amp;quot;},&lt;br /&gt;
                                    {ldap_rootdn,   &amp;quot;dc=example,dc=com&amp;quot;},&lt;br /&gt;
                                    {ldap_password, &amp;quot;&amp;quot;}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
为了给一个虚拟主机指定特定的ejabberd模块, 你可能先为常规模块定义全局模块选项, 之后增加指定的模块给特定的虚拟主机. 为此, 把定义host_config的每个选项改成通用语法&lt;br /&gt;
&lt;br /&gt;
'''{OptionName, OptionValue}'''&lt;br /&gt;
&lt;br /&gt;
使用这个语法:&lt;br /&gt;
&lt;br /&gt;
'''{{add, OptionName}, OptionValue}'''&lt;br /&gt;
&lt;br /&gt;
在这个例子里，三个虚拟主机有一些相同的模块, 但是特定的虚拟主机也有不同的模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
%% 这个ejabberd服务器有三个虚拟主机:&lt;br /&gt;
{hosts, [&amp;quot;one.example.org&amp;quot;, &amp;quot;two.example.org&amp;quot;, &amp;quot;three.example.org&amp;quot;]}.&lt;br /&gt;
&lt;br /&gt;
%% 这些是所有主机通用模块的配置&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  {mod_roster,     []},&lt;br /&gt;
  {mod_configure,  []},&lt;br /&gt;
  {mod_disco,      []},&lt;br /&gt;
  {mod_private,    []},&lt;br /&gt;
  {mod_time,       []},&lt;br /&gt;
  {mod_last,       []},&lt;br /&gt;
  {mod_version,    []}&lt;br /&gt;
 ]}.&lt;br /&gt;
&lt;br /&gt;
%% 增加一些模块给 vhost one:&lt;br /&gt;
{host_config, &amp;quot;one.example.org&amp;quot;,&lt;br /&gt;
 [{{add, modules}, [&lt;br /&gt;
                    {mod_echo,       [{host, &amp;quot;echo-service.one.example.org&amp;quot;}]}&lt;br /&gt;
                    {mod_http_bind,  []},&lt;br /&gt;
                    {mod_logxml,     []}&lt;br /&gt;
                   ]&lt;br /&gt;
  }&lt;br /&gt;
 ]}.&lt;br /&gt;
&lt;br /&gt;
%% 只增加一个模块给 vhost two:&lt;br /&gt;
{host_config, &amp;quot;two.example.org&amp;quot;,&lt;br /&gt;
 [{{add, modules}, [&lt;br /&gt;
                    {mod_echo,       [{host, &amp;quot;mirror.two.example.org&amp;quot;}]}&lt;br /&gt;
                   ]&lt;br /&gt;
  }&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====监听端口====&lt;br /&gt;
&lt;br /&gt;
选项 listen 定义ejabberd将监听哪些端口, 地址和网络协议，以及什么服务将运行在它们上面. 这个列表的每个元素是一组以下的元素:&lt;br /&gt;
&lt;br /&gt;
* 端口号. 还有可选的IP地址和/或一个传输协议.&lt;br /&gt;
* 监听这个端口的模块.&lt;br /&gt;
* TCP socke和监听中的模块的选项. &lt;br /&gt;
&lt;br /&gt;
这个选项的语法是:&lt;br /&gt;
&lt;br /&gt;
'''{listen, [Listener, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
定义一个 listener 有很多语法.&lt;br /&gt;
&lt;br /&gt;
'''{PortNumber, Module, [Option, ...]}'''&lt;br /&gt;
&lt;br /&gt;
'''{{PortNumber, IPaddress}, Module, [Option, ...]}'''&lt;br /&gt;
&lt;br /&gt;
'''{{PortNumber, TransportProtocol}, Module, [Option, ...]}'''&lt;br /&gt;
&lt;br /&gt;
'''{{PortNumber, IPaddress, TransportProtocol}, Module, [Option, ...]}'''&lt;br /&gt;
&lt;br /&gt;
=====端口号,IP地址和传输协议=====&lt;br /&gt;
&lt;br /&gt;
端口号定义哪个端口监听链入的连接. 它可能是一个Jabber/XMPP标准端口(见 [[Ejabberd2:安装和操作指南#防火墙设定|5.1]] 节) 或任何其他合法的端口号.&lt;br /&gt;
&lt;br /&gt;
IP地址可能被表达为一个字符串或一个十进制或十六进制的 Erlang 组. socket 将只监听那个网络接口. 也可能指定一个通用地址, 这样ejabberd将监听所有地址. 取决于IP地址的类型, 将使用IPv4或IPv6. 当没有指定IP地址时, 它将监听所有IPv4网络地址.&lt;br /&gt;
&lt;br /&gt;
一些IP地址的示例值:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;0.0.0.0&amp;quot; 监听所有IPv4网络接口. 这是当没有指定IP地址时的缺省值.&lt;br /&gt;
* &amp;quot;::&amp;quot; 监听所有IPv6网络接口&lt;br /&gt;
* &amp;quot;10.11.12.13&amp;quot; 监听IPv4地址 10.11.12.13&lt;br /&gt;
* &amp;quot;::FFFF:127.0.0.1&amp;quot; 是IPv6地址 ::FFFF:127.0.0.1/128&lt;br /&gt;
* {10, 11, 12, 13} 是IPv4地址 10.11.12.13&lt;br /&gt;
* {0, 0, 0, 0, 0, 65535, 32512, 1} 是IPv6地址 ::FFFF:127.0.0.1/128&lt;br /&gt;
* {16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1} 是IPv6地址 FDCA:8AB6:A243:75EF::1/128 &lt;br /&gt;
&lt;br /&gt;
传输协议可能是 tcp 或 udp. 缺省是 tcp.&lt;br /&gt;
&lt;br /&gt;
=====监听的模块=====&lt;br /&gt;
&lt;br /&gt;
可用的模块, 它们的目的以及允许使用哪些选项:&lt;br /&gt;
&lt;br /&gt;
'''ejabberd_c2s'''&lt;br /&gt;
:处理c2s连接.&lt;br /&gt;
:选项: access, certfile, max_fsm_queue, max_stanza_size, shaper, starttls, starttls_required, tls, zlib &lt;br /&gt;
&lt;br /&gt;
'''ejabberd_s2s_in'''&lt;br /&gt;
:处理链入的s2s连接.&lt;br /&gt;
:选项: max_stanza_size &lt;br /&gt;
&lt;br /&gt;
'''ejabberd_service'''&lt;br /&gt;
:和一个[http://www.ejabberd.im/tutorials-transports 外部组件]的接口(定义于Jabber组件协议([http://xmpp.org/extensions/xep-0114.html XEP-0114]).&lt;br /&gt;
:选项: access, hosts, max_fsm_queue, shaper, service_check_from &lt;br /&gt;
&lt;br /&gt;
'''ejabberd_stun'''&lt;br /&gt;
:处理STUN绑定请求，定义于 [http://tools.ietf.org/html/rfc5389 RFC 5389].&lt;br /&gt;
:选项: certfile &lt;br /&gt;
&lt;br /&gt;
'''ejabberd_http'''&lt;br /&gt;
:处理链入的HTTP连接.&lt;br /&gt;
:选项: captcha, certfile, http_bind, http_poll, request_handlers, tls, web_admin&lt;br /&gt;
&lt;br /&gt;
=====选项=====&lt;br /&gt;
&lt;br /&gt;
这是每个监听的模块允许使用的选项的详细描述:&lt;br /&gt;
&lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:这个选项定义访问的端口. 缺省值是 all. &lt;br /&gt;
'''{backlog, Value}'''&lt;br /&gt;
:这个backlog值定义等待中的连接的队列可以达到的最大长度. 如果服务器想处理很多的新链入连接，这个值需要增加。因为如果队列里没有足够的空间(ejabberd不能立刻接受它们)，这些新连接可能被抛弃. 缺省值是 5. &lt;br /&gt;
'''{certfile, Path}'''&lt;br /&gt;
:包含缺省的SSL证书的文件的完整路径. 为一个给定的域定义一个证书文件, 使用全局选项 domain_certfile. &lt;br /&gt;
'''{service_check_from, true|false}'''&lt;br /&gt;
:这个选项只能被用于ejabberd_service. 它被用于禁止控制一个从外部组件发送的包的from字段. 这个选项要么是 true 要么是 false. 缺省值是 true ，它遵循 [http://xmpp.org/extensions/xep-0114.html XEP-0114]. &lt;br /&gt;
'''{hosts, [Hostname, ...], [HostOption, ...]}'''&lt;br /&gt;
:连接到ejabberd_service的外部Jabber组件可能服务一个或多个hostnames. 所以你可以为这个组件定义选项 HostOption ; 目前只允许的选项是当组件尝试连接到ejabberd时必需提供的密码: {password, Secret}. 注意你不能在不同的服务里定义同一个 ejabberd_service 组件: 为每个服务增加一个 ejabberd_service , 示例如下. &lt;br /&gt;
'''captcha'''&lt;br /&gt;
:简单的web页面，允许一个用户填一个 CAPTCHA 挑战(见 [[Ejabberd2:安装和操作指南#CAPTCHA|3.1.8]] 节). &lt;br /&gt;
'''http_bind'''&lt;br /&gt;
:这个选项允许支持HTTP绑定([http://xmpp.org/extensions/xep-0124.html XEP-0124]和[http://xmpp.org/extensions/xep-0206.html XEP-0206]) . HTTP绑定允许通过HTTP请求，从那些不允许从5222端口链出socket的防火墙后面访问ejabberd.&lt;br /&gt;
:记住你也必须安装和激活mod_http_bind模块.&lt;br /&gt;
:如果HTTP绑定激活了, 它将可以使用 http://server:port/http-bind/. 注意对HTTP绑定的支持也需要XMPP客户端. 也要注意HTTP绑定对一个基于web的XMPP客户端的主机也是很有意义的，例如[http://jwchat.sourceforge.net/ JWChat] (检查教程来给ejabberd安装JWChat，以及一个 [http://www.ejabberd.im/jwchat-localserver 内嵌的本地web服务器] 或 [http://www.ejabberd.im/jwchat-apache Apache]). &lt;br /&gt;
'''http_poll'''&lt;br /&gt;
:这个选项允许支持HTTP轮询([http://xmpp.org/extensions/xep-0025.html XEP-0025]). HTTP轮询允许通过HTTP请求，从那些不允许从5222端口链出socket的防火墙后面访问ejabberd.&lt;br /&gt;
:如果激活了HTTP轮询, 它可以用 http://server:port/http-poll/. 注意对HTTP轮询的支持也需要XMPP客户端. 也要注意HTTP轮询对一个基于web的XMPP客户端的主机是很有意义的，例如[http://jwchat.sourceforge.net/ JWChat].&lt;br /&gt;
:在没有链入的POST请求时一个客户端会话保持激活状态的最大时间段，可以用全局选项 http_poll_timeout 配置. 缺省值为5分钟. 这个选项可在 ejabberd.cfg 文件里定义, 时间的单位为秒: {http_poll_timeout, 300}. &lt;br /&gt;
'''{max_fsm_queue, Size}'''&lt;br /&gt;
:这个选项指定在一个FSM(有限状态机)队列里元素的最大数量. 大概来说, 在这这些队列的每个消息展示一个准备发送到它想要的外发的流的XML节. 如果队列大小达到限制(因为, 例如, 节的接收者太慢), 这个FSM和相应的连接(如果有)将被终止并且记录一个出错信息. 这个选项的合理的值依赖于你的硬件配置. 无论如何, 把这个大小设为1000个元素以上应该没什么感觉. 这个选项可被指定给 ejabberd_service 和 ejabberd_c2s listeners, 或也可以全局地指定给 ejabberd_s2s_out. 如果这个选项没有指定给 ejabberd_service 或 ejabberd_c2s listeners, 则使用全局配置的值. 允许的值为整数和 ’undefined’. 缺省值为: ’undefined’. &lt;br /&gt;
'''{max_stanza_size, Size}'''&lt;br /&gt;
:这个选项指定一个XML节的近似最大字节数. 近似的, 是因为它计算的精度是以一个被读数据块来的. 例如 {max_stanza_size, 65536}. 缺省值是无穷大. 推荐的值对于c2s连接是 65536，对于s2s连接 是 131072 . s2s 最大节数必须总是比 c2s 的限制更高. 谨慎修改此值，因为如果设置得太小可能导致意料之外的断链. &lt;br /&gt;
'''{request_handlers, [ {Path, Module}, ...]}'''&lt;br /&gt;
:指定一个或多个 handlers 来伺服HTTP请求. Path是一个字符串列表; 所以以那个 Path 启动的 URIs 将被 Module 伺服. 例如, 你希望 mod_foo to 伺服以 /a/b/ 开头的URIs, 同时你也希望 mod_http_bind 伺服 URIs /http-bind/, 使用这个选项: {request_handlers, [{[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;], mod_foo}, {[&amp;quot;http-bind&amp;quot;], mod_http_bind}]} &lt;br /&gt;
'''{service_check_from, true|false}'''&lt;br /&gt;
:通过使能这个选项, ejabberd 允许组件发送的包的’from’属性可以是任何随意的域. 注意 [http://xmpp.org/extensions/xep-0114.html XEP-0114] 要求域必须和组件的主机名吻合. 只有你确保自己需要的情况下才应该激活这个选项. 缺省值是: false. &lt;br /&gt;
'''{shaper, none|ShaperName}'''&lt;br /&gt;
:这个选项为端口定义一个塑型者 shaper (见 [[Ejabberd2:安装和操作指南#Shapers|3.1.6]] 节). 缺省值是 none. &lt;br /&gt;
'''starttls'''&lt;br /&gt;
:这个选项定义 STARTTLS 加密可以用于连接某端口. 你应该也设置 certfile 选项. 你可以使用全局选项 domain_certfile为一个特定的域定义一个证书文件. &lt;br /&gt;
'''starttls_required'''&lt;br /&gt;
:这个选项指定在连接到某端口时 STARTTLS 加密是必需的. 不允许不加密的连接. 你应该也设置 certfile 选项. 你可以使用全局选项 domain_certfile为一个特定的域定义一个证书文件. &lt;br /&gt;
'''tls'''&lt;br /&gt;
:这个选项指定某端口的通讯在连接之后将立刻使用SSL加密. 这是一个早期的Jabber软件使用的传统加密方法, 通常是在端口 5223 ，用于客户端－服务器通讯. 但是这个方法今天已经被藐视和不推荐了. 可取的加密方法是在端口5222使用 STARTTLS , 定义于 [[RFC3920|RFC 3920: XMPP核心]], 这个方法在 ejabberd 里可以使用 starttls 选项来激活. 如果这个选项被设置了, 你应该同时设置 certfile 选项. 选项 tls 也可用于 ejabberd_http 以支持 HTTPS. &lt;br /&gt;
'''web_admin'''&lt;br /&gt;
:这个选项激活为ejabberd管理激活 Web Admin ，可在 http://server:port/admin/ 访问. 登录和密码就是某个你在‘configure’ access rule里授权了的已注册用户的用户名和密码. &lt;br /&gt;
'''zlib'''&lt;br /&gt;
:这个选项指定在某端口的连接可使用 Zlib 流压缩(定义于 [http://xmpp.org/extensions/xep-0138.html XEP-0138]). &lt;br /&gt;
&lt;br /&gt;
有一些额外的全局选项(listen之外的)可以在ejabberd配置文件指定:&lt;br /&gt;
&lt;br /&gt;
'''{s2s_use_starttls, true|false}'''&lt;br /&gt;
:这个选项定义是否为s2s连接使用 STARTTLS . &lt;br /&gt;
'''{s2s_certfile, Path}'''&lt;br /&gt;
:一个包含SSL证书的文件的全路径. &lt;br /&gt;
'''{domain_certfile, Domain, Path}'''&lt;br /&gt;
:包含一个特定域的SSL证书的文件的全路径. &lt;br /&gt;
'''{outgoing_s2s_options, Methods, Timeout}'''&lt;br /&gt;
:指定用哪个地址尝试连接, 以什么顺序, 以及连接超时时间(以毫秒计). 缺省第一次尝试连接使用IPv4地址, 如果失败它将尝试使用IPv6, 超时时间为 10000 毫秒. &lt;br /&gt;
'''{s2s_dns_options, [ {Property, Value}, ...]}'''&lt;br /&gt;
:指定用于DNS解析的 properties. 允许的 Properties 有: 以秒计的缺省值为10的 timeout 和缺省值为2的重试次数. &lt;br /&gt;
'''{s2s_default_policy, allow|deny}'''&lt;br /&gt;
:对于链入和链出到其他XMPP服务器的s2s连接的缺省策略. 缺省值是 allow. &lt;br /&gt;
'''{{s2s_host, Host}, allow|deny}'''&lt;br /&gt;
:指定是否允许一个特定远程主机的链入和链出s2s连接. 这允许限制 ejabberd 只和少数信任的服务器建立s2s连接, 或禁止一些特定的服务器. &lt;br /&gt;
'''{s2s_max_retry_delay, Seconds}'''&lt;br /&gt;
:连接失败后重试连接的最大允许延迟时间. 以秒计算. 这个缺省值是 300 秒 (5分钟). &lt;br /&gt;
'''{max_fsm_queue, Size}'''&lt;br /&gt;
:这个选项指定FSM(有限状态机)的队列里元素的最大数量. 大概来说, 在这些队列里每个消息展示一个准备发送到它想要的外发的流的XML节. 如果队列大小达到限制(因为, 例如, 节的接收者太慢), 这个FSM和相应的连接(如果有)将被终止并且记录一个出错信息. 这个选项的合理的值依赖于你的硬件配置. 无论如何, 把这个大小设为1000个元素以上应该没什么感觉. 这个选项可被指定给 ejabberd_service 和 ejabberd_c2s listeners, 或也可以全局地指定给 ejabberd_s2s_out. 如果这个选项没有指定给 ejabberd_service 或 ejabberd_c2s listeners, 则使用全局配置的值. 允许的值为整数和 ’undefined’. 缺省值为: ’undefined’.  &lt;br /&gt;
'''{route_subdomains, local|s2s}'''&lt;br /&gt;
:定义 ejabberd 是必须直接把节从本地路由到子域 subdomains(兼容 [[RFC3920|RFC 3920: XMPP核心]]), 还是使用S2S到外部服务器 (兼容 [http://tools.ietf.org/html/draft-saintandre-rfc3920bis-09#section-11.3 RFC 3920 bis]).&lt;br /&gt;
&lt;br /&gt;
=====示例=====&lt;br /&gt;
&lt;br /&gt;
例如, 以下简单配置定义:&lt;br /&gt;
&lt;br /&gt;
* 有三个域. 缺省证书文件是 server.pem. 然而, 连接到域example.com的c2s和s2s使用文件example_com.pem.&lt;br /&gt;
* 端口 5222 使用 STARTTLS 监听 c2s 连接, 同时允许简单连接用于旧的客户端.&lt;br /&gt;
* 端口 5223 使用旧的 SSL 监听 c2s 连接 .&lt;br /&gt;
* 端口 5269 使用 STARTTLS 监听 s2s 连接. 这个socket设为IPv6而不是IPv4.&lt;br /&gt;
* 端口 3478 监听通过 UDP 发出的 STUN 请求 .&lt;br /&gt;
* 端口 5280 监听 HTTP 请求, 并伺服 HTTP 轮询服务.&lt;br /&gt;
* 端口 5281 监听 HTTP 请求, 并使用 HTTPS 伺服 Web Admin (见 [[Ejabberd2:安装和操作指南#Web管理|4.3]] 节). 这个socket只监听来自IP地址127.0.0.1的连接.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{hosts, [&amp;quot;example.com&amp;quot;, &amp;quot;example.org&amp;quot;, &amp;quot;example.net&amp;quot;]}.&lt;br /&gt;
{listen,&lt;br /&gt;
 [&lt;br /&gt;
  {5222, ejabberd_c2s, [&lt;br /&gt;
                        {access, c2s},&lt;br /&gt;
                        {shaper, c2s_shaper},&lt;br /&gt;
                        starttls, {certfile, &amp;quot;/etc/ejabberd/server.pem&amp;quot;},&lt;br /&gt;
                        {max_stanza_size, 65536}&lt;br /&gt;
                       ]},&lt;br /&gt;
  {5223, ejabberd_c2s, [&lt;br /&gt;
                        {access, c2s},&lt;br /&gt;
                        {shaper, c2s_shaper},&lt;br /&gt;
                        tls, {certfile, &amp;quot;/etc/ejabberd/server.pem&amp;quot;},&lt;br /&gt;
                        {max_stanza_size, 65536}&lt;br /&gt;
                       ]},&lt;br /&gt;
  {{5269, &amp;quot;::&amp;quot;}, ejabberd_s2s_in, [&lt;br /&gt;
                                   {shaper, s2s_shaper},&lt;br /&gt;
                                   {max_stanza_size, 131072}&lt;br /&gt;
                                  ]},&lt;br /&gt;
  {{3478, udp}, ejabberd_stun, []},&lt;br /&gt;
  {5280, ejabberd_http, [&lt;br /&gt;
                         http_poll&lt;br /&gt;
                        ]},&lt;br /&gt;
  {{5281, &amp;quot;127.0.0.1&amp;quot;}, ejabberd_http, [&lt;br /&gt;
                                        web_admin,&lt;br /&gt;
                                        tls, {certfile, &amp;quot;/etc/ejabberd/server.pem&amp;quot;},&lt;br /&gt;
                                       ]}&lt;br /&gt;
 ]&lt;br /&gt;
}.&lt;br /&gt;
{s2s_use_starttls, true}.&lt;br /&gt;
{s2s_certfile, &amp;quot;/etc/ejabberd/server.pem&amp;quot;}.&lt;br /&gt;
{domain_certfile, &amp;quot;example.com&amp;quot;, &amp;quot;/etc/ejabberd/example_com.pem&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子, 定义了以下配置:&lt;br /&gt;
&lt;br /&gt;
* 端口 5222 (所有IPv4地址)和端口5223 (SSL, IP 192.168.0.1 和 fdca:8ab6:a243:75ef::1)监听c2s连接 ，并禁止名为 ‘bad’的用户.&lt;br /&gt;
* 端口 5269 (所有IPv4地址)为了允许安全通讯而使用STARTTLS监听s2s连接. 远程XMPP服务器的链入和链出连接被禁止, 只有两个服务器可以连接: &amp;quot;jabber.example.org&amp;quot; 和 &amp;quot;example.com&amp;quot;.&lt;br /&gt;
* 端口 5280 在所有的IPv4地址伺服 Web Admin 和 HTTP Polling 服务. 注意它也可能在不同端口伺服它们. [[Ejabberd2:安装和操作指南#Web管理|4.3]] 节的第二个例子展示了怎样确切的做法.&lt;br /&gt;
* 除了管理员，所有用户的通讯流量限制为 1,000 Bytes/second&lt;br /&gt;
* [http://www.ejabberd.im/pyaimt AIM 网关] aim.example.org 被连接到localhost IP 地址(127.0.0.1 and ::1)的 5233 端口 ， 连接密码为‘aimsecret’.&lt;br /&gt;
* ICQ 网关 JIT (icq.example.org and sms.example.org) 被以密码‘jitsecret’连接到端口 5234 .&lt;br /&gt;
* [http://www.ejabberd.im/pymsnt MSN 网关] msn.example.org 被以密码‘msnsecret’连接到端口 5235 .&lt;br /&gt;
* [http://www.ejabberd.im/yahoo-transport-2 Yahoo! 网关] yahoo.example.org 被以密码‘yahoosecret’连接到端口 5236 .&lt;br /&gt;
* [http://www.ejabberd.im/jabber-gg-transport Gadu-Gadu 网关] gg.example.org  被以密码‘ggsecret’连接到端口 5237 .&lt;br /&gt;
* [http://www.ejabberd.im/jmc Jabber Mail 组件] jmc.example.org 被以密码‘jmsecret’连接到端口 5238 .&lt;br /&gt;
* 服务自定义允许特别的选项用来逃避对从这个组件发送的包里检查from属性. 这个组件可以从服务器以任何用户的身份发送包, 或者甚至以任何服务器的身份.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{acl, blocked, {user, &amp;quot;bad&amp;quot;}}.&lt;br /&gt;
{access, c2s, [{deny, blocked},&lt;br /&gt;
               {allow, all}]}.&lt;br /&gt;
{shaper, normal, {maxrate, 1000}}.&lt;br /&gt;
{access, c2s_shaper, [{none, admin},&lt;br /&gt;
                      {normal, all}]}.&lt;br /&gt;
{listen,&lt;br /&gt;
 [{5222, ejabberd_c2s, [&lt;br /&gt;
                        {access, c2s},&lt;br /&gt;
                        {shaper, c2s_shaper}&lt;br /&gt;
                       ]},&lt;br /&gt;
  {{5223, {192, 168, 0, 1}}, ejabberd_c2s, [&lt;br /&gt;
                                            {access, c2s},&lt;br /&gt;
                                            ssl, {certfile, &amp;quot;/path/to/ssl.pem&amp;quot;}&lt;br /&gt;
                                           ]},&lt;br /&gt;
  {{5223, {16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1}},&lt;br /&gt;
   ejabberd_c2s, [&lt;br /&gt;
                  {access, c2s},&lt;br /&gt;
                  ssl, {certfile, &amp;quot;/path/to/ssl.pem&amp;quot;}&lt;br /&gt;
                 ]},&lt;br /&gt;
  {5269, ejabberd_s2s_in, []},&lt;br /&gt;
  {{5280, {0, 0, 0, 0}}, ejabberd_http, [&lt;br /&gt;
                                         http_poll,&lt;br /&gt;
                                         web_admin&lt;br /&gt;
                                        ]},&lt;br /&gt;
  {{5233, {127, 0, 0, 1}}, ejabberd_service, [&lt;br /&gt;
                                              {hosts, [&amp;quot;aim.example.org&amp;quot;],&lt;br /&gt;
                                                 [{password, &amp;quot;aimsecret&amp;quot;}]}&lt;br /&gt;
                                             ]},&lt;br /&gt;
  {{5233, &amp;quot;::1&amp;quot;}, ejabberd_service, [&lt;br /&gt;
                                     {hosts, [&amp;quot;aim.example.org&amp;quot;],&lt;br /&gt;
                                        [{password, &amp;quot;aimsecret&amp;quot;}]}&lt;br /&gt;
                                    ]},&lt;br /&gt;
  {5234, ejabberd_service, [{hosts, [&amp;quot;icq.example.org&amp;quot;, &amp;quot;sms.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;jitsecret&amp;quot;}]}]},&lt;br /&gt;
  {5235, ejabberd_service, [{hosts, [&amp;quot;msn.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;msnsecret&amp;quot;}]}]},&lt;br /&gt;
  {5236, ejabberd_service, [{hosts, [&amp;quot;yahoo.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;yahoosecret&amp;quot;}]}]},&lt;br /&gt;
  {5237, ejabberd_service, [{hosts, [&amp;quot;gg.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;ggsecret&amp;quot;}]}]},&lt;br /&gt;
  {5238, ejabberd_service, [{hosts, [&amp;quot;jmc.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;jmcsecret&amp;quot;}]}]},&lt;br /&gt;
  {5239, ejabberd_service, [{hosts, [&amp;quot;custom.example.org&amp;quot;],&lt;br /&gt;
                             [{password, &amp;quot;customsecret&amp;quot;}]},&lt;br /&gt;
                            {service_check_from, false}]}&lt;br /&gt;
 ]&lt;br /&gt;
}.&lt;br /&gt;
{s2s_use_starttls, true}.&lt;br /&gt;
{s2s_certfile, &amp;quot;/path/to/ssl.pem&amp;quot;}.&lt;br /&gt;
{s2s_default_policy, deny}.&lt;br /&gt;
{{s2s_host,&amp;quot;jabber.example.org&amp;quot;}, allow}.&lt;br /&gt;
{{s2s_host,&amp;quot;example.com&amp;quot;}, allow}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意, 对基于 jabberd14 或 WPJabber 的服务，你不得不做一个网关日志并通过它们本身做 XDB : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
     You have to add elogger and rlogger entries here when using ejabberd.&lt;br /&gt;
     In this case the transport will do the logging.&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;log id='logger'&amp;gt;&lt;br /&gt;
    &amp;lt;host/&amp;gt;&lt;br /&gt;
    &amp;lt;logtype/&amp;gt;&lt;br /&gt;
    &amp;lt;format&amp;gt;%d: [%t] (%h): %s&amp;lt;/format&amp;gt;&lt;br /&gt;
    &amp;lt;file&amp;gt;/var/log/jabber/service.log&amp;lt;/file&amp;gt;&lt;br /&gt;
  &amp;lt;/log&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!--&lt;br /&gt;
     Some XMPP server implementations do not provide&lt;br /&gt;
     XDB services (for example, jabberd2 and ejabberd).&lt;br /&gt;
     xdb_file.so is loaded in to handle all XDB requests.&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xdb id=&amp;quot;xdb&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;host/&amp;gt;&lt;br /&gt;
    &amp;lt;load&amp;gt;&lt;br /&gt;
      &amp;lt;!-- this is a lib of wpjabber or jabberd14 --&amp;gt;&lt;br /&gt;
      &amp;lt;xdb_file&amp;gt;/usr/lib/jabber/xdb_file.so&amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
      &amp;lt;/load&amp;gt;&lt;br /&gt;
    &amp;lt;xdb_file xmlns=&amp;quot;jabber:config:xdb_file&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;spool&amp;gt;&amp;lt;jabberd:cmdline flag='s'&amp;gt;/var/spool/jabber&amp;lt;/jabberd:cmdline&amp;gt;&amp;lt;/spool&amp;gt;&lt;br /&gt;
    &amp;lt;/xdb_file&amp;gt;&lt;br /&gt;
  &amp;lt;/xdb&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====验证====&lt;br /&gt;
&lt;br /&gt;
选项 auth_method 定义了用于验证用户的验证方法. 语法是:&lt;br /&gt;
&lt;br /&gt;
'''{auth_method, [Method, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
ejabberd支持以下验证方法:&lt;br /&gt;
&lt;br /&gt;
* internal (缺省) — 见 [[Ejabberd2:安装和操作指南#内部|3.1.4.]] 节&lt;br /&gt;
* external — 有[http://www.ejabberd.im/extauth 一些示例验证代码].&lt;br /&gt;
* ldap — 见 [[Ejabberd2:安装和操作指南#LDAP|3.2.5.]] 节&lt;br /&gt;
* odbc — 见 [[Ejabberd2:安装和操作指南#MySQL|3.2.1]], [[Ejabberd2:安装和操作指南#PostgreSQL|3.2.3]], [[Ejabberd2:安装和操作指南# Microsoft SQL Server|3.2.2]] 和 [[Ejabberd2:安装和操作指南#ODBC兼容|3.2.4.]] 节&lt;br /&gt;
* anonymous — 见 [[Ejabberd2:安装和操作指南#SASL匿名和匿名登录|3.1.4.]] 节&lt;br /&gt;
* pam — 见 [[Ejabberd2:安装和操作指南#SASL匿名和匿名登录|3.1.4.]] 节&lt;br /&gt;
&lt;br /&gt;
只有internal 和 odbc 方法支持新建帐号.&lt;br /&gt;
&lt;br /&gt;
=====内部=====&lt;br /&gt;
&lt;br /&gt;
ejabberd使用它的内部Mnesia数据库作为缺省的验证方法. 这个值 internal 将允许内部验证方法.&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在example.org使用内部验证, 在example.net使用LDAP验证:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;example.org&amp;quot;, [{auth_method, [internal]}]}.&lt;br /&gt;
      {host_config, &amp;quot;example.net&amp;quot;, [{auth_method, [ldap]}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在所有虚拟主机使用内部验证:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {auth_method, internal}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====SASL匿名和匿名登录=====&lt;br /&gt;
&lt;br /&gt;
这个值 anonymous 将允许内部验证方法.&lt;br /&gt;
&lt;br /&gt;
匿名验证方法可以由以下选项配置. 记住你可以用 host_config 选项设置虚拟主机个别特有的选项(见 [[Ejabberd2:安装和操作指南#虚拟主机|3.1.2]] 节). 注意关于[http://support.process-one.net/doc/display/MESSENGER/Anonymous+users+support SASL匿名和匿名登录配置]也有一个详细的教程 .&lt;br /&gt;
&lt;br /&gt;
'''{allow_multiple_connections, false|true}'''&lt;br /&gt;
:这个选项只用于匿名模式已经被允许的时候. 设置它为 true 意味着在匿名登录模式里，如果使用不同的资源来连接，同样的用户名可以被使用多次. 这个选项只在非常特殊的情况下有用. 缺省值是 false. &lt;br /&gt;
'''{anonymous_protocol, sasl_anon | login_anon | both}'''&lt;br /&gt;
:sasl_anon 意味着将使用 SASL 匿名方法. login_anon 意味着将使用匿名登录方法. both 意味着SASL匿名和匿名登录都允许. &lt;br /&gt;
&lt;br /&gt;
那些选项为每个虚拟主机定义的选项 host_config 参数 (见 [[Ejabberd2:安装和操作指南#虚拟主机|3.1.2]] 节).&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在所有虚拟主机上允许匿名登录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {auth_method, [anonymous]}.&lt;br /&gt;
      {anonymous_protocol, login_anon}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 类似前例, 但限于 public.example.org:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;public.example.org&amp;quot;, [{auth_method, [anonymous]},&lt;br /&gt;
                                           {anonymous_protocol, login_anon}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在一个虚拟主机允许匿名登录和内部验证:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;public.example.org&amp;quot;, [{auth_method, [internal,anonymous]},&lt;br /&gt;
                                           {anonymous_protocol, login_anon}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在一个虚拟主机允许SASL匿名:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;public.example.org&amp;quot;, [{auth_method, [anonymous]},&lt;br /&gt;
                                           {anonymous_protocol, sasl_anon}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在一个虚拟主机允许SASL匿名和匿名登录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;public.example.org&amp;quot;, [{auth_method, [anonymous]},&lt;br /&gt;
                                           {anonymous_protocol, both}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在一个虚拟主机允许SASL匿名, 匿名登录, 和内部验证:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {host_config, &amp;quot;public.example.org&amp;quot;, [{auth_method, [internal,anonymous]},&lt;br /&gt;
                                           {anonymous_protocol, both}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====PAM验证=====&lt;br /&gt;
&lt;br /&gt;
ejabberd支持通过可插拔的验证模块(PAM)来验证. PAM 目前在 AIX, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD 和 Solaris里都支持. PAM 验证缺省是被禁止的, 所以你不得不使用 PAM support enabled 选项来配置并编译ejabberd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure --enable-pam &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{pam_service, Name}'''&lt;br /&gt;
:这个选项定义了PAM服务名. 缺省是 &amp;quot;ejabberd&amp;quot;. 更多信息请参考你的操作系统的 PAM 文档. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, [pam]}.&lt;br /&gt;
{pam_service, &amp;quot;ejabberd&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
虽然很容易在ejabberd里配置PAM支持, PAM本身介绍了一些安全问题:&lt;br /&gt;
&lt;br /&gt;
* 为执行PAM验证，ejabberd使用名为 epam 的外部C程序. 缺省的, 它位于 /var/lib/ejabberd/priv/bin/ 目录. 在这个例子里，如果你的PAM模块要求root权限(例如pam_unix.so)，你不得不把它设为root可执行. 你也不得不为ejabberd赋予访问这个文件的权限，并移除所有其他权限. 以root权限执行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      chown root:ejabberd /var/lib/ejabberd/priv/bin/epam&lt;br /&gt;
      chmod 4750 /var/lib/ejabberd/priv/bin/epam&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 确保你已在你的系统安装了最新版本的PAM. 一些旧版本的PAM模块会导致内存溢出. 如果你不能使用最新版本, 你可以定期杀掉(1) epam 进程以减少它的内存消耗: ejabberd将立刻重启这个进程.&lt;br /&gt;
* epam程序在验证失败时尝试关闭延迟. 然而, 一些PAM模块忽略这个行为并依靠它们自己的配置选项. 你可以新建一个配置文件ejabberd.pam. 这个例子展示如何在pam_unix.so模块关闭延迟:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      #%PAM-1.0&lt;br /&gt;
      auth        sufficient  pam_unix.so likeauth nullok nodelay&lt;br /&gt;
      account     sufficient  pam_unix.so&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:这不是一个已准备好使用的配置文件: 当你建立你自己的PAM配置时，你必须示意使用它. 注意如果你想在PAM配置文见里设置在验证失败时禁止延迟, 你不得不限制访问这个文件, 这样恶意用户就不能使用你的配置来执行暴力攻击.&lt;br /&gt;
* 你可能希望只允许特定用户登录访问. pam_listfile.so 模块提供这个功能.&lt;br /&gt;
* 如果你使用 pam_winbind 来对一个Windows Active Directory授权, 那么 /etc/nssswitch.conf 必须被配置成使用winbind.&lt;br /&gt;
&lt;br /&gt;
====访问规则====&lt;br /&gt;
&lt;br /&gt;
=====ACL定义=====&lt;br /&gt;
&lt;br /&gt;
在ejabberd里访问控制是通过访问控制列表(ACLs)来实现的. 配置文件中ACLs的声明语法如下:&lt;br /&gt;
&lt;br /&gt;
'''{acl, ACLName, ACLValue}.'''&lt;br /&gt;
&lt;br /&gt;
ACLValue 可以是以下之一:&lt;br /&gt;
&lt;br /&gt;
'''all'''&lt;br /&gt;
:匹配所有JIDs. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, all, all}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{user, Username}'''&lt;br /&gt;
:匹配第一个虚拟主机，名字为 Username 的用户. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, admin, {user, &amp;quot;yozhik&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{user, Username, Server}'''&lt;br /&gt;
:匹配JID为Username@Server加任何资源的用户. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, admin, {user, &amp;quot;yozhik&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{server, Server}'''&lt;br /&gt;
:匹配从服务器Server来的任何JID. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, exampleorg, {server, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{resource, Resource}'''&lt;br /&gt;
:匹配任何资源为Resource的JID. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, mucklres, {resource, &amp;quot;muckl&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{shared_group, Groupname}'''&lt;br /&gt;
:匹配这个虚拟主机上的共享名册组Groupname的任何成员. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, techgroupmembers, {shared_group, &amp;quot;techteam&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{shared_group, Groupname, Server}'''&lt;br /&gt;
:匹配虚拟主机Server上的共享名册组Groupname的任何成员. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, techgroupmembers, {shared_group, &amp;quot;techteam&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{user_regexp, Regexp}'''&lt;br /&gt;
:匹配本地虚拟主机（们）上的任何名字符合Regexp的本地用户. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, tests, {user_regexp, &amp;quot;^test[0-9]*$&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{user_regexp, UserRegexp, Server}'''&lt;br /&gt;
:匹配服务器Server上名字符合UserRegexp的任何用户. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, tests, {user_Userregexp, &amp;quot;^test&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{server_regexp, Regexp}'''&lt;br /&gt;
:匹配来自符合server_regexp的服务器的任何JID. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, icq, {server_regexp, &amp;quot;^icq\\.&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{resource_regexp, Regexp}'''&lt;br /&gt;
:匹配资源符合resource_regexp的任何JID. 例子:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, icq, {resource_regexp, &amp;quot;^laptop\\.&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{node_regexp, UserRegexp, ServerRegexp}'''&lt;br /&gt;
:匹配任何名字符合ServerRegexp的服务器上的任何名字符合UserRegexp的用户. Example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {acl, yohzik, {node_regexp, &amp;quot;^yohzik$&amp;quot;, &amp;quot;^example.(com|org)$&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''{user_glob, Glob}'''&lt;br /&gt;
'''{user_glob, Glob, Server}'''&lt;br /&gt;
'''{server_glob, Glob}'''&lt;br /&gt;
'''{resource_glob, Glob}'''&lt;br /&gt;
'''{node_glob, UserGlob, ServerGlob}'''&lt;br /&gt;
:这和上面一样. 然而, 它使用 shell glob 模式而不是 regexp. 这些模式能拥有以下特别的字符:&lt;br /&gt;
&lt;br /&gt;
:'''*'''&lt;br /&gt;
::匹配任何包含null字符的字符串. &lt;br /&gt;
:'''    ?'''&lt;br /&gt;
::        匹配任何单个字符. &lt;br /&gt;
:'''    [...]'''&lt;br /&gt;
::匹配任何封闭的字符串. 字符范围由一对使用‘-’分割的字符串定义. 如果在 ‘[’之后的第一个字符是一个‘!’, 匹配任何不封闭的字符. &lt;br /&gt;
&lt;br /&gt;
以下 ACLName 是预定义的:&lt;br /&gt;
&lt;br /&gt;
'''all'''&lt;br /&gt;
:匹配任何JID. &lt;br /&gt;
'''none'''&lt;br /&gt;
:不匹配任何JID.&lt;br /&gt;
&lt;br /&gt;
=====访问权限=====&lt;br /&gt;
&lt;br /&gt;
一个允许或禁止访问不同服务的条目. 语法是:&lt;br /&gt;
&lt;br /&gt;
'''{access, AccessName, [ {allow|deny, ACLName}, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
当一个JID被检查到可以访问 Accessname, 服务器顺序检查是否那个 JID 匹配任何在列表里这一元组的第二个元素命名的 ACLs. 如果匹配, 返回第一个匹配的元组的第一个元素, 否则返回值‘deny’.&lt;br /&gt;
&lt;br /&gt;
如果你在一个虚拟主机定义了特定的访问权限, 记住全局定义的访问权限比它们拥有优先权. 这意味着, 当发生冲突的时候, 使用这个全局服务器上的赋予或禁止访问，而虚拟主机配置的访问控制无效.&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{access, configure, [{allow, admin}]}.&lt;br /&gt;
{access, something, [{deny, badmans},&lt;br /&gt;
                     {allow, all}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下 AccessName 是预定义的:&lt;br /&gt;
&lt;br /&gt;
'''all'''&lt;br /&gt;
:总是返回值‘allow’. &lt;br /&gt;
'''none'''&lt;br /&gt;
:总是返回值‘deny’.&lt;br /&gt;
&lt;br /&gt;
=====使用ACL限制打开的会话=====&lt;br /&gt;
&lt;br /&gt;
特别的 access max_user_sessions 定义了每个用户的会话(已验证的连接)的最大数量. 如果一个用户尝试通过使用不同的资源打开更多的会话, 第一个打开的会话将被断掉连接. 这个 会话替换 的错误信息将被发送到断链的会话. 这个选项的值可能是一个数字, 或 infinity. 缺省值是 infinity.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{access, max_user_sessions, [ {MaxNumber, ACLName}, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
这个例子对所有用户限制每用户会话数为5, 对管理员限制为 10:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{access, max_user_sessions, [{10, admin}, {5, all}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====使用ACL限制到一个远程XMPP服务器的多个连接=====&lt;br /&gt;
&lt;br /&gt;
特别的 access max_s2s_connections 定义了可以建立多少个连接到一个特定的远程XMPP服务器. 缺省值是 infinity. 也可以使用 access max_s2s_connections_per_node.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{access, max_s2s_connections, [ {MaxNumber, ACLName}, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
例子: &lt;br /&gt;
&lt;br /&gt;
* 允许每个远程服务器最多3个连接:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {access, max_s2s_connections, [{3, all}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====整形====&lt;br /&gt;
&lt;br /&gt;
整形允许你限制连接的通讯量. 语法是:&lt;br /&gt;
&lt;br /&gt;
'''{shaper, ShaperName, Kind}.'''&lt;br /&gt;
&lt;br /&gt;
目前只支持一种整形 maxrate . 语法如下:&lt;br /&gt;
&lt;br /&gt;
'''{maxrate, Rate}'''&lt;br /&gt;
&lt;br /&gt;
这里 Rate 代表最大允许每秒收到的字节数. 当一个连接超过了这个限制, ejabberd停止从socket读取，直到平均速率再次降到允许的最大值以下.&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 定义一个 shaper 名为 ‘normal’ ，限制流量速度为 1,000 bytes/second:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {shaper, normal, {maxrate, 1000}}.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 定义一个 shaper 名为‘fast’，限制流量速度为 50,000 bytes/second:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {shaper, fast, {maxrate, 50000}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====缺省语言====&lt;br /&gt;
&lt;br /&gt;
这个选项 language 定义服务器能被XMPP客户端看到的字符串的缺省语言. 如果一个XMPP客户端不支持 xml:lang, 将使用这里定义的语言.&lt;br /&gt;
&lt;br /&gt;
这个选项的语法是:&lt;br /&gt;
&lt;br /&gt;
'''{language, Language}.'''&lt;br /&gt;
&lt;br /&gt;
缺省值是 en. 为了让它生效，在ejabberd的 msgs 目录必须有一个翻译文件 Language.msg.&lt;br /&gt;
&lt;br /&gt;
例如, 设置俄语为缺省语言:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{language, &amp;quot;ru&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
附录 [[Ejabberd2:安装和操作指南#附录A 国际化和本地化|A]] 提供了关于国际化和本地化的更多细节.&lt;br /&gt;
&lt;br /&gt;
====CAPTCHA====&lt;br /&gt;
&lt;br /&gt;
一些ejabberd模块可被配置成在特定的动作上要求 CAPTCHA 挑战. 如果客户端不支持 CAPTCHA Forms ([http://xmpp.org/extensions/xep-0158.html XEP-0158]), 将提供一个web连接让用户用web浏览器填写挑战.&lt;br /&gt;
&lt;br /&gt;
提供了一个示例脚本使用 ImageMagick 的转换程序来生成图片 .&lt;br /&gt;
&lt;br /&gt;
配置选项为:&lt;br /&gt;
&lt;br /&gt;
'''{captcha_cmd, Path}'''&lt;br /&gt;
:一个生成图片的脚本的全路径. 缺省值为空: &amp;quot;&amp;quot; &lt;br /&gt;
'''{captcha_host, Host}'''&lt;br /&gt;
:发给用户的 URL 的 Host 部分. 你可以包含端口号. 发给用户的 URL 的格式为: http://Host/captcha/ ,缺省值是第一个被配置的主机名. &lt;br /&gt;
&lt;br /&gt;
另外, 必须允许一个 ejabberd_http 监听者拥有 captcha 选项. 见 [[Ejabberd2:安装和操作指南#监听的模块|3.1.3]] 节.&lt;br /&gt;
&lt;br /&gt;
示例配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
&lt;br /&gt;
{captcha_cmd, &amp;quot;/lib/ejabberd/priv/bin/captcha.sh&amp;quot;}.&lt;br /&gt;
{captcha_host, &amp;quot;example.org:5280&amp;quot;}.&lt;br /&gt;
&lt;br /&gt;
{listen,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {5280, ejabberd_http, [&lt;br /&gt;
                         captcha,&lt;br /&gt;
                         ...&lt;br /&gt;
                        ]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====STUN====&lt;br /&gt;
&lt;br /&gt;
ejabberd可以当作一个独立的 STUN 服务器 ([http://tools.ietf.org/html/rfc5389 RFC 5389]). 目前只支持绑定的使用. 在那个角色中，ejabberd 帮助客户端实现 Jingle ICE ([http://xmpp.org/extensions/xep-0176.html XEP-0176]) 支持来发现它们的外部地址和端口.&lt;br /&gt;
&lt;br /&gt;
你应该配置 ejabberd_stun 监听模块，如 [[Ejabberd2:安装和操作指南#监听端口|3.1.3]] 节所述. 如果定义了 certfile 选项, ejabberd 在同一个端口复用TCP连接和通过TCP连接的TLS . 很明显, certfile选项仅为tcp定义. 注意无论如何，支持 TCP 或 TLS over TCP ,对于绑定使用来说不是必需的，对于TURN功能是保留的. 只有udp传输可以随意配置.&lt;br /&gt;
&lt;br /&gt;
示例配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{listen,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {{3478, udp}, ejabberd_stun, []},&lt;br /&gt;
  {3478, ejabberd_stun, []},&lt;br /&gt;
  {5349, ejabberd_stun, [{certfile, &amp;quot;/etc/ejabberd/server.pem&amp;quot;}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]&lt;br /&gt;
}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你也需要正确地配置 DNS SRV 记录，这样客户端可以很容易地发现一个为你的XMPP域服务的 STUN 服务器. 具体请参考[http://tools.ietf.org/html/rfc5389 RFC 5389]的[http://tools.ietf.org/html/rfc5389#section-9 DNS Discovery of a Server] 章节.&lt;br /&gt;
&lt;br /&gt;
示例 DNS SRV 配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
_stun._udp   IN SRV  0 0 3478 stun.example.com.&lt;br /&gt;
_stun._tcp   IN SRV  0 0 3478 stun.example.com.&lt;br /&gt;
_stuns._tcp  IN SRV  0 0 5349 stun.example.com.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====包含其它配置文件====&lt;br /&gt;
&lt;br /&gt;
一个配置文件中的选项 include_config_file 代表 ejabberd 包含了其他配置文件to include other configuration files immediately.&lt;br /&gt;
&lt;br /&gt;
基本语法:&lt;br /&gt;
&lt;br /&gt;
'''{include_config_file, Filename}.'''&lt;br /&gt;
&lt;br /&gt;
使用完整语法还可以指定子选项 suboptions :&lt;br /&gt;
&lt;br /&gt;
'''{include_config_file, Filename, [Suboption, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
filename 可使用绝对路径, 或使用和主 ejabberd 配置文件相关的相对路径. 不能使用通配符. 文件必须存在且可读.&lt;br /&gt;
&lt;br /&gt;
以下子选项 suboptions 为:&lt;br /&gt;
&lt;br /&gt;
'''{disallow, [Optionname, ...]}'''&lt;br /&gt;
:不允许使用那些被包含文件中的选项. 满足这个条件的选项立刻变成不可接受. 缺省值为空列表: [] &lt;br /&gt;
'''{allow_only, [Optionname, ...]}'''&lt;br /&gt;
:只允许使用这个被包含的配置文件中的选项. 不满足这个条件的选项立刻变成不可接受. 缺省值为: all &lt;br /&gt;
&lt;br /&gt;
这是个基本例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{include_config_file, &amp;quot;/etc/ejabberd/additional.cfg&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子里, 被包含的文件不允许包含一个监听 listen 选项. 如果出现了这个选项, 该选项将不被接受. 这个文件在主配置文件所在目录的一个子目录中.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{include_config_file, &amp;quot;./example.org/additional_not_listen.cfg&amp;quot;, [{disallow, [listen]}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在这个例子, ejabberd.cfg 定义了一些 ACL 和 Access rules, 然后包含了另一个文件,里面含有其他 rules:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{acl, admin, {user, &amp;quot;admin&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
{access, announce, [{allow, admin}]}.&lt;br /&gt;
{include_config_file, &amp;quot;/etc/ejabberd/acl_and_access.cfg&amp;quot;, [{allow_only, [acl, access]}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且文件 acl_and_access.cfg 的内容可能是, 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{acl, admin, {user, &amp;quot;bob&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
{acl, admin, {user, &amp;quot;jan&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====配置文件中的宏选项====&lt;br /&gt;
&lt;br /&gt;
在ejabberd配置文件中, 有可能为一个值定义一个宏 macro,晚些时候使用这个宏定义一个选项.&lt;br /&gt;
&lt;br /&gt;
一个宏 macro 可用以下语法定义:&lt;br /&gt;
&lt;br /&gt;
'''{define_macro, ’MACRO’, Value}.'''&lt;br /&gt;
&lt;br /&gt;
MACRO 必须被一对单引号包住, 而且所有字母为大写; 检查以下例子. 值必须是任何合法的随意的 Erlang 条目.&lt;br /&gt;
&lt;br /&gt;
macro的第一个定义会被保留的, 同一个macro的其它定义被忽略.&lt;br /&gt;
&lt;br /&gt;
Macros 在包含了额外的配置文件之后会被处理, 所以有可能在知道用法之前就使用定义在被包含的配置文件里的 macros.&lt;br /&gt;
&lt;br /&gt;
不能使用定义在另一个macro里面的macro.&lt;br /&gt;
&lt;br /&gt;
有两个办法使用宏:&lt;br /&gt;
&lt;br /&gt;
'''’MACRO’'''&lt;br /&gt;
:你可以把它当成一个 ejabberd 选项的值, 它将被替换成这个macro之前定义的值. 如果这个 macro 之前没有定义, 程序将崩溃并报错.&lt;br /&gt;
'''{use_macro, ’MACRO’, Defaultvalue}'''&lt;br /&gt;
:使用一个macro,即使它之前没有定义. 如果这个 macro 之前没有定义, 使用缺省值 defaultvalue. 这个用法看起来好像它已被定义并以以下方法使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {define_macro, 'MACRO', Defaultvalue}.&lt;br /&gt;
    'MACRO'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这个例子展示一个宏的基本使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{define_macro, 'LOG_LEVEL_NUMBER', 5}.&lt;br /&gt;
{loglevel, 'LOG_LEVEL_NUMBER'}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
结果被ejabberd解释执行的选项为: {loglevel, 5}.&lt;br /&gt;
&lt;br /&gt;
这个例子展示值可以是任意的Erlang条目:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{define_macro, 'USERBOB', {user, &amp;quot;bob&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
{acl, admin, 'USERBOB'}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
结果被ejabberd解释执行的选项为: {acl, admin, {user, &amp;quot;bob&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
这个复杂的例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{define_macro, 'NUMBER_PORT_C2S', 5222}.&lt;br /&gt;
{define_macro, 'PORT_S2S_IN', {5269, ejabberd_s2s_in, []}}.&lt;br /&gt;
{listen,&lt;br /&gt;
 [&lt;br /&gt;
  {'NUMBER_PORT_C2S', ejabberd_c2s, []},&lt;br /&gt;
  'PORT_S2S_IN',&lt;br /&gt;
  {{use_macro, 'NUMBER_PORT_HTTP', 5280}, ejabberd_http, []}&lt;br /&gt;
 ]&lt;br /&gt;
}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在解释执行之后结果为:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{listen,&lt;br /&gt;
 [&lt;br /&gt;
  {5222, ejabberd_c2s, []},&lt;br /&gt;
  {5269, ejabberd_s2s_in, []},&lt;br /&gt;
  {5280, ejabberd_http, []}&lt;br /&gt;
 ]&lt;br /&gt;
}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===数据库和LDAP配置===&lt;br /&gt;
&lt;br /&gt;
ejabberd缺省使用它内部的 Mnesia 数据库. 然而, 也可能使用关系数据库或一个LDAP服务器来存储持久信息, 长时间存在的数据. ejabberd是非常弹性的: 你可以为不同的虚拟主机配置不同的验证方法, 你可以为相同的主机配置不同的验证机制(fallback), 你可以为模块设置不同的存储系统, 此外.&lt;br /&gt;
&lt;br /&gt;
ejabberd支持以下数据库:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/sql/ Microsoft SQL Server]&lt;br /&gt;
* [http://www.erlang.org/doc/apps/mnesia/index.html Mnesia]&lt;br /&gt;
* [http://www.mysql.com/ MySQL]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Open_Database_Connectivity 任何ODBC兼容数据库]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
&lt;br /&gt;
以下 LDAP 服务器已经过ejabberd测试:&lt;br /&gt;
&lt;br /&gt;
* [http://www.microsoft.com/activedirectory/ Active Directory] (见 [[Ejabberd2:安装和操作指南#Active Directory|3.2.5]] 节)&lt;br /&gt;
* [http://www.openldap.org/ OpenLDAP]&lt;br /&gt;
* 通常任何LDAP兼容服务器都应该可以; 通知我们关于你以不在列表中的服务器的成功例子以便我们列在这里. &lt;br /&gt;
&lt;br /&gt;
关于虚拟主机，特别注意: 如果你在ejabberd.cfg (见 [[Ejabberd2:安装和操作指南#主机名|3.1.1]] 节) 定义了多个域, 你可能希望每个虚拟主机配置不同的数据库, 验证和存储, 这样在两个虚拟主机之间用户名就不会冲突和混淆. 为此, 下一节的选项描述了必须在每个虚拟主机的 host_config 内部配置 (见 [[Ejabberd2:安装和操作指南#虚拟主机|3.1.2]] 节). 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{host_config, &amp;quot;public.example.org&amp;quot;, [&lt;br /&gt;
  {odbc_server, {pgsql, &amp;quot;localhost&amp;quot;, &amp;quot;database-public-example-org&amp;quot;, &amp;quot;ejabberd&amp;quot;, &amp;quot;password&amp;quot;}},&lt;br /&gt;
  {auth_method, [odbc]}&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====MySQL====&lt;br /&gt;
&lt;br /&gt;
尽管这一节将描述当你想使用原生的 MySQL驱动时 ejabberd 的配置, 它将不描述MySQL的安装和数据库的建立. 查看MySQL文档和教程 [http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver 在ejabberd使用MySQL原生驱动] 获得关于这些话题的信息. 注意该教程中包含的关于ejabberd的配置和本节是重复的.&lt;br /&gt;
&lt;br /&gt;
而且, 目录 src/odbc 中的文件 mysql.sql 可能你会感兴趣. 这个文件包含ejabberd用于MySQL的schema. 该文件的结尾你可找到更新你的数据库架构schema的信息.&lt;br /&gt;
&lt;br /&gt;
=====驱动编译=====&lt;br /&gt;
&lt;br /&gt;
你可忽略此步骤，如果你已经使用ejabberd的二进制包安装了ejabberd，并使用了内含的MySQL支持.&lt;br /&gt;
&lt;br /&gt;
# 首先, 安装 [http://support.process-one.net/doc/display/CONTRIBS/Yxa Erlang MySQL 库]. 确保被编译的文件在你的 Erlang 路径中; 你可以把它们放到和你的ejabberd .beam 文件相同的目录.&lt;br /&gt;
# 然后, 以允许支持 ODBC 的选项配置并安装 ejabberd (这也需要原生 MySQL 支持!). 为此, 使用以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-odbc &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====数据库连接=====&lt;br /&gt;
&lt;br /&gt;
实际的数据库访问使用选项 odbc_server 来定义. 它的值通常用来定义我们是否想使用 ODBC, 或两个可用的原生接口之一, PostgreSQL 或 MySQL.&lt;br /&gt;
&lt;br /&gt;
为使用原生 MySQL 接口, 你可以通过一组如以下格式的参数:&lt;br /&gt;
&lt;br /&gt;
'''{mysql, &amp;quot;Server&amp;quot;, &amp;quot;Database&amp;quot;, &amp;quot;Username&amp;quot;, &amp;quot;Password&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
mysql是一个关键字应该被保持. 例如:&lt;br /&gt;
&lt;br /&gt;
'''{odbc_server, {mysql, &amp;quot;localhost&amp;quot;, &amp;quot;test&amp;quot;, &amp;quot;root&amp;quot;, &amp;quot;password&amp;quot;}}.'''&lt;br /&gt;
&lt;br /&gt;
可选的, 有可能定义MySQL使用的端口. 这个选项只是在非常少的情况下有用, 当你没有以缺省端口设置来运行MySQL时. mysql参数可能是以下格式:&lt;br /&gt;
&lt;br /&gt;
'''{mysql, &amp;quot;Server&amp;quot;, Port, &amp;quot;Database&amp;quot;, &amp;quot;Username&amp;quot;, &amp;quot;Password&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
Port值应该是一个整数, 没有引号. 例如:&lt;br /&gt;
&lt;br /&gt;
'''{odbc_server, {mysql, &amp;quot;localhost&amp;quot;, Port, &amp;quot;test&amp;quot;, &amp;quot;root&amp;quot;, &amp;quot;password&amp;quot;}}.'''&lt;br /&gt;
&lt;br /&gt;
缺省的ejabberd为每个虚拟主机打开10个到数据库的连接. 使用这个选项来修改该值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_pool_size, 10}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你可以配置一个时间间隔来做一个假的SQL请求以保持到数据库的连接激活. 缺省值为 ’undefined’, 所以没有做 keepalive 请求. 指定以秒计: 例如 28800 意味着 8 小时.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_keepalive_interval, undefined}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果到数据库的连接失败, ejabberd在重试之前等待30秒. 你可以这个选项修改这个间隔:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_start_interval, 30}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====验证=====&lt;br /&gt;
&lt;br /&gt;
这个选项值的名字可能被误导, 因为 auth_method 名字用于通过ODBC以及通过原生MySQL接口访问关系数据库. 无论如何, 第一个配置步骤是定义 odbc auth_method. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, [odbc]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====存储=====&lt;br /&gt;
&lt;br /&gt;
MySQL也能被从多个ejabberd模块用于存储信息. 见 [[Ejabberd2:安装和操作指南#模块一览|3.3.1]] 节看哪个模块有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于类似MySQL的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!&lt;br /&gt;
&lt;br /&gt;
====Microsoft SQL Server====&lt;br /&gt;
&lt;br /&gt;
尽管本节将描述当你想使用Microsoft SQL Server时ejabberd的配置, 它不描述Microsoft SQL Server的安装和数据库创建. 查看MySQL文档和教程 [http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver 在ejabberd使用MySQL原生驱动] 获得关于这些话题的信息. 注意该教程中包含的关于ejabberd的配置和本节是重复的.&lt;br /&gt;
&lt;br /&gt;
而且, 目录 src/odbc 中的文件 mssql.sql 可能你会感兴趣. 这个文件包含ejabberd用于Microsoft SQL Server的schema. 该文件的结尾你可找到更新你的数据库架构schema的信息.&lt;br /&gt;
&lt;br /&gt;
=====驱动编译=====&lt;br /&gt;
&lt;br /&gt;
你可忽略此步骤，如果你已经使用ejabberd的二进制包安装了ejabberd，并使用了内含的ODBC支持.&lt;br /&gt;
&lt;br /&gt;
如果你想以ODBC方式使用Microsoft SQL Server, 你需要以支持ODBC和允许Microsoft SQL Server选项来配置, 编译和安装 ejabberd. 为此, 使用以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
./configure --enable-odbc --enable-mssql &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====数据库连接=====&lt;br /&gt;
&lt;br /&gt;
一个Microsoft SQL Server数据库连接的配置和为一个ODBC兼容服务器的配置相同 (见 [[Ejabberd2:安装和操作指南#ODBC兼容|3.2.4]] 节).&lt;br /&gt;
&lt;br /&gt;
=====验证=====&lt;br /&gt;
&lt;br /&gt;
一个Microsoft SQL Server数据库验证的配置和为一个ODBC兼容服务器的配置相同 (见 [[Ejabberd2:安装和操作指南#ODBC兼容|3.2.4]] 节).&lt;br /&gt;
&lt;br /&gt;
=====存储=====&lt;br /&gt;
&lt;br /&gt;
Microsoft SQL Server也可以被多个ejabberd模块用于存储信息. 见 [[Ejabberd2:安装和操作指南#模块一览|3.3.1]] 节看看哪个模块有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于类似Microsoft SQL Server的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!&lt;br /&gt;
&lt;br /&gt;
====PostgreSQL====&lt;br /&gt;
&lt;br /&gt;
尽管本节将描述当你想使用原生的PostgreSQL驱动时ejabberd的配置, 它不描述PostgreSQL的安装和数据库创建. 查看PostgreSQL文档和教程 [http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver 在ejabberd使用MySQL原生驱动] 获得关于这些话题的信息. 注意该教程中包含的关于ejabberd的配置和本节是重复的.&lt;br /&gt;
&lt;br /&gt;
而且, 目录 src/odbc 中的文件 pg.sql 可能你会感兴趣. 这个文件包含ejabberd用于PostgreSQL的schema. 该文件的结尾你可找到更新你的数据库架构schema的信息.&lt;br /&gt;
&lt;br /&gt;
=====驱动编译=====&lt;br /&gt;
&lt;br /&gt;
你可忽略此步骤，如果你已经使用ejabberd的二进制包安装了ejabberd，并包含了对PostgreSQL的支持.&lt;br /&gt;
&lt;br /&gt;
# 首先, 从 [http://www.ejabberd.im/ejabberd-modules/  ejabberd-modules SVN 仓库]安装 Erlang pgsql 库. 确保被编译的文件在你的 Erlang 路径中; 你可以把它们放到和你的ejabberd .beam 文件相同的目录.&lt;br /&gt;
# 然后, 以允许支持 ODBC 的选项配置并安装 ejabberd (对于原生的 PostgreSQL 支持这也是必需的!). 为此, 使用以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-odbc &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====数据库连接=====&lt;br /&gt;
&lt;br /&gt;
实际的数据库访问使用选项 odbc_server 来定义. 它的值通常用来定义我们是否想使用 ODBC, 或两个可用的原生接口之一, PostgreSQL 或 MySQL.&lt;br /&gt;
&lt;br /&gt;
为使用原生 PostgreSQL 接口, 你可以通过一组如以下格式的参数:&lt;br /&gt;
&lt;br /&gt;
'''{pgsql, &amp;quot;Server&amp;quot;, &amp;quot;Database&amp;quot;, &amp;quot;Username&amp;quot;, &amp;quot;Password&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
pgsql是一个关键字应该被保持. 例如:&lt;br /&gt;
&lt;br /&gt;
'''{odbc_server, {pgsql, &amp;quot;localhost&amp;quot;, &amp;quot;database&amp;quot;, &amp;quot;ejabberd&amp;quot;, &amp;quot;password&amp;quot;}}.'''&lt;br /&gt;
&lt;br /&gt;
可选的, 有可能定义PostgreSQL使用的端口. 这个选项只是在非常少的情况下有用, 当你没有以缺省端口设置来运行PostgreSQL时. pgsql参数可能是以下格式:&lt;br /&gt;
&lt;br /&gt;
'''{pgsql, &amp;quot;Server&amp;quot;, Port, &amp;quot;Database&amp;quot;, &amp;quot;Username&amp;quot;, &amp;quot;Password&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
Port值应该是一个整数, 没有引号. 例如:&lt;br /&gt;
&lt;br /&gt;
'''{odbc_server, {pgsql, &amp;quot;localhost&amp;quot;, 5432, &amp;quot;database&amp;quot;, &amp;quot;ejabberd&amp;quot;, &amp;quot;password&amp;quot;}}.'''&lt;br /&gt;
&lt;br /&gt;
缺省的ejabberd为每个虚拟主机打开10个到数据库的连接. 使用这个选项来修改该值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_pool_size, 10}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你可以配置一个时间间隔来做一个假的SQL请求以保持到数据库的连接激活. 缺省值为 ’undefined’, 所以没有做 keepalive 请求. 指定以秒计: 例如 28800 意味着 8 小时.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_keepalive_interval, undefined}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====验证=====&lt;br /&gt;
&lt;br /&gt;
这个选项值的名字可能被误导, 因为 auth_method 名字用于通过ODBC以及通过原生PostgreSQL接口访问关系数据库. 无论如何, 第一个配置步骤是定义 odbc auth_method. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, [odbc]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====存储=====&lt;br /&gt;
&lt;br /&gt;
PostgreSQL也能被多个ejabberd模块用于存储信息. 见 [[Ejabberd2:安装和操作指南#模块一览|3.3.1]] 节看哪个模块有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于类似PostgreSQL的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!&lt;br /&gt;
&lt;br /&gt;
====ODBC兼容====&lt;br /&gt;
&lt;br /&gt;
尽管本节将描述当你想使用原生的ODBC 驱动时ejabberd的配置, 它不描述安装和数据库创建. 查看你的数据库的文档. 教程 [http://support.process-one.net/doc/display/MESSENGER/Using+ejabberd+with+MySQL+native+driver 在ejabberd使用MySQL原生驱动] 也会对你有所帮助. 注意该教程中包含的关于ejabberd的配置和本节是重复的.&lt;br /&gt;
&lt;br /&gt;
=====驱动编译=====&lt;br /&gt;
&lt;br /&gt;
你可忽略此步骤，如果你已经使用ejabberd的二进制包安装了ejabberd，并包含了对ODBC的支持.&lt;br /&gt;
&lt;br /&gt;
# 首先, 安装 [http://support.process-one.net/doc/display/CONTRIBS/Yxa Erlang MySQL 库] . 确保被编译的文件在你的 Erlang 路径中; 你可以把它们放到和你的ejabberd .beam 文件相同的目录.&lt;br /&gt;
# 然后, 以允许支持 ODBC 的选项配置并安装 ejabberd. 为此, 使用以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ./configure --enable-odbc &amp;amp;&amp;amp; make install&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====数据库连接=====&lt;br /&gt;
&lt;br /&gt;
实际的数据库访问使用选项 odbc_server 来定义. 它的值通常用来定义我们是否想使用 ODBC, 或两个可用的原生接口之一, PostgreSQL 或 MySQL.&lt;br /&gt;
&lt;br /&gt;
通过ODBC使用数据库, 你可以通过一个ODBC连接字符串作为odbc_server参数. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_server, &amp;quot;DSN=database;UID=ejabberd;PWD=password&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
缺省的ejabberd为每个虚拟主机打开10个到数据库的连接. 使用这个选项来修改该值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_pool_size, 10}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你可以配置一个时间间隔来做一个假的SQL请求以保持到数据库的连接激活. 缺省值为 ’undefined’, 所以没有做 keepalive 请求. 指定以秒计: 例如 28800 意味着 8 小时.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{odbc_keepalive_interval, undefined}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====验证=====&lt;br /&gt;
&lt;br /&gt;
第一个配置步骤是定义 odbc auth_method. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, [odbc]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====存储=====&lt;br /&gt;
&lt;br /&gt;
一个ODBC兼容数据库也能被多个ejabberd模块用于存储信息. 见 [[Ejabberd2:安装和操作指南#模块一览|3.3.1]] 节看哪个模块有一个带‘_odbc’的版本. 这个后缀代表这个模块可以被用于ODBC兼容的关系数据库. 为激活你的数据库的存储, 只要确保你的数据库运行正常 (见前一节), 并把不带后缀或ldap模块变量换成带有 odbc 的模块变量. 注意在同一个装载的模块里你不能有多个变量!&lt;br /&gt;
&lt;br /&gt;
====LDAP====&lt;br /&gt;
&lt;br /&gt;
ejabberd拥有内建的LDAP支持. 你可以通过LDAP服务器验证用户并使用LDAP目录作为vCard存储器. 共享名册还不支持.&lt;br /&gt;
&lt;br /&gt;
通常ejabberd把LDAP看作一个只读存储: 它可能察看数据, 但不能新建账号或修改存储在LDAP里的vCard. 然而, 修改密码是可能的，如果允许 mod_register 模块并且LDAP服务器支持[http://tools.ietf.org/html/rfc3062 RFC 3062].&lt;br /&gt;
&lt;br /&gt;
=====连接=====&lt;br /&gt;
&lt;br /&gt;
参数:&lt;br /&gt;
&lt;br /&gt;
'''{ldap_servers, [Servers, ...]}'''&lt;br /&gt;
:你的LDAP服务器的IP地址或DNS名的列表 . 这个选项时必需的. &lt;br /&gt;
'''{ldap_encrypt, none|tls}'''&lt;br /&gt;
:到LDAP服务器的连接的加密类型. 允许的值为: none, tls. 这个值 tls 允许使用SSL加密LDAP连接. 注意 STARTTLS 加密是不支持的. 缺省值为: none. &lt;br /&gt;
'''{ldap_tls_verify, false|soft|hard}'''&lt;br /&gt;
:这个选项指定当允许TLS时是否验证LDAP服务器证书. 当选项值为 hard，如果证书非法，ejabberd 不继续往下走. 当选项值为 soft，即使检查失败ejabberd仍继续下去. 缺省值为 false，它意味着不执行检查. &lt;br /&gt;
'''{ldap_port, Number}'''&lt;br /&gt;
:连接到你的LDAP服务器的端口. 如果禁止加密,缺省端口为389; 如果允许加密则为636. 如果你配置了一个值, 它存储在 ejabberd的数据库里. 接着, 如果你从这个配置文件移除这个值, 之前存储在数据库的值将被缺省端口取代. &lt;br /&gt;
'''{ldap_rootdn, RootDN}'''&lt;br /&gt;
:绑定的DN. 缺省值为&amp;quot;&amp;quot;, 它表示匿名连接 ‘anonymous connection’. &lt;br /&gt;
'''{ldap_password, Password}'''&lt;br /&gt;
:绑定密码 password. 缺省值为 &amp;quot;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, ldap}.&lt;br /&gt;
{ldap_servers, [&amp;quot;ldap.example.org&amp;quot;]}.&lt;br /&gt;
{ldap_port, 389}.&lt;br /&gt;
{ldap_rootdn, &amp;quot;cn=Manager,dc=domain,dc=org&amp;quot;}.&lt;br /&gt;
{ldap_password, &amp;quot;secret&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意目前的LDAP实现不支持SASL验证.&lt;br /&gt;
&lt;br /&gt;
=====验证=====&lt;br /&gt;
&lt;br /&gt;
你可以通过LDAP目录验证用户. 可用的选项有:&lt;br /&gt;
&lt;br /&gt;
'''{ldap_base, Base}'''&lt;br /&gt;
:LDAP存储用户的帐号的基础目录. 这个选项是必需的. &lt;br /&gt;
'''{ldap_uids, [ {ldap_uidattr} | {ldap_uidattr, ldap_uidattr_format}, ...]}'''&lt;br /&gt;
:从中可以获得JID的LDAP属性的列表. 缺省属性为 [{&amp;quot;uid&amp;quot;, &amp;quot;%u&amp;quot;}]. 属性的格式为: [{ldap_uidattr}] 或 [{ldap_uidattr, ldap_uidattr_format}]. 你可以使用多个逗号来分隔需要的属性. ldap_uidattr 和 ldap_uidattr_format 的值描述如下:&lt;br /&gt;
&lt;br /&gt;
:'''ldap_uidattr'''&lt;br /&gt;
::存有JID的user部分的LDAP属性. 缺省值为&amp;quot;uid&amp;quot;. &lt;br /&gt;
:'''ldap_uidattr_format'''&lt;br /&gt;
::ldap_uidattr变量的格式. 这个格式必须包含一个并且只有一个 pattern 变量 &amp;quot;%u&amp;quot;，它将由JID的suer部分替换. 例如,&amp;quot;%u@example.org&amp;quot;. 缺省值为 &amp;quot;%u&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
'''{ldap_filter, Filter}'''&lt;br /&gt;
:[http://tools.ietf.org/html/rfc4515 RFC 4515] LDAP过滤器. 缺省的 Filter 值为: undefined. 例子: &amp;quot;(&amp;amp;(objectClass=shadowAccount)(memberOf=Jabber Users))&amp;quot;. 请, 不要忘记关闭括号并且不要用多余的空格. 在过滤器里你也必须不使用ldap_uidattr属性，因为这个属性将被LDAP filter自动取代. &lt;br /&gt;
'''{ldap_dn_filter, { Filter, FilterAttrs }}'''&lt;br /&gt;
:应用于主过滤器返回的结果的过滤器. 这个filter执行额外的LDAP搜索以得到完整的结果. 当你无法在ldap_filter里定义所有filter rule时这是有用的. 你可以在Filter定义 &amp;quot;%u&amp;quot;, &amp;quot;%d&amp;quot;, &amp;quot;%s&amp;quot; and &amp;quot;%D&amp;quot; pattern 变量: &amp;quot;%u&amp;quot; 被用户的JID的user部分替代, &amp;quot;%d&amp;quot; 被相应的域(虚拟主机)替代, 所有 &amp;quot;%s&amp;quot; 变量被FilterAttrs属性值连续地替代，&amp;quot;%D&amp;quot; 被 Distinguished Name(DN) 替代. 缺省的，ldap_dn_filter 为 undefined. 例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {ldap_dn_filter, {&amp;quot;(&amp;amp;(name=%s)(owner=%D)(user=%u@%d))&amp;quot;, [&amp;quot;sn&amp;quot;]}}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:因为这个filter做了额外的LDAP lookups, 只在最后排序时使用它: 如果可能，尝试在 ldap_filter里定义所有 filter rules . &lt;br /&gt;
'''{ldap_local_filter, Filter}'''&lt;br /&gt;
:如果因为性能原因 (该 LDAP 服务器有很多注册用户)你不能使用 ldap_filter , 你可以使用这个本地 filter. local filter 在ejabberd检查一个属性, 而不是 LDAP, 所以限制了这个LDAP目录的负载. 缺省 filter 是: undefined. 示例值:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {ldap_local_filter, {notequal, {&amp;quot;accountStatus&amp;quot;,[&amp;quot;disabled&amp;quot;]}}}.&lt;br /&gt;
    {ldap_local_filter, {equal, {&amp;quot;accountStatus&amp;quot;,[&amp;quot;enabled&amp;quot;]}}}.&lt;br /&gt;
    {ldap_local_filter, undefined}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====示例=====&lt;br /&gt;
&lt;br /&gt;
======普通示例======&lt;br /&gt;
&lt;br /&gt;
让我们以 ldap.example.org 作为我们的 LDAP 服务器名. 我们在 &amp;quot;ou=Users,dc=example,dc=org&amp;quot; 目录使用他们的密码. 同时我们有 addressbook, 在 &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot; 目录它包含了用户的 emails 和他们的其他信息 . 到LDAP服务器的连接使用TLS加密, 并且使用自定义端口 6123. 相应的验证节应该看起来象这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
%% Authentication method&lt;br /&gt;
{auth_method, ldap}.&lt;br /&gt;
%% DNS name of our LDAP server&lt;br /&gt;
{ldap_servers, [&amp;quot;ldap.example.org&amp;quot;]}.&lt;br /&gt;
%% Bind to LDAP server as &amp;quot;cn=Manager,dc=example,dc=org&amp;quot; with password &amp;quot;secret&amp;quot;&lt;br /&gt;
{ldap_rootdn, &amp;quot;cn=Manager,dc=example,dc=org&amp;quot;}.&lt;br /&gt;
{ldap_password, &amp;quot;secret&amp;quot;}.&lt;br /&gt;
{ldap_encrypt, tls}.&lt;br /&gt;
{ldap_port, 6123}.&lt;br /&gt;
%% Define the user's base&lt;br /&gt;
{ldap_base, &amp;quot;ou=Users,dc=example,dc=org&amp;quot;}.&lt;br /&gt;
%% We want to authorize users from 'shadowAccount' object class only&lt;br /&gt;
{ldap_filter, &amp;quot;(objectClass=shadowAccount)&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在我们想使用用户的 LDAP-info 作为他们的 vCards. 在我们的 LDAP schema定义了四个属性: &amp;quot;mail&amp;quot; — email地址, &amp;quot;givenName&amp;quot; — 名, &amp;quot;sn&amp;quot; — 姓, &amp;quot;birthDay&amp;quot; — 生日. 我们也想用户搜索到每个其他人. 我们看如何设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_vcard_ldap,&lt;br /&gt;
   [&lt;br /&gt;
    %% We use the same server and port, but want to bind anonymously because&lt;br /&gt;
    %% our LDAP server accepts anonymous requests to&lt;br /&gt;
    %% &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot; subtree.&lt;br /&gt;
    {ldap_rootdn, &amp;quot;&amp;quot;},&lt;br /&gt;
    {ldap_password, &amp;quot;&amp;quot;},&lt;br /&gt;
    %% define the addressbook's base&lt;br /&gt;
    {ldap_base, &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot;},&lt;br /&gt;
    %% uidattr: user's part of JID is located in the &amp;quot;mail&amp;quot; attribute&lt;br /&gt;
    %% uidattr_format: common format for our emails&lt;br /&gt;
    {ldap_uids, [{&amp;quot;mail&amp;quot;, &amp;quot;%u@mail.example.org&amp;quot;}]},&lt;br /&gt;
    %% We have to define empty filter here, because entries in addressbook does not&lt;br /&gt;
    %% belong to shadowAccount object class&lt;br /&gt;
    {ldap_filter, &amp;quot;&amp;quot;},&lt;br /&gt;
    %% Now we want to define vCard pattern&lt;br /&gt;
    {ldap_vcard_map,&lt;br /&gt;
     [{&amp;quot;NICKNAME&amp;quot;, &amp;quot;%u&amp;quot;, []}, % just use user's part of JID as his nickname&lt;br /&gt;
      {&amp;quot;GIVEN&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;givenName&amp;quot;]},&lt;br /&gt;
      {&amp;quot;FAMILY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;sn&amp;quot;]},&lt;br /&gt;
      {&amp;quot;FN&amp;quot;, &amp;quot;%s, %s&amp;quot;, [&amp;quot;sn&amp;quot;, &amp;quot;givenName&amp;quot;]}, % example: &amp;quot;Smith, John&amp;quot;&lt;br /&gt;
      {&amp;quot;EMAIL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;mail&amp;quot;]},&lt;br /&gt;
      {&amp;quot;BDAY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;birthDay&amp;quot;]}]},&lt;br /&gt;
    %% Search form&lt;br /&gt;
    {ldap_search_fields,&lt;br /&gt;
     [{&amp;quot;User&amp;quot;, &amp;quot;%u&amp;quot;},&lt;br /&gt;
      {&amp;quot;Name&amp;quot;, &amp;quot;givenName&amp;quot;},&lt;br /&gt;
      {&amp;quot;Family Name&amp;quot;, &amp;quot;sn&amp;quot;},&lt;br /&gt;
      {&amp;quot;Email&amp;quot;, &amp;quot;mail&amp;quot;},&lt;br /&gt;
      {&amp;quot;Birthday&amp;quot;, &amp;quot;birthDay&amp;quot;}]},&lt;br /&gt;
    %% vCard fields to be reported&lt;br /&gt;
    %% Note that JID is always returned with search results&lt;br /&gt;
    {ldap_search_reported,&lt;br /&gt;
     [{&amp;quot;Full Name&amp;quot;, &amp;quot;FN&amp;quot;},&lt;br /&gt;
      {&amp;quot;Nickname&amp;quot;, &amp;quot;NICKNAME&amp;quot;},&lt;br /&gt;
      {&amp;quot;Birthday&amp;quot;, &amp;quot;BDAY&amp;quot;}]}&lt;br /&gt;
  ]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意 mod_vcard_ldap 模块在LDAP搜索用户的信息之前会先检查用户是否存在.&lt;br /&gt;
&lt;br /&gt;
======Active Directory======&lt;br /&gt;
&lt;br /&gt;
Active Directory 只是一个预定义属性的LDAP-服务器. 示范配置如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{auth_method, ldap}.&lt;br /&gt;
{ldap_servers, [&amp;quot;office.org&amp;quot;]}.    % List of LDAP servers&lt;br /&gt;
{ldap_base, &amp;quot;DC=office,DC=org&amp;quot;}. % Search base of LDAP directory&lt;br /&gt;
{ldap_rootdn, &amp;quot;CN=Administrator,CN=Users,DC=office,DC=org&amp;quot;}. % LDAP manager&lt;br /&gt;
{ldap_password, &amp;quot;*******&amp;quot;}. % Password to LDAP manager&lt;br /&gt;
{ldap_uids, [{&amp;quot;sAMAccountName&amp;quot;}]}.&lt;br /&gt;
{ldap_filter, &amp;quot;(memberOf=*)&amp;quot;}.&lt;br /&gt;
&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_vcard_ldap,&lt;br /&gt;
   [{ldap_vcard_map,&lt;br /&gt;
     [{&amp;quot;NICKNAME&amp;quot;, &amp;quot;%u&amp;quot;, []},&lt;br /&gt;
      {&amp;quot;GIVEN&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;givenName&amp;quot;]},&lt;br /&gt;
      {&amp;quot;MIDDLE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;initials&amp;quot;]},&lt;br /&gt;
      {&amp;quot;FAMILY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;sn&amp;quot;]},&lt;br /&gt;
      {&amp;quot;FN&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;displayName&amp;quot;]},&lt;br /&gt;
      {&amp;quot;EMAIL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;mail&amp;quot;]},&lt;br /&gt;
      {&amp;quot;ORGNAME&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;company&amp;quot;]},&lt;br /&gt;
      {&amp;quot;ORGUNIT&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;department&amp;quot;]},&lt;br /&gt;
      {&amp;quot;CTRY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;c&amp;quot;]},&lt;br /&gt;
      {&amp;quot;LOCALITY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;l&amp;quot;]},&lt;br /&gt;
      {&amp;quot;STREET&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;streetAddress&amp;quot;]},&lt;br /&gt;
      {&amp;quot;REGION&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;st&amp;quot;]},&lt;br /&gt;
      {&amp;quot;PCODE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;postalCode&amp;quot;]},&lt;br /&gt;
      {&amp;quot;TITLE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;title&amp;quot;]},&lt;br /&gt;
      {&amp;quot;URL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;wWWHomePage&amp;quot;]},&lt;br /&gt;
      {&amp;quot;DESC&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;description&amp;quot;]},&lt;br /&gt;
      {&amp;quot;TEL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;telephoneNumber&amp;quot;]}]},&lt;br /&gt;
    {ldap_search_fields,&lt;br /&gt;
     [{&amp;quot;User&amp;quot;, &amp;quot;%u&amp;quot;},&lt;br /&gt;
      {&amp;quot;Name&amp;quot;, &amp;quot;givenName&amp;quot;},&lt;br /&gt;
      {&amp;quot;Family Name&amp;quot;, &amp;quot;sn&amp;quot;},&lt;br /&gt;
      {&amp;quot;Email&amp;quot;, &amp;quot;mail&amp;quot;},&lt;br /&gt;
      {&amp;quot;Company&amp;quot;, &amp;quot;company&amp;quot;},&lt;br /&gt;
      {&amp;quot;Department&amp;quot;, &amp;quot;department&amp;quot;},&lt;br /&gt;
      {&amp;quot;Role&amp;quot;, &amp;quot;title&amp;quot;},&lt;br /&gt;
      {&amp;quot;Description&amp;quot;, &amp;quot;description&amp;quot;},&lt;br /&gt;
      {&amp;quot;Phone&amp;quot;, &amp;quot;telephoneNumber&amp;quot;}]},&lt;br /&gt;
    {ldap_search_reported,&lt;br /&gt;
     [{&amp;quot;Full Name&amp;quot;, &amp;quot;FN&amp;quot;},&lt;br /&gt;
      {&amp;quot;Nickname&amp;quot;, &amp;quot;NICKNAME&amp;quot;},&lt;br /&gt;
      {&amp;quot;Email&amp;quot;, &amp;quot;EMAIL&amp;quot;}]}&lt;br /&gt;
  ]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===模块配置===&lt;br /&gt;
&lt;br /&gt;
选项 modules 定义ejabberd启动后将被装载的模块的列表. 列表中的每个条目是一个组，第一个元素是一个模块的名称，第二个是一个模块列表的选项.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{modules, [ {ModuleName, ModuleOptions}, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在这个例子里只有模块 mod_echo 被装载宁且没有在方括号内定义该模块的选项:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        {mod_echo,      []}&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在第二个例子里不带选项地装载了模块 mod_echo, mod_time, 和 mod_version. 特别注意, 除了最后一个条目, 所有条目都以一个逗号结尾:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        {mod_echo,      []},&lt;br /&gt;
        {mod_time,      []},&lt;br /&gt;
        {mod_version,   []}&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====模块一览====&lt;br /&gt;
&lt;br /&gt;
下表列出ejabberd里的所有模块.&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!模块 !!功能	!!依赖&lt;br /&gt;
|-&lt;br /&gt;
|mod_adhoc	||特定命令 ([http://xmpp.org/extensions/xep-0050.html XEP-0050])	|| &lt;br /&gt;
|-&lt;br /&gt;
|mod_announce	||管理公告	||推荐 mod_adhoc&lt;br /&gt;
|-&lt;br /&gt;
|mod_caps	||实体能力 ([http://xmpp.org/extensions/xep-0115.html XEP-0115])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_configure	||使用特定命令配置服务器	||mod_adhoc&lt;br /&gt;
|-&lt;br /&gt;
|mod_disco	||服务发现 ([[XEP-0030]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_echo	||XMPP节回音	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_irc	        ||IRC网关	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_last	||最后活动 ([http://xmpp.org/extensions/xep-0012.html XEP-0012])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_last_odbc	||最后活动 ([http://xmpp.org/extensions/xep-0012.html XEP-0012])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_muc	||多用户聊天 ([[XEP-0045]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_muc_log	||多用户聊天室记录	||mod_muc&lt;br /&gt;
|-&lt;br /&gt;
|mod_offline	||离线消息存储 ([http://xmpp.org/extensions/xep-0160.html XEP-0160])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_offline_odbc	||离线消息存储 ([http://xmpp.org/extensions/xep-0160.html XEP-0160])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_ping	||XMPP Ping 和定期保持连接 ([http://xmpp.org/extensions/xep-0199.html XEP-0199])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_privacy	||禁止通讯 ([[RFC3921|XMPP IM]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_privacy_odbc	||禁止通讯 (([[RFC3921|XMPP IM]])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_private	||私有XML存储 ([http://xmpp.org/extensions/xep-0049.html XEP-0049])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_private_odbc	||私有XML存储 ([http://xmpp.org/extensions/xep-0049.html XEP-0049])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_proxy65	||SOCKS5字节流 ([[XEP-0065]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_pubsub	||发行-订阅 ([[XEP-0060]]), PEP ([[XEP-0163]])	||mod_caps&lt;br /&gt;
|-&lt;br /&gt;
|mod_pubsub_odbc	||发行-订阅 ([[XEP-0060]]), PEP ([[XEP-0163]])	||支持的数据库 (*) 和 mod_caps&lt;br /&gt;
|-&lt;br /&gt;
|mod_register	||I带内注册 ([[XEP-0077]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_roster	||名册管理 ([[RFC3921|XMPP IM]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_roster_odbc	||名册管理 ([[RFC3921|XMPP IM]])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_service_log	||拷贝用户消息到日志服务	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_shared_roster	||共享名册管理	||mod_roster 或	mod_roster_odbc&lt;br /&gt;
|-&lt;br /&gt;
|mod_sic	Server ||IP检查 ([[XEP-0279]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_stats	||统计信息收集 ([[XEP-0039]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_time	||实体时间 ([[XEP-0202]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_vcard	||电子名片 ([[XEP-0054]])	 ||&lt;br /&gt;
|-&lt;br /&gt;
|mod_vcard_ldap	||电子名片 ([[XEP-0054]])	||LDAP服务器&lt;br /&gt;
|-&lt;br /&gt;
|mod_vcard_odbc	||电子名片 ([[XEP-0054]])	||支持的数据库 (*)&lt;br /&gt;
|-&lt;br /&gt;
|mod_vcard_xupdate	||基于vCard的头像 ([[XEP-0153]])	||mod_vcard 或 mod_vcard_odbc&lt;br /&gt;
|-&lt;br /&gt;
|mod_version	||软件版本 ([[XEP-0092]])	 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* (*) 这个模块需要数据库支持. 关于支持的数据库列表, 见 [[Ejabberd2:安装和操作指南#数据库和LDAP配置|3.2]] 节. &lt;br /&gt;
&lt;br /&gt;
通过后缀你可以看到每个模块需要哪个数据库后端:&lt;br /&gt;
&lt;br /&gt;
* 没有后缀, 这意味着那个模块使用Erlang的内建数据库 Mnesia 作为后端.&lt;br /&gt;
* ‘_odbc’, 这意味着该模块需要一个支持的数据库 (见 [[Ejabberd2:安装和操作指南#数据库和LDAP配置|3.2]] 节) 作为后端.&lt;br /&gt;
* ‘_ldap’, 这意味着该模块需要一个LDAP服务器作为后端. &lt;br /&gt;
&lt;br /&gt;
如果你想要, 有可能使用一个关系数据库来存储信息件. 你可以通过在ejabberd 配置文件修改模块名称带上_odbc 后缀来实现这点. 你可以为以下数据使用关系数据库:&lt;br /&gt;
&lt;br /&gt;
* 最后连接日期和时间: 使用 mod_last_odbc 取代 mod_last.&lt;br /&gt;
* 离线消息: 使用 mod_offline_odbc 取代 mod_offline.&lt;br /&gt;
* 名册: 使用 mod_roster_odbc 取代 mod_roster.&lt;br /&gt;
* 用户的VCARD: 使用 mod_vcard_odbc 取代 mod_vcard.&lt;br /&gt;
* 私有XML存储: 使用 mod_private_odbc 取代 mod_private.&lt;br /&gt;
* 用户黑名单规则: 使用 mod_privacy_odbc 取代 mod_privacy. &lt;br /&gt;
&lt;br /&gt;
你可以在ejabberd网站找到更多别人[http://www.ejabberd.im/contributions 捐献的模块]的信息. 请记住这些捐献可能不能用或它们有些bug和安全泄露. 所以, 使用他们是你们自己的风险!&lt;br /&gt;
&lt;br /&gt;
====通用选项====&lt;br /&gt;
&lt;br /&gt;
以下选项被多个模块使用. 所以, 它们被单列一节.&lt;br /&gt;
&lt;br /&gt;
=====iqdisc=====&lt;br /&gt;
&lt;br /&gt;
很多模块为处理发到这个服务器或一个用户(例如. 给 example.org 或给 user@example.org)的不同namespaces的IQ queries定义了处理程序. 这个选项定义了这些queries的处理原则.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Value}'''&lt;br /&gt;
&lt;br /&gt;
可能的值有:&lt;br /&gt;
&lt;br /&gt;
'''no_queue'''&lt;br /&gt;
:一个拥有此处理原则的 namespace 的所有 queries 会被立即处理. 这也意味着在这个包完全处理完之前，不可以处理任何包. 如果一个query的处理可能消耗比较长的时间，今后将不推荐这个原则. &lt;br /&gt;
'''one_queue'''&lt;br /&gt;
:在这种情况下，将为一个拥有此处理原则的 namespace建立一个独立的队列来处理它们. 另外, 这个队列的处理和其他包的队列是并行的. 这个原则是最推荐的. &lt;br /&gt;
'''{queues, N}'''&lt;br /&gt;
:N个独立的队列被建立用来处理这些 queries. 因而 queries 被并行处理, 但是以一个可控的方法. &lt;br /&gt;
'''parallel'''&lt;br /&gt;
:对每一个拥有此原则的包产生一个独立的Erlang进程. 所以, 所有这些包被并行处理. 尽管Erlang进程的产生成本相对较低, 这可能中断服务器的正常工作, 因为Erlang模拟器对进程数量有限制 (缺省为32000). &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_time, [{iqdisc, no_queue}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====host=====&lt;br /&gt;
&lt;br /&gt;
这个选项定义一个ejabberd 模块提供的服务的 Jabber ID.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
&lt;br /&gt;
如果你在 HostName 里包含了关键字 &amp;quot;@HOST@&amp;quot; , 它在启动时被替换为真实的虚拟主机字符串.&lt;br /&gt;
&lt;br /&gt;
这个例子配置了 echo 模块以 Jabber ID mirror.example.org来提供它的回音服务:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_echo, [{host, &amp;quot;mirror.example.org&amp;quot;}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
无论如何, 如果有多个虚拟主机并且这个模块在所有虚拟主机中都被激活, 必须使用&amp;quot;@HOST@&amp;quot; 关键字:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_echo, [{host, &amp;quot;mirror.@HOST@&amp;quot;}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_announce====&lt;br /&gt;
&lt;br /&gt;
本模块允许配置用户广播公告并设定本日消息 (MOTD). 被配置的用户可以在一个XMPP客户端使用Ad-hoc命令或发送消息给指定的JIDs来执行这些动作.&lt;br /&gt;
&lt;br /&gt;
特定命令被列于服务发现. 要使用此功能, 必须激活 mod_adhoc 模块.&lt;br /&gt;
&lt;br /&gt;
可以发送消息的特定 JIDs 清单如下. 在每个条目的第一个 JID 将只应用于指定的虚拟主机 example.org, 而括号里的 JID 将应用于ejabberd的所有虚拟主机.&lt;br /&gt;
&lt;br /&gt;
'''example.org/announce/all (example.org/announce/all-hosts/all)'''&lt;br /&gt;
:消息将被发送给所有注册用户. 如果用户在线并连接了多个资源, 只有高优先级的资源将收到消息. 如果注册用户没有连接, 消息将离线存储，假定激活了离线存储 (见  [[Ejabberd2:安装和操作指南#mod_offline|3.3.12] 节). &lt;br /&gt;
'''example.org/announce/online (example.org/announce/all-hosts/online)'''&lt;br /&gt;
:消息被发送到所有已连接的用户. 如果用户在线且连接了多个资源, 所有资源将接收到消息. &lt;br /&gt;
'''example.org/announce/motd (example.org/announce/all-hosts/motd)'''&lt;br /&gt;
:该消息被设置为每日消息 (MOTD) 并在用户登录时被发送给用户. 另外这个消息会被发送给所有连接的用户 (类似 announce/online). &lt;br /&gt;
'''example.org/announce/motd/update (example.org/announce/all-hosts/motd/update)'''&lt;br /&gt;
:该消息被设置为每日消息 (MOTD) 并在用户登录时被发送给用户. 这个消息不发送给任何当前已连接的用户. &lt;br /&gt;
'''example.org/announce/motd/delete (example.org/announce/all-hosts/motd/delete)'''&lt;br /&gt;
:任何发送到此JID的消息移除现有的每日消息 (MOTD). &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:这个选项指定谁被允许发送公告并设置每日消息 (缺省的, 没有人能发送这类消息). &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 只有管理员能发送公告:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {access, announce, [{allow, admins}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_adhoc, []},&lt;br /&gt;
        {mod_announce, [{access, announce}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 管理员以及 direction 可发送公告:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, direction, {user, &amp;quot;big_boss&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, direction, {user, &amp;quot;assistant&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, admins, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, announce, [{allow, admins},&lt;br /&gt;
                          {allow, direction}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_adhoc, []},&lt;br /&gt;
        {mod_announce, [{access, announce}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意 mod_announce 在大的布署里可能是资源敏感的，因为它可能广播非常多的消息. 对于拥有成百上千用户的ejabberd实例，这个模块应该被禁止.&lt;br /&gt;
&lt;br /&gt;
====mod_disco====&lt;br /&gt;
&lt;br /&gt;
这个模块增加多服务发现 ([[XEP-0030]]) 的支持. 激活本模块, 你的服务器上的服务可以被XMPP客户端发现. 注意ejabberd没有模块支持被取代的 Jabber Browsing ([http://xmpp.org/extensions/xep-0011.html XEP-0011]) 和 Agent Information ([http://xmpp.org/extensions/xep-0094.html XEP-0094]). 于是,如果你想它们能发现你提供的服务，XMPP客户端需要支持这个比较新的发现协议.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这定义服务发现的IQ queries的处理原则 (http://jabber.org/protocol/disco#items 和 http://jabber.org/protocol/disco#info)  (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]]). &lt;br /&gt;
'''{extra_domains, [Domain, ...]}'''&lt;br /&gt;
:使用这个选项, 你可以指定一个增加到服务发现条目列表中的附加域的列表. &lt;br /&gt;
'''{server_info, [ {Modules, Field, [Value, ...]}, ... ]}'''&lt;br /&gt;
:指定关于本服务器的额外的信息, 参见 XMPP服务的联系地址 ([http://xmpp.org/extensions/xep-0157.html XEP-0157]). Modules 可以是关键字‘all’, 这种情况下信息被汇报给所有服务; 或是一个 ejabberd 模块的列表, 这种情况下信息仅被指定给那些模块提供的服务. 可以指定任意的 Field 和 Value , 不只是联系地址. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 提供一个链接到jabber.org上的Jabber用户目录:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_disco, [{extra_domains, [&amp;quot;users.jabber.org&amp;quot;]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 提供一个链接到其他服务器的网关:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_disco, [{extra_domains, [&amp;quot;icq.example.com&amp;quot;,&lt;br /&gt;
                                      &amp;quot;msn.example.com&amp;quot;]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 提供一个链接到一些友好的服务器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_disco, [{extra_domains, [&amp;quot;example.org&amp;quot;,&lt;br /&gt;
                                      &amp;quot;example.com&amp;quot;]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 使用这个配置, 所有服务在主服务器显示滥用地址, 回复地址, 并同时在主服务器和vJUD服务显示管理员地址:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_disco, [{server_info, [&lt;br /&gt;
            {all,&lt;br /&gt;
             &amp;quot;abuse-addresses&amp;quot;,&lt;br /&gt;
             [&amp;quot;mailto:abuse@shakespeare.lit&amp;quot;]},&lt;br /&gt;
            {[mod_muc],&lt;br /&gt;
             &amp;quot;Web chatroom logs&amp;quot;,&lt;br /&gt;
             [&amp;quot;http://www.example.org/muc-logs&amp;quot;]},&lt;br /&gt;
            {[mod_disco],&lt;br /&gt;
             &amp;quot;feedback-addresses&amp;quot;,&lt;br /&gt;
             [&amp;quot;http://shakespeare.lit/feedback.php&amp;quot;, &amp;quot;mailto:feedback@shakespeare.lit&amp;quot;, &amp;quot;xmpp:feedback@shakespeare.lit&amp;quot;]},&lt;br /&gt;
            {[mod_disco, mod_vcard],&lt;br /&gt;
             &amp;quot;admin-addresses&amp;quot;,&lt;br /&gt;
             [&amp;quot;mailto:xmpp@shakespeare.lit&amp;quot;, &amp;quot;xmpp:admins@shakespeare.lit&amp;quot;]}&lt;br /&gt;
        ]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_echo====&lt;br /&gt;
&lt;br /&gt;
本模块简单地对任何XMPP包发出回音给发送者. ejabberd和XMPP客户端调试可能对这个镜子感兴趣.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义服务的Jabber ID. 如果 host 选项没指定, Jabber ID 将是前缀‘echo.’加该虚拟主机的 hostname . 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换成真实的虚拟主机名. &lt;br /&gt;
&lt;br /&gt;
例子: 镜子, 镜子, 在墙上, 他们谁是最美丽的?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_echo, [{host, &amp;quot;mirror.example.org&amp;quot;}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_http_bind====&lt;br /&gt;
&lt;br /&gt;
本模块实现了定义于 [http://xmpp.org/extensions/xep-0124.html XEP-0124] 和 [http://xmpp.org/extensions/xep-0206.html XEP-0206]的 XMPP over Bosh (正式的名字是 HTTP Binding). 它在这个将被伺服的服务上以一个可配置的资源扩展了ejabberd的HTTP服务， .&lt;br /&gt;
&lt;br /&gt;
要使用 HTTP-Binding, 激活这个模块:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_http_bind, []},&lt;br /&gt;
  ...&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并增加 http_bind 到 HTTP 服务. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{listen, &lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {5280, ejabberd_http, [&lt;br /&gt;
                         http_bind,&lt;br /&gt;
                         http_poll,&lt;br /&gt;
                         web_admin&lt;br /&gt;
                        ]&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用这个配置, module 将伺服发送给 http://example.org:5280/http-bind/ 的请求. 记住这个页面不是被设计给web浏览器使用的, 它是被支持XMPP over Bosh的XMPP客户端使用的.&lt;br /&gt;
&lt;br /&gt;
如果你想以不同的URI路径设置服务或使用一个不同的模块, 你可以使用选项request_handlers手工配置它. 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{listen, &lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {5280, ejabberd_http, [&lt;br /&gt;
                         {request_handlers, [{[&amp;quot;http-bind&amp;quot;], mod_http_bind}]},&lt;br /&gt;
                         http_poll,&lt;br /&gt;
                         web_admin&lt;br /&gt;
                        ]&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{max_inactivity, Seconds}'''&lt;br /&gt;
:以秒数定义最大闲置时间. 缺省值为30秒. 例如, 设置成50秒:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    {modules,&lt;br /&gt;
     [&lt;br /&gt;
      ...&lt;br /&gt;
      {mod_http_bind, [ {max_inactivity, 50} ]},&lt;br /&gt;
      ...&lt;br /&gt;
    ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_http_fileserver====&lt;br /&gt;
&lt;br /&gt;
这个简单的模块从本地磁盘通过HTTP提供文件服务.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{docroot, Path}'''&lt;br /&gt;
:伺服文件的目录. &lt;br /&gt;
'''{accesslog, Path}'''&lt;br /&gt;
:使用一个类似Apache格式的日志文件. 如果没指定本选项则不记录日志. &lt;br /&gt;
'''{directory_indices, [Index, ...]}'''&lt;br /&gt;
:包含一个或多个目录的索引文件, 类似 Apache的 DirectoryIndex 变量. 当一个web请求去到一个目录而不是常规的文件, 那些目录的 indices 被顺序装载, 并且返回被发现的第一个. &lt;br /&gt;
'''{custom_headers, [ {Name, Value}, ...]}'''&lt;br /&gt;
:表明自定义的HTTP头将被包含在所有应答中. 缺省值是: [] &lt;br /&gt;
'''{content_types, [ {Name, Type}, ...]}'''&lt;br /&gt;
:指定内容类型的扩展. 已经定义了很多 content types , 使用本选项你可以增加新的定义, 修改或删除现存的. 要删除现有定义, 简单的以一个值定义它: ‘undefined’. &lt;br /&gt;
'''{default_content_type, Type}'''&lt;br /&gt;
:指定 content type 使用未知的扩展. 缺省是‘application/octet-stream’. &lt;br /&gt;
&lt;br /&gt;
这个实例配置将从本地目录 /var/www 在地址 http://example.org:5280/pub/archive/ 提供文件服务. 在这个例子定义了一个新的 content type ogg, png 重新定义了, 而 jpg 定义被删除了. 要使用本模块你必须激活它:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_http_fileserver, [&lt;br /&gt;
                         {docroot, &amp;quot;/var/www&amp;quot;}, &lt;br /&gt;
                         {accesslog, &amp;quot;/var/log/ejabberd/access.log&amp;quot;},&lt;br /&gt;
                         {directory_indices, [&amp;quot;index.html&amp;quot;, &amp;quot;main.htm&amp;quot;]},&lt;br /&gt;
                         {custom_headers, [{&amp;quot;X-Powered-By&amp;quot;, &amp;quot;Erlang/OTP&amp;quot;},&lt;br /&gt;
                                           {&amp;quot;X-Fry&amp;quot;, &amp;quot;It's a widely-believed fact!&amp;quot;}&lt;br /&gt;
                                          ]},&lt;br /&gt;
                         {content_types, [{&amp;quot;.ogg&amp;quot;, &amp;quot;audio/ogg&amp;quot;},&lt;br /&gt;
                                          {&amp;quot;.png&amp;quot;, &amp;quot;image/png&amp;quot;},&lt;br /&gt;
                                          {&amp;quot;.jpg&amp;quot;, undefined}&lt;br /&gt;
                                         ]},&lt;br /&gt;
                         {default_content_type, &amp;quot;text/html&amp;quot;}&lt;br /&gt;
                        ]&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且在HTTP服务里把它定义为一个处理器:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{listen, &lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {5280, ejabberd_http, [&lt;br /&gt;
                         ...&lt;br /&gt;
                         {request_handlers, [&lt;br /&gt;
                                             ...&lt;br /&gt;
                                             {[&amp;quot;pub&amp;quot;, &amp;quot;archive&amp;quot;], mod_http_fileserver},&lt;br /&gt;
                                             ...&lt;br /&gt;
                                            ]&lt;br /&gt;
                         },&lt;br /&gt;
                         ...&lt;br /&gt;
                        ]&lt;br /&gt;
  },&lt;br /&gt;
  ...&lt;br /&gt;
]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_irc====&lt;br /&gt;
&lt;br /&gt;
本模块是一个 IRC 网关用于加入IRC服务器的频道.&lt;br /&gt;
&lt;br /&gt;
最终用户信息:&lt;br /&gt;
&lt;br /&gt;
* 一个支持‘groupchat 1.0’或 Multi-User Chat ([[XEP-0045]])的XMPP客户端需要加入IRC频道.&lt;br /&gt;
* 一个IRC频道可能被以近似相同的方式加入一个XMPP多用户聊天室. 不同处是房间名将变成‘channel%irc.example.org’，在这个情况下 irc.example.org 是伺服‘channel’的IRC服务器. 并且当然这个主机应该指向IRC网关而不是多用户聊天服务.&lt;br /&gt;
* 你可以注册你的昵称，通过发送‘IDENTIFY password’到 nickserver!irc.example.org@irc.jabberserver.org.&lt;br /&gt;
* 键入你的密码，通过发送‘LOGIN nick password’到 nickserver!irc.example.org@irc.jabberserver.org.&lt;br /&gt;
* IRC网关提供 Ad-Hoc Commands ([http://xmpp.org/extensions/xep-0050.html XEP-0050]) 来加入一个频道, 并设定自定义的 IRC 用户名和编码.&lt;br /&gt;
* 当使用一个流行的XMPP服务器, 可能它没有到一些IRC服务器的连接存在，因为它们限制从一个IP来的连接的数量. &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义该服务的 Jabber ID. 如果 host 选项未定义, Jabber ID 将是该虚拟主机的 hostname 加上前缀‘irc.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换成真实的虚拟主机名. &lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:这个选项可被用于定义谁能使用 IRC 网关 (缺省值: all). &lt;br /&gt;
'''{default_encoding, Encoding}'''&lt;br /&gt;
:设置缺省的 IRC 编码. 缺省值: &amp;quot;koi8-r&amp;quot; &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在第一个例子里, IRC网关在你的所有带有前缀‘irc.’的虚拟主机上可用. 进一步的, 任何人可以使用这个这个网关. 缺省编码设为 &amp;quot;iso8859-15&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_irc, [{access, all}, {default_encoding, &amp;quot;iso8859-15&amp;quot;}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在下一个例子，IRC网关对于那些拥有前缀irc-t.net的JIDs可用. 而且, 这个网关只可以被example.org的两个用户以及example.com上的所有用户使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, paying_customers, {user, &amp;quot;customer1&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, paying_customers, {user, &amp;quot;customer2&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, paying_customers, {server, &amp;quot;example.com&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, irc_users, [{allow, paying_customers}, {deny, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_irc, [{access, irc_users},&lt;br /&gt;
                   {host, &amp;quot;irc.example.net&amp;quot;}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_last====&lt;br /&gt;
&lt;br /&gt;
本模块增加对最后活动([http://xmpp.org/extensions/xep-0012.html XEP-0012])的支持. 它可被用于发现什么时候离线用户最后一次访问服务器, 并知道在这台服务器上一个连接的用户的最后活动, 或查询ejabberd服务器的运行时间.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这是为 最后活动(jabber:iq:last) IQ queries 定义处理原则(见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节).&lt;br /&gt;
&lt;br /&gt;
====mod_muc====&lt;br /&gt;
&lt;br /&gt;
本模块提供一个多用户聊天([[XEP-0045]])服务. 用户可以发现现有房间, 加入或新建房间. 房间的房客可以公开或私下聊天.&lt;br /&gt;
&lt;br /&gt;
多用户聊天的一些功能:&lt;br /&gt;
&lt;br /&gt;
* 发送公开或私有消息给房间房客.&lt;br /&gt;
* 邀请其他用户到一个房间.&lt;br /&gt;
* 设定一个房间的标题.&lt;br /&gt;
* 建立密码保护房间.&lt;br /&gt;
* 踢人或拉黑名单. &lt;br /&gt;
&lt;br /&gt;
这个MUC服务允许任何Jabber ID注册一个昵称, 这样没有别人可以在该MUC服务的任何房间使用那个昵称. 为了注册一个昵称, 在你的XMPP客户端打开服务发现并注册到该MUC服务.&lt;br /&gt;
&lt;br /&gt;
本模块支持集群和负载均衡. 一个模块可被每个集群节点启动. 在特定的时间房间分布于所有可用的MUC模块实例上. 多用户聊天模块是集群的但房间本身不是集群的，也不是容错的: 如果管理那些房间的节点挂了, 那些房间就消失了并且它们将在第一次尝试连接得到的可用节点上重建.&lt;br /&gt;
&lt;br /&gt;
Module 选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义服务的Jabber ID. 如果 host 选项未指定, 该Jabber ID将是虚拟主机的hostname加上前缀‘conference.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换为真实的虚拟主机名. &lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:你可以指定谁有权使用多用户聊天服务. 缺省每个人都被允许使用它. &lt;br /&gt;
'''{access_create, AccessName}'''&lt;br /&gt;
:为配置在多用户聊天服务里谁被允许创建新房间 , 可使用这个选项. 缺省任何本地ejabberd服务器的帐号都被允许新建房间. &lt;br /&gt;
'''{access_persistent, AccessName}'''&lt;br /&gt;
:为配置谁被允许修改持久 ’persistent’房间的选项. 缺省任何本地ejabberd服务器的帐号被允许修改那个选项. &lt;br /&gt;
'''{access_admin, AccessName}'''&lt;br /&gt;
:这个选项指定谁被允许管理多用户聊天服务. 缺省值为 none, 它意味着只有房间创建者可以管理他的房间. 管理员们可以发送一个普通消息给服务 JID, 并且它将被作为一个服务消息显示在所有房间. 管理员们可以发送一个 groupchat 消息给一个激活的房间的JID, 并且该消息将被显示为一个服务消息. &lt;br /&gt;
'''{history_size, Size}'''&lt;br /&gt;
:当用户进入房间时被发送给用户的一个当前讨论的短小历史. 使用此选项你可以定义保持的历史数据数量，用来在用户加入房间时发送给他们. 这个值是一个整数. 设定这个值为 0 禁止历史功能并且, 导致一个结果, 没东西保留在内存里. 这个缺省值是 20. 这个值是全局的并且因而会影响服务的所有房间. &lt;br /&gt;
'''{max_users, Number}'''&lt;br /&gt;
:这个选项定义是服务级别的, 每房间允许的最大用户数. 它可以低于每个房间的配置但是不能在单个的房间配置里增加. 缺省值为200. &lt;br /&gt;
'''{max_users_admin_threshold, Number}'''&lt;br /&gt;
:这个选项定义，当房间允许的最大房客数量达到之后，被允许进入房间的服务管理员或房间所有者的数量. 缺省限制为 5. &lt;br /&gt;
'''{max_user_conferences, Number}'''&lt;br /&gt;
:这个选项定义给定用户能加入的房间的最大数量. 缺省值为 10. 这个选项被用于阻止可能的滥用. 注意这是个软限制: 一些用户有时候可以在集群配置里加入更多的会议. &lt;br /&gt;
'''{max_room_id, Number}'''&lt;br /&gt;
:这个选项定义,当新建一个房间时,Room ID 字符串的可以有的最大长度. 缺省值是不限制: infinite. &lt;br /&gt;
'''{max_room_name, Number}'''&lt;br /&gt;
:这个选项定义,当配置一个房间时,Room Name 字符串的可以有的最大长度. 缺省值是不限制: infinite. &lt;br /&gt;
'''{max_room_desc, Number}'''&lt;br /&gt;
:这个选项定义,当配置一个房间时,Room Description 字符串的可以有的最大长度. 缺省值是不限制: infinite.     &lt;br /&gt;
'''{min_message_interval, Number}'''&lt;br /&gt;
:这个选项定义,在一个房客发送的两个消息之间的最小间隔时间,以秒计. 这个选项是全局的并且检查所有房间. 可使用一个十进制值. 当这个选项没定义时, 消息速率是不限制的. 这个功能可用来保护MUC服务不被房客滥用并限制服务广播的消息数量. 对于这个最小消息间隔时间,一个比较好的值是0.4秒. 如果一个房客试图更快地发送消息, 发回一个错误并解释这个消息已被抛弃并描述为什么消息不被接受的原因. &lt;br /&gt;
'''{min_presence_interval, Number}'''&lt;br /&gt;
:这个选项定义一个给定房客的两次出席信息变更之间的最小时间，以秒计. 这个选项是全局的并且会对所有房间生效. 可以用一个十进制数值. 当这个选项没有定义的时候, 没有限制. 这个选项可被用于保护一个MUC服务不被房客滥用. 如果一个房客试图在指定的间隔时间内更多次的变更出席信息, 这个出席信息被 ejabberd 缓存并只有在间隔延迟过期后最新的出席信息被广播给房间里的所有房客. 中间的出席信息包被安静的抛弃. 一个好的选项值是4秒. &lt;br /&gt;
'''{default_room_options, [ {OptionName, OptionValue}, ...]}'''&lt;br /&gt;
:这个选项允许定义期望的缺省房间选项. 注意一个房间的创建者可以在任何时候使用一个有MUC能力的XMPP客户端修改他自己的房间的选项. 可用的房间选项和缺省值有:&lt;br /&gt;
&lt;br /&gt;
:    '''{allow_change_subj, true|false}'''&lt;br /&gt;
::允许房客修改标题. &lt;br /&gt;
:    '''{allow_private_messages, true|false}'''&lt;br /&gt;
::房客可以发送私有消息给其他房客. &lt;br /&gt;
:    '''{allow_query_users, true|false}'''&lt;br /&gt;
::房客可发送 IQ queries 给其他房客. &lt;br /&gt;
:    '''{allow_user_invites, false|true}'''&lt;br /&gt;
::允许房客发送邀请. &lt;br /&gt;
:    '''{allow_visitor_nickchange, true|false}'''&lt;br /&gt;
::允许游客修改昵称. &lt;br /&gt;
:    '''{allow_visitor_status, true|false}'''&lt;br /&gt;
::允许游客在出席信息更新里发送status状态文本. I如果不允许, 在广播出席信息更新给房间里所有的房客时这个 status 文本被剥离. &lt;br /&gt;
:    '''{anonymous, true|false}'''&lt;br /&gt;
::这个房间是匿名的: 房客看不到其他房客的真实JIDs. 注意房间主持人们总是看得见房客的真实JIDs. &lt;br /&gt;
:    '''{logging, false|true}'''&lt;br /&gt;
::公开消息被使用mod_muc_log记录. &lt;br /&gt;
:    '''{max_users, 200}'''&lt;br /&gt;
::房间里房客的最大数量. &lt;br /&gt;
:    '''{members_by_default, true|false}'''&lt;br /&gt;
::进入房间的房客缺省成为参与者, 所以他们有发言权 ’voice’. &lt;br /&gt;
:    '''{members_only, false|true}'''&lt;br /&gt;
::只有房间成员可以进入. &lt;br /&gt;
:    '''{moderated, true|false}'''&lt;br /&gt;
::只有拥有发言权 ’voice’的房客可以发送公开消息. &lt;br /&gt;
:    '''{password, &amp;quot;roompass123&amp;quot;}'''&lt;br /&gt;
::房间密码. 你可能希望也激活下一个选项. &lt;br /&gt;
:    '''{password_protected, false|true}'''&lt;br /&gt;
::要求密码才能进入房间. &lt;br /&gt;
:    '''{persistent, false|true}'''&lt;br /&gt;
::即使最后一个房客离开，房间仍持久存在. &lt;br /&gt;
:    '''{public, true|false}'''&lt;br /&gt;
::房间在MUC服务列表里是公开的, 所以它是可发现的. &lt;br /&gt;
:    '''{public_list, true|false}'''&lt;br /&gt;
::参与者名单是公开的, 不需要进入房间就能拿到. &lt;br /&gt;
:    '''{title, &amp;quot;Room Title&amp;quot;}'''&lt;br /&gt;
::一个自然语言的房间称谓. &lt;br /&gt;
&lt;br /&gt;
:所有房间选项能被设定为 true 或 false, 除了 password 和 title 是字符串, 以及 max_users 是整数. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在第一个例子里，每个人都允许使用多用户聊天服务. 每个人也将能创建房间但只有用户admin@example.org被允许管理任何房间. 在这个例子里他也是一个全局的管理员. 当admin@example.org发送一个消息，例如‘Tomorrow, the XMPP server will be moved to new hardware. This will involve service breakdowns around 23:00 UMT. We apologise for this inconvenience.’ 给 conference.example.org, 这个消息将被显示在所有激活的房间里. 在这个例子里历史功能被禁止了.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, admin, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, muc_admin, [{allow, admin}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc, [{access, all},&lt;br /&gt;
                   {access_create, all},&lt;br /&gt;
                   {access_admin, muc_admin},&lt;br /&gt;
                   {history_size, 0}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在第二个例子里多用户聊天服务只允许在我们的域和其他的服务器上注册了的付费客户访问. 当然管理员也是允许访问房间的. 而且, 他是唯一被授权可以建立并管理房间的. 当admin@example.org发送一个消息，例如‘Tomorrow, the Jabber server will be moved to new hardware. This will involve service breakdowns around 23:00 UMT. We apologise for this inconvenience.’ 给 conference.example.org, 它将被显示在所有激活的房间里. 没有使用 history_size 选项, 这意味着这个功能被激活但缺省值为20个历史消息，将被发送给用户们.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, paying_customers, {user, &amp;quot;customer1&amp;quot;, &amp;quot;example.net&amp;quot;}}.&lt;br /&gt;
      {acl, paying_customers, {user, &amp;quot;customer2&amp;quot;, &amp;quot;example.com&amp;quot;}}.&lt;br /&gt;
      {acl, paying_customers, {user, &amp;quot;customer3&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, admin, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, muc_admin, [{allow, admin},&lt;br /&gt;
                            {deny, all}]}.&lt;br /&gt;
      {access, muc_access, [{allow, paying_customers},&lt;br /&gt;
                            {allow, admin},&lt;br /&gt;
                            {deny, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc, [{access, muc_access},&lt;br /&gt;
                   {access_create, muc_admin},&lt;br /&gt;
                   {access_admin, muc_admin}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在以下例子里, MUC使用了反滥用选项. 一个房客每0.4秒不能发送超过一个消息并且不能超过每4秒之内变更一次出席信息. Room IDs 和 Room Names 的长度被限制为 20 个字符, 而 Room Description 限制为 300 个字符. 没有定义 ACLs, 但一些用户限制可能被加入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc, [{min_message_interval, 0.4},&lt;br /&gt;
                   {min_presence_interval, 4},&lt;br /&gt;
                   {max_room_id, 20},&lt;br /&gt;
                   {max_room_name, 20},&lt;br /&gt;
                   {max_room_desc, 300}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 这个例子展示如何使用 default_room_options 来确保新建房间缺省拥有的选项.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc, [{access, muc_access},&lt;br /&gt;
                   {access_create, muc_admin},&lt;br /&gt;
                   {default_room_options,&lt;br /&gt;
                    [&lt;br /&gt;
                     {allow_change_subj, false},&lt;br /&gt;
                     {allow_query_users, true},&lt;br /&gt;
                     {allow_private_messages, true},&lt;br /&gt;
                     {members_by_default, false},&lt;br /&gt;
                     {title, &amp;quot;New chatroom&amp;quot;},&lt;br /&gt;
                     {anonymous, false}&lt;br /&gt;
                    ]},&lt;br /&gt;
                   {access_admin, muc_admin}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_muc_log====&lt;br /&gt;
&lt;br /&gt;
本模块允许可选的把多用户聊天 (MUC)的公开谈话记录转为HTML. 一旦你激活了这个模块, 用户可以使用有MUC能力的XMPP客户端加入一个房间, 并且如果他们有足够的权限, 他们可以请求一个配置表单来设定配置并允许房间记录.&lt;br /&gt;
&lt;br /&gt;
功能:&lt;br /&gt;
&lt;br /&gt;
* 每页顶端加上房间细节: room 称谓, JID, 作者, 标题以及配置.&lt;br /&gt;
* 房间JID 在生成的HTML里是一个链接，可用来加入该房间(使用 [http://xmpp.org/rfcs/rfc5122.html XMPP URI]).&lt;br /&gt;
* 标题和房间配置变更会被跟踪和显示.&lt;br /&gt;
* 加入, 离开, 修改昵称, 踢人, 拉黑名单和‘/me’被跟踪和显示, 包括原因(如果有).&lt;br /&gt;
* 生成的 HTML 文件是 XHTML 1.0 Transitional 和 CSS 兼容的.&lt;br /&gt;
* 时间戳是自参考的链接.&lt;br /&gt;
* 快速浏览的链接在顶上: 前一天, 下一天, 上.&lt;br /&gt;
* CSS被用于style定义, 可以使用一个自定义的 CSS 文件.&lt;br /&gt;
* 消息和标题里的URLs被转换为超链接.&lt;br /&gt;
* 时间戳上的时区被显示在记录文件里.&lt;br /&gt;
* 可在每一个页的顶部增加一个自定义链接. &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{access_log, AccessName}'''&lt;br /&gt;
:这个选项限制哪个房客被允许激活和禁止房间记录. 缺省值为 muc_admin. 注意对于为了这个缺省设定生效，你需要有一个用于 muc_admin 的 access rule . &lt;br /&gt;
'''{cssfile, false|URL}'''&lt;br /&gt;
:使用这个选项你可以设置是否该HTML文件应该使用一个自定义的CSS文件或他们需要使用嵌入的CSS文件. 被允许的值有 false 和一个指向某CSS文件的URL. 使用第一个值, HTML文件将包含一个嵌入的CSS代码. 使用后一个, 你可以指定自定义CSS文件的URL (例如: &amp;quot;http://example.com/my.css&amp;quot;). 缺省的值是 false. &lt;br /&gt;
'''{dirname, room_jid|room_name}'''&lt;br /&gt;
:允许配置房间目录的名字. 被允许的值有 room_jid 和 room_name. 使用前者的值, 房间目录名将是完整的房间JID. 使用后者, 房间目录名将只是房间的名字, 不包括 MUC服务名. 缺省值是room_jid. &lt;br /&gt;
'''{dirtype, subdirs|plain}'''&lt;br /&gt;
:新建目录的类型可使用此选项指定. 允许的值有 subdirs 和 plain. 使用前者, 子目录以每年和月新建. 使用后者, 记录文件名包含完整的日期, 并且没有子目录. 缺省值是 subdirs. &lt;br /&gt;
'''{file_format, html|plaintext}'''&lt;br /&gt;
:定义日志文件的格式: html 存储成HTML格式, plaintext 存储成纯文本. 缺省值为 html. &lt;br /&gt;
'''{outdir, Path}'''&lt;br /&gt;
:这个选项是应该被存储的HTML文件的目录的全路径. 确保ejabberd守候进程对那个目录有写权限. 缺省值为 &amp;quot;www/muc&amp;quot;. &lt;br /&gt;
'''{spam_prevention true|false}'''&lt;br /&gt;
:为了阻止垃圾, spam_prevention 选项增加了一个特别的属性给链接来阻止它们通过搜索引擎来索引. 缺省值为 true, 它意味着 nofollow 属性将被加到用户提交的链接里. &lt;br /&gt;
'''{timezone, local|universal}'''&lt;br /&gt;
:记录的时区可使用本选项配置. 允许的值有 local 和 universal. 使用前者, 将使用Erlang通过操作系统获得的本地时间. 使用后者, 将使用GMT/UTC 时间. 缺省值为 local. &lt;br /&gt;
'''{top_link, {URL, Text}}'''&lt;br /&gt;
:使用本选项你可以定制化每个日志文件的右上角的链接. 缺省值是 {&amp;quot;/&amp;quot;, &amp;quot;Home&amp;quot;}. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在第一个例子里，任何房间所有者能激活记录, 并将使用一个自定义的CSS文件 (http://example.com/my.css). 记录文件的名字将包含完整日期, 并且将没有子目录. 记录文件将被存储在 /var/www/muclogs, 且时区将是GMT/UTC. 最后, 顶端链接将是 &amp;lt;a href=&amp;quot;http://www.jabber.ru/&amp;quot;&amp;gt;Jabber.ru&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {access, muc, [{allow, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc_log, [&lt;br /&gt;
                       {access_log, muc},&lt;br /&gt;
                       {cssfile, &amp;quot;http://example.com/my.css&amp;quot;},&lt;br /&gt;
                       {dirtype, plain},&lt;br /&gt;
                       {dirname, room_jid},&lt;br /&gt;
                       {outdir, &amp;quot;/var/www/muclogs&amp;quot;},&lt;br /&gt;
                       {timezone, universal},&lt;br /&gt;
                       {spam_prevention, true},&lt;br /&gt;
                       {top_link, {&amp;quot;http://www.jabber.ru/&amp;quot;, &amp;quot;Jabber.ru&amp;quot;}}&lt;br /&gt;
                      ]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在第二个例子里只有admin1@example.org和admin2@example.net可以激活记录, 并且将使用嵌入的CSS文件. 记录名将只包含日期(数字), 且每年和月将有子目录. 这个记录文件将被存储在 /var/www/muclogs, 且将使用本地时间. 最后, 顶端链接将是缺省的 &amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, admins, {user, &amp;quot;admin1&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {acl, admins, {user, &amp;quot;admin2&amp;quot;, &amp;quot;example.net&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, muc_log, [{allow, admins},&lt;br /&gt;
                         {deny, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_muc_log, [&lt;br /&gt;
                       {access_log, muc_log},&lt;br /&gt;
                       {cssfile, false},&lt;br /&gt;
                       {dirtype, subdirs},&lt;br /&gt;
                       {outdir, &amp;quot;/var/www/muclogs&amp;quot;},&lt;br /&gt;
                       {timezone, local}&lt;br /&gt;
                      ]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_offline====&lt;br /&gt;
&lt;br /&gt;
本模块实现离线消息存储 ([http://xmpp.org/extensions/xep-0160.html XEP-0160]). 这意味着所有被发送给一个离线用户的消息将被存储在服务器上直到那个用户再次上线. 所以它非常类似邮件的工作. 注意 ejabberdctl 有一个命令删除过期的消息 (见 [[Ejabberd2:安装和操作指南#ejabberdctl|4.1]] 节).&lt;br /&gt;
&lt;br /&gt;
'''{access_max_user_messages, AccessName}'''&lt;br /&gt;
:这个选项定义哪个 access rule 将被强迫用来限制一个用户所拥有的离线消息的最大数量(配额). 当一个用户有太多离线消息, 任何收到的新消息将被抛弃, 并且将返回一个 资源约束 错误给发送者. 缺省值为 max_user_offline_messages. 接着你可以用类似max_user_sessions的语法定义一个 access rule (见 [[Ejabberd2:安装和操作指南#用ACL限制打开的会话|3.1.5]] 节). &lt;br /&gt;
&lt;br /&gt;
这个例子允许强力用户拥有大到 5000 个离线消息, 管理员达到 2000, 所有其他用户达到 100.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{acl, admin, {user, &amp;quot;admin1&amp;quot;, &amp;quot;localhost&amp;quot;}}.&lt;br /&gt;
{acl, admin, {user, &amp;quot;admin2&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
{acl, poweruser, {user, &amp;quot;bob&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
{acl, poweruser, {user, &amp;quot;jane&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
{access, max_user_offline_messages, [ {5000, poweruser}, {2000, admin}, {100, all} ]}.&lt;br /&gt;
&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_offline,  [ {access_max_user_messages, max_user_offline_messages} ]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_ping====&lt;br /&gt;
&lt;br /&gt;
这个模块实现对XMPP Ping ([[XEP-0199]]) 和 定期保持连接 的支持. 当本模块激活时，ejabberd正确应答 ping 请求, 如协议所述.&lt;br /&gt;
&lt;br /&gt;
配置选项:&lt;br /&gt;
&lt;br /&gt;
'''{send_pings, true|false}'''&lt;br /&gt;
:如果这个选项设为 true, 服务器在一个给定的间隔时间 ping_interval发送 pings 给已连接的不活跃的客户端. 这对于保持活着的客户端连接或检查可用性是有用的. 缺省这个选项是禁止的. &lt;br /&gt;
'''{ping_interval, Seconds}'''&lt;br /&gt;
:多久发送一次 ping 给已连接的用户, 如果前一个选项被激活. 如果一个客户端连接在这个间隔内没有发送或接收任何节, 一个 ping 请求被发送给客户端. 缺省值为60秒. &lt;br /&gt;
'''{timeout_action, none|kill}'''&lt;br /&gt;
:当一个客户端在32秒内不回答一个服务器的ping请求时，服务器做什么. 缺省是什么也不做. &lt;br /&gt;
&lt;br /&gt;
这个例子激活了 Ping 应答, 配置该模块发送 pings 给4分钟内不活跃的客户端连接, 并且如果一个客户端在32秒内不回答 ping , 它的连接将被关闭:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_ping,  [{send_pings, true}, {ping_interval, 240}, {timeout_action, kill}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_privacy====&lt;br /&gt;
&lt;br /&gt;
本模块实现定义于[[RFC3921|XMPP IM]]第十章的禁止通讯 (也被称为隐私规则) . 如果最终用户在他们的XMPP客户端也支持它, 他们将能够:&lt;br /&gt;
&lt;br /&gt;
* 收到某人的隐私列表privacy lists.&lt;br /&gt;
* 增加, 删除, 和修改某人的隐私列表privacy lists.&lt;br /&gt;
* 设置, 修改, 或减少激活的列表active lists.&lt;br /&gt;
* 设置, 修改, 或减少缺省列表default list (即, 缺省那个列表是激活的).&lt;br /&gt;
* 允许或禁止消息，基于JID, group, 或 订阅类型subscription type (或全局的).&lt;br /&gt;
* 允许或禁止入站的出席信息通知，基于JID, group, 或 订阅类型subscription type (或全局的).&lt;br /&gt;
* 允许或禁止出站的出席信息通知，基于JID, group, 或 订阅类型subscription type (或全局的).&lt;br /&gt;
* 允许或禁止IQ节，基于JID, group, 或 订阅类型subscription type (或全局的).&lt;br /&gt;
* 允许或禁止所有通讯，基于JID, group, 或 订阅类型subscription type (或全局的).&lt;br /&gt;
&lt;br /&gt;
:(从 http://xmpp.org/rfcs/rfc3921.html#privacy) &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为禁止通讯(jabber:iq:privacy) IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义处理原则 .&lt;br /&gt;
&lt;br /&gt;
====mod_private====&lt;br /&gt;
&lt;br /&gt;
本模块增加对私有XML存储([[XEP-0049]])的支持:&lt;br /&gt;
&lt;br /&gt;
:使用这个方法, XMPP实体能存储私有数据到服务器并在任何必要的时候获得它. 存储的数据可以是任何东西, 只要它是合法的XML. 对这个namespace的一个典型的用法是服务器端存储特定客户端的配置; 另一个是标签存储([[XEP-0048]]). &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为私有XML存储 (jabber:iq:private) IQ queries 定义处理原则(见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]]).&lt;br /&gt;
&lt;br /&gt;
====mod_proxy65====&lt;br /&gt;
&lt;br /&gt;
本模块实现SOCKS5字节流([[XEP-0065]]). 它允许把ejabberd当作一个在两个XMPP客户端之间的文件传输代理.&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义该服务的Jabber ID. 如果 host 选项没指定, Jabber ID将是该虚拟主机的hostname加上前缀‘proxy.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换为真实的虚拟主机名. &lt;br /&gt;
'''{name, Text}'''&lt;br /&gt;
:定义服务的服务发现名称. 缺省是 &amp;quot;SOCKS5 Bytestreams&amp;quot;. &lt;br /&gt;
'''{ip, IPTuple}'''&lt;br /&gt;
:这个选项定义监听哪个网络接口. 缺省是该服务的DNS名解析到的一个IP地址, 或, 如果失败, 则是{127,0,0,1}. &lt;br /&gt;
'''{port, Number}'''&lt;br /&gt;
:这个选项定义监听链入连接的端口. 缺省是 7777. &lt;br /&gt;
'''{hostname, HostName}'''&lt;br /&gt;
:定义一个在建立和客户端的会话时服务声明的hostname. 当你在一个NAT后面运行这个服务的时候这是有用的. 缺省是 ip 选项的值. 例如: &amp;quot;proxy.mydomain.org&amp;quot;, &amp;quot;200.150.100.50&amp;quot;. 注意在流协商的时候不是所有客户端都懂得域名, 所以在这个选项设定域名时你应该思考两次. &lt;br /&gt;
'''{auth_type, anonymous|plain}'''&lt;br /&gt;
:SOCKS5验证类型. 可能的值有 anonymous 和 plain. 缺省是 anonymous. &lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:为文件传输发起者定义 ACL. 缺省是 all. &lt;br /&gt;
'''{max_connections, Number}'''&lt;br /&gt;
:每个文件传输的发起者的激活连接的最大数. 缺省不限制. &lt;br /&gt;
'''{shaper, none|ShaperName}'''&lt;br /&gt;
:这个选项为文件传输端定义塑性shaper. 有最大带宽的Shaper将被选择. 缺省是 none. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 本模块最简单的配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_proxy65, []},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 更复杂的配置.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, proxy_users, {server, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {access, proxy65_access, [{allow, proxy_users}, {deny, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {acl, admin, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
      {shaper, proxyrate, {maxrate, 10240}}. %% 10 Kbytes/sec&lt;br /&gt;
      {access, proxy65_shaper, [{none, admin}, {proxyrate, proxy_users}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_proxy65, [{host, &amp;quot;proxy1.example.org&amp;quot;},&lt;br /&gt;
                       {name, &amp;quot;File Transfer Proxy&amp;quot;},&lt;br /&gt;
                       {ip, {200,150,100,1}},&lt;br /&gt;
                       {port, 7778},&lt;br /&gt;
                       {max_connections, 5},&lt;br /&gt;
                       {access, proxy65_access},&lt;br /&gt;
                       {shaper, proxy65_shaper}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_pubsub====&lt;br /&gt;
&lt;br /&gt;
本模块提供一个发行-订阅 服务 ([[XEP-0060]]). 在mod_pubsub里，功能可以使用插件来扩展. 实现PEP (基于Pubsub的个人信息事件) ([[XEP-0163]]) 的plugin, 在缺省的 ejabberd 配置文件中是被允许的, 并且它需要 mod_caps.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义了该服务的Jabber ID. 如果 host 选项没定义, Jabber ID将是该虚拟主机的hostname加上前缀‘pubsub.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换成真实的虚拟主机名. 如果你使用了 mod_pubsub_odbc, 请确保前缀只包含一个点dot, 例如‘pubsub.’, 或 ‘publish.’,. &lt;br /&gt;
'''{access_createnode, AccessName}'''&lt;br /&gt;
:这个选项使用 ACL 和 ACCESS来限制哪个用户被允许建立 pubsub 节点. 缺省本地ejabberd服务器的任何帐号被允许新建 pubsub 节点. &lt;br /&gt;
'''{max_items_node, MaxItems}'''&lt;br /&gt;
:定义可被一个节点存储的条目的最大数量. 缺省值为 10. &lt;br /&gt;
'''{plugins, [ Plugin, ...]}'''&lt;br /&gt;
:用于指定plugins使用哪个pubsub节点. 列表的第一个缺省被使用. 如果这个选项没定义, 缺省 plugins 列表为: [&amp;quot;flat&amp;quot;]. PubSub客户端能定义使用哪个plugin，当新建一个节点的时候: 增加 type=’plugin-name’ 属性到这个 create 节元素里. &lt;br /&gt;
'''{nodetree, Nodetree}'''&lt;br /&gt;
:用于指定使用哪个节点树 nodetree. 如果没定义, 缺省使用 pubsub nodetree : &amp;quot;tree&amp;quot;. 每个主机只能使用一个 nodetree , 且被所有节点 plugins 共享.&lt;br /&gt;
&lt;br /&gt;
:&amp;quot;virtual&amp;quot; nodetree 不把节点存储在数据库里. 它使用tons of nodes存储资源到系统. 如果使用 &amp;quot;virtual&amp;quot; nodetree, 你只能允许那些节点 plugins: [&amp;quot;flat&amp;quot;,&amp;quot;pep&amp;quot;] 或 [&amp;quot;flat&amp;quot;]; 任何其他 plugins 配置将不工作. 同时, 所有节点将有缺省配置, 并且不能被修改. 使用 &amp;quot;virtual&amp;quot; nodetree 需要从一个干净的数据库启动, 如果你之前使用了缺省的 &amp;quot;tree&amp;quot; nodetree，它将不工作.&lt;br /&gt;
&lt;br /&gt;
:&amp;quot;dag&amp;quot; nodetree 为 PubSub集合节点([[XEP-0248]])提供实验性的支持. 在那种情况下你也应该增加 &amp;quot;dag&amp;quot; 节点 plugin 作为缺省值, 例如: {plugins, [&amp;quot;dag&amp;quot;,&amp;quot;flat&amp;quot;,&amp;quot;hometree&amp;quot;,&amp;quot;pep&amp;quot;]} &lt;br /&gt;
'''{ignore_pep_from_offline, false|true}'''&lt;br /&gt;
:用于指定是否我们应该获取当我们连接时在我们的名册里处于离线状态的联系人的PEP最后发行条目. 值有 true 或 false. 如果不定义, pubsub 假定为 true，所以我们只能获取在线联系人的最后条目. &lt;br /&gt;
'''{last_item_cache, false|true}'''&lt;br /&gt;
:指定是否 pubsub 应该缓存最后条目. 值为 true 或 false. 如果没定义, pubsub不缓存最后条目. 在没有那么多节点的系统上, 缓存最后条目加速了 pubsub 并允许增加用户连接频率. 开销主要是内存使用, 因为每个条目都存储在内存里. &lt;br /&gt;
'''{pep_mapping, [ {Key, Value}, ...]}'''&lt;br /&gt;
:这允许定义一个 键-值 列表来在给定 PEP 名字空间选择定义节点 plugins . 以下例子将为每个拥有 tune namespace的PEP节点使用 node_tune 替代 node_pep :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {mod_pubsub, [{pep_mapping, [{&amp;quot;http://jabber.org/protocol/tune&amp;quot;, &amp;quot;tune&amp;quot;}]}]}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
配置例子使用 flat 节点作为缺省值, 并允许使用 flat, nodetree 和 pep 节点:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_pubsub, [&lt;br /&gt;
                {access_createnode, pubsub_createnode},&lt;br /&gt;
                {plugins, [&amp;quot;flat&amp;quot;, &amp;quot;hometree&amp;quot;, &amp;quot;pep&amp;quot;]}&lt;br /&gt;
               ]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用 ODBC 数据库要求使用重复的plugins. 以下例子展示前一个配置加上 ODBC 之后的用法:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_pubsub_odbc, [&lt;br /&gt;
                {access_createnode, pubsub_createnode},&lt;br /&gt;
                {plugins, [&amp;quot;flat_odbc&amp;quot;, &amp;quot;hometree_odbc&amp;quot;, &amp;quot;pep_odbc&amp;quot;]}&lt;br /&gt;
               ]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_register====&lt;br /&gt;
&lt;br /&gt;
本模块增加对带内注册([[XEP-0077]])的支持. 这个协议允许最终用户使用XMPP客户端做:&lt;br /&gt;
&lt;br /&gt;
* 在服务器注册一个新帐号.&lt;br /&gt;
* 在服务器上给一个现有帐号修改密码.&lt;br /&gt;
* 删除一个服务器上的现有帐号. &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{access, AccessName}'''&lt;br /&gt;
:这个选项可被配置来指定限制注册的 rules. 如果一个 rule 在请求的用户名返回‘deny’, 那个用户名的注册被禁止. (缺省没有限制). &lt;br /&gt;
'''{access_from, AccessName}'''&lt;br /&gt;
:缺省的, ejabberd不允许从s2s或已有的c2s会话注册一个新帐号. 你可以修改它，通过在这个选项定义 access rule. 谨慎使用: 允许从s2s注册会导致流氓用户的不可控的大量帐号注册. &lt;br /&gt;
'''{welcome_message, Message}'''&lt;br /&gt;
:设定一个欢迎信息发送给每一个新注册的帐号. 第一个字符串是标题, 第二个字符串是消息 body. 在body里你可以用字符: \n 设定一个新行&lt;br /&gt;
'''{registration_watchers, [ JID, ...]}'''&lt;br /&gt;
:这个选项定义一个 JIDs 列表，每次有人注册新帐号，他们将收到通知. &lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为带内注册(jabber:iq:register) IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义处理原则. &lt;br /&gt;
&lt;br /&gt;
这个模块也从服务器读取另一个全局定义的选项: {registration_timeout, Timeout}. 这个选项限制从一个给定IP或用户名发出的注册请求的频率. 所以, 一个用户在前一个注册之后，经过这个数量的秒数之前不能从相同IP地址或JID注册一个新帐号. Timeout被表示为秒数, 并且必须是一个整数. 要禁止此限制, 把整数替换成单词，类似: infinity. 缺省值为: 600 秒.&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 下个例子禁止注册太短的帐号名 prohibits:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, shortname, {user_glob, &amp;quot;?&amp;quot;}}.&lt;br /&gt;
      {acl, shortname, {user_glob, &amp;quot;??&amp;quot;}}.&lt;br /&gt;
      %% The same using regexp:&lt;br /&gt;
      %%{acl, shortname, {user_regexp, &amp;quot;^..?$&amp;quot;}}.&lt;br /&gt;
&lt;br /&gt;
      {access, register, [{deny, shortname},&lt;br /&gt;
                          {allow, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_register, [{access, register}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 这个配置禁止使用带内注册新建和删除帐号, 但允许现有帐号修改密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {access, register, [{deny, all}]}.&lt;br /&gt;
&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_register, [{access, register}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 这个配置禁止所有带内注册功能: 新建, 删除帐号和修改密码:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        %% {mod_register, [{access, register}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 定义一个欢迎信息和两个注册观察者. 也定义一个注册超时为一小时:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {registration_timeout, 3600}.&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_register,&lt;br /&gt;
         [&lt;br /&gt;
          {welcome_message, {&amp;quot;Welcome!&amp;quot;, &amp;quot;Hi.\nWelcome to this Jabber server.\n Check http://www.jabber.org\n\nBye&amp;quot;}},&lt;br /&gt;
          {registration_watchers, [&amp;quot;admin1@example.org&amp;quot;, &amp;quot;boss@example.net&amp;quot;]}&lt;br /&gt;
         ]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_roster====&lt;br /&gt;
&lt;br /&gt;
本模块实现名册管理，定义于 RFC 3921: [[RFC3921|XMPP IM]]. 也支持 名册版本 ([[XEP-0237]]).&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为名册管理 (jabber:iq:roster) IQ queries (see section [Ejabberd2:安装和操作指南[#iqdisc|3.3.2]] 节) 指定处理原则. &lt;br /&gt;
'''{versioning, false|true}'''&lt;br /&gt;
:激活名册版本. 这个选项缺省是禁止的. &lt;br /&gt;
'''{store_current_id, false|true}'''&lt;br /&gt;
:如果激活这个选项, 当前版本数量被存储在数据库. 如果被禁止, 版本数量在每次飞行计算. 激活这个选项同时减少ejabberd和数据库的负载. 任何情况下这个选项不影响客户端. 该选项只是当允许名册版本时有用. 该选项缺省是被禁止的. 重要: 如果你使用 mod_shared_roster, 你必须禁止这个选项. &lt;br /&gt;
&lt;br /&gt;
这个示例配置允许使用当前id存储的名册版本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{modules,&lt;br /&gt;
 [&lt;br /&gt;
  ...&lt;br /&gt;
  {mod_roster, [{versioning, true}, {store_current_id, true}]},&lt;br /&gt;
  ...&lt;br /&gt;
 ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_service_log====&lt;br /&gt;
&lt;br /&gt;
本模块通过一个XMPP消息审计服务，例如Bandersnatch，增加了对最终用户的包进行记录的支持. 所有用户包被封装在一个 &amp;lt;route/&amp;gt; 元素里并发送给一个特定服务(们).&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{loggers, [Names, ...]}'''&lt;br /&gt;
:使用这个选项可以指定将接收包的一个 (列表之一) 服务(们). &lt;br /&gt;
&lt;br /&gt;
例子s:&lt;br /&gt;
&lt;br /&gt;
* 这是把所有的用户包记录到运行在bandersnatch.example.com的Bandersnatch 服务，:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_service_log, [{loggers, [&amp;quot;bandersnatch.example.com&amp;quot;]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 这是把所有最终用户的包记录到运行在bandersnatch.example.com的Bandersnatch服务以及运行在bandersnatch.example.org的备份服务上:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_service_log, [{loggers, [&amp;quot;bandersnatch.example.com&amp;quot;,&lt;br /&gt;
                                      &amp;quot;bandersnatch.example.org&amp;quot;]}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_shared_roster====&lt;br /&gt;
&lt;br /&gt;
本模块允许你新建共享名册组. 这意味着你可以新建人员组，组里的成员从他们的名册里的其他组也可以看到成员. 这个功能的最大好处是最终用户不需要手工添加所有用户到他们的名册, 并且他们不能永久性地从共享名册组删除用户. 一个共享名册组可拥有来自任何XMPP服务器的成员, 但是出席信息from和to将只在创建该组的相同的虚拟主机的成员之间可用.&lt;br /&gt;
&lt;br /&gt;
共享名册组只可以通过Web管理编辑. 每个组有唯一标识符和以下参数:&lt;br /&gt;
&lt;br /&gt;
'''Name'''&lt;br /&gt;
:组名, 它将被显示在名册里. &lt;br /&gt;
'''Description'''&lt;br /&gt;
:组描述. 这个参数不影响任何东西. &lt;br /&gt;
'''Members'''&lt;br /&gt;
:组成员的完整JIDs列表, 在Web管理 里面每行一个. 为了把虚拟主机上的所有注册用户设为成员, 你可以使用特殊的参数: @all@. 注意这个参数被设计用于一个只有几百用户的小服务器. &lt;br /&gt;
'''Displayed groups'''&lt;br /&gt;
:那些成员将出现在名册上的组的列表. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 假设一个计算机俱乐部希望它的所有成员在他们的名册里看到所有其他成员. 为了达到这点, 他们需要建立一个共享名册组类似下表: &lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|Identification ||Group ‘club_members’&lt;br /&gt;
|-&lt;br /&gt;
|Name ||俱乐部成员&lt;br /&gt;
|-&lt;br /&gt;
|Description ||来自计算机俱乐部的成员&lt;br /&gt;
|-&lt;br /&gt;
|Members ||&lt;br /&gt;
 {|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
 |member1@example.org &lt;br /&gt;
 |- &lt;br /&gt;
 |member2@example.org&lt;br /&gt;
 |-&lt;br /&gt;
 |member3@example.org &lt;br /&gt;
 |}&lt;br /&gt;
|-&lt;br /&gt;
|Displayed groups ||club_members&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 在另一个情况下，我们有一个公司，它有三个部门: 管理部, 市场部和销售部. 所有组成员应该在他们的名册里看到其他成员. 另外, 所有经理应该在他们的名册里有所有市场部和销售部的人. 同时, 所有市场人员和全部销售队伍应该看到所有经理. 这个场景可由新建以下共享名册组来达到，如下表所示:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|Identification ||	 Group ‘management’||Group ‘marketing’||	 Group ‘sales’&lt;br /&gt;
|-&lt;br /&gt;
|Name ||管理部 ||市场部 ||销售部&lt;br /&gt;
|-&lt;br /&gt;
|Description || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Members ||&lt;br /&gt;
 {|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
 |manager1@example.org &lt;br /&gt;
 |- &lt;br /&gt;
 |manager2@example.org&lt;br /&gt;
 |-&lt;br /&gt;
 |manager3@example.org &lt;br /&gt;
 |-&lt;br /&gt;
 |manager4@example.org &lt;br /&gt;
 |}&lt;br /&gt;
||&lt;br /&gt;
 {|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
 |marketeer1@example.org &lt;br /&gt;
 |- &lt;br /&gt;
 |marketeer2@example.org&lt;br /&gt;
 |-&lt;br /&gt;
 |marketeer3@example.org &lt;br /&gt;
 |-&lt;br /&gt;
 |marketeer4@example.org &lt;br /&gt;
 |}&lt;br /&gt;
||&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
 |saleswoman1@example.org &lt;br /&gt;
 |- &lt;br /&gt;
 |salesman1@example.org&lt;br /&gt;
 |-&lt;br /&gt;
 |saleswoman2@example.org &lt;br /&gt;
 |-&lt;br /&gt;
 |alesman2@example.org &lt;br /&gt;
 |}&lt;br /&gt;
|-&lt;br /&gt;
|Displayed groups ||&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
 |管理 &lt;br /&gt;
 |- &lt;br /&gt;
 |市场&lt;br /&gt;
 |-&lt;br /&gt;
 |销售 &lt;br /&gt;
 |}&lt;br /&gt;
||&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
 |管理 &lt;br /&gt;
 |- &lt;br /&gt;
 |市场&lt;br /&gt;
 |}&lt;br /&gt;
||&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
 |管理 &lt;br /&gt;
 |-&lt;br /&gt;
 |销售 &lt;br /&gt;
 |}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====mod_sic====&lt;br /&gt;
&lt;br /&gt;
本模块增加了对服务器IP检查 ([[XEP-0279]])的支持. 这个协议允许客户端发现它的外部IP地址.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为urn:xmpp:sic:0 IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义了处理原则 .&lt;br /&gt;
&lt;br /&gt;
====mod_stats====&lt;br /&gt;
&lt;br /&gt;
This module adds support for Statistics Gathering (XEP-0039). This protocol allows you to retrieve next statistics from your ejabberd deployment:&lt;br /&gt;
&lt;br /&gt;
* Total number of registered users on the current virtual host (users/total).&lt;br /&gt;
* Total number of registered users on all virtual hosts (users/all-hosts/total).&lt;br /&gt;
* Total number of online users on the current virtual host (users/online).&lt;br /&gt;
* Total number of online users on all virtual hosts (users/all-hosts/online). &lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为统计信息收集 (http://jabber.org/protocol/stats) IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节) 定义了处理原则. &lt;br /&gt;
&lt;br /&gt;
因为只有少量的客户端 (例如 Tkabber) 和软件库支持这个 XEP, 一些例子以 XML 方式给出 ，为了获得统计信息，你需要发送它. 它们是:&lt;br /&gt;
&lt;br /&gt;
* 你可以请求当前虚拟主机 (example.org)的在线用户数量:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;iq to='example.org' type='get'&amp;gt;&lt;br /&gt;
        &amp;lt;query xmlns='http://jabber.org/protocol/stats'&amp;gt;&lt;br /&gt;
          &amp;lt;stat name='users/online'/&amp;gt;&lt;br /&gt;
        &amp;lt;/query&amp;gt;&lt;br /&gt;
      &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 你可以请求所有虚拟主机上注册用户的总数量:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;iq to='example.org' type='get'&amp;gt;&lt;br /&gt;
        &amp;lt;query xmlns='http://jabber.org/protocol/stats'&amp;gt;&lt;br /&gt;
          &amp;lt;stat name='users/all-hosts/total'/&amp;gt;&lt;br /&gt;
        &amp;lt;/query&amp;gt;&lt;br /&gt;
      &amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_time====&lt;br /&gt;
&lt;br /&gt;
本模块功能支持实体时间 ([[XEP-0202]]). 通过使用这个 XEP, 你能发现另一个实体所在位置的时间.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为实体时间 (jabber:iq:time) IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义了处理原则 .&lt;br /&gt;
&lt;br /&gt;
====mod_vcard====&lt;br /&gt;
&lt;br /&gt;
本模块允许最终用户存储和接收他们的电子名片vCard, 以及接收别的用户的电子名片vCards, 定义于 vcard-temp ([[XEP-0054]]). 这个模块也实现了一个基于这些用户的vCards的简单的Jabber用户目录. 进一步的, 当收到请求时它允许服务器发送它自己的名片vCard.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义该服务的Jabber ID. 如果 host 选项没定义, Jabber ID将是该虚拟主机的hostname加前缀‘vjud.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换成真实的虚拟主机名. &lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为vcard-temp IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义了处理原则 . &lt;br /&gt;
'''{search, true|false}'''&lt;br /&gt;
:这个选项定义是否允许搜索功能，如果禁止，选项 host 将被忽略，并且 Jabber用户目录服务将不出现在服务发现条目列表里. 缺省值为true. &lt;br /&gt;
'''{matches, infinity|Number}'''&lt;br /&gt;
:使用这个选项, 搜索结果的数量将被限制. 如果这下选项的值设为 infinity, 所有搜索结果被汇报. 缺省值为 30. &lt;br /&gt;
'''{allow_return_all, false|true}'''&lt;br /&gt;
:这个选项允许你指定是否输入字段为空来进行搜索操作应该返回所有已在他们的vCard中加入信息的用户. 缺省值为 false. &lt;br /&gt;
'''{search_all_hosts, true|false}'''&lt;br /&gt;
:如果这个选项设为 true, 搜索操作将应用于所有虚拟主机. 反之只有当前主机将被搜索. 缺省值为 true. 这个选项在 mod_vcard 是可用的, 但是在 mod_vcard_odbc 是不可用的. &lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 在第一种情况下, 搜索结果被限制为20个条目, 当人们做空的搜索时，每个添加了信息到他们的vCard的用户将被列出 , 并且只有当前主机的用户会被返回:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_vcard, [{search, true},&lt;br /&gt;
                     {matches, 20},&lt;br /&gt;
                     {allow_return_all, true},&lt;br /&gt;
                     {search_all_hosts, false}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 第二种情况不同在于，搜索结果是不限制的, 并且所有虚拟主机将被搜索而不是只有当前主机:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_vcard, [{search, true},&lt;br /&gt;
                     {matches, infinity},&lt;br /&gt;
                     {allow_return_all, true}]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_vcard_ldap====&lt;br /&gt;
&lt;br /&gt;
ejabberd能映射LDAP属性到vCard字段. 这个行为在 mod_vcard_ldap 模块实现. 本模块不依赖于验证方法 (见 [[Ejabberd2:安装和操作指南#LDAP|3.2.5]] 节).&lt;br /&gt;
&lt;br /&gt;
经常的 ejabberd 对待 LDAP 像一个只读存储器: 它可能查看数据, 但是不能新建帐号或编辑存储在LDAP里的 vCard. 无论如何, 修改密码是可能的，如果 mod_register 模块激活了并且 LDAP 服务器支持 [http://tools.ietf.org/html/rfc3062 RFC 3062].&lt;br /&gt;
&lt;br /&gt;
mod_vcard_ldap模块有它自己的可选参数. 第一组参数和设定验证方法时的顶极LDAP参数含义相同: ldap_servers, ldap_port, ldap_rootdn, ldap_password, ldap_base, ldap_uids, and ldap_filter. 见 [[Ejabberd2:安装和操作指南#LDAP|3.2.5]] 节查看关于这些选项的详细信息. 如果这些选项中的一个没有设置, ejabberd将以相同哦功能名字查找顶极选项.&lt;br /&gt;
&lt;br /&gt;
第二组参数包括以下的 mod_vcard_ldap-专有 选项:&lt;br /&gt;
&lt;br /&gt;
'''{host, HostName}'''&lt;br /&gt;
:这个选项定义该服务的Jabber ID. 如果 host 选项没定义, Jabber ID将是该虚拟主机的hostname加上前缀‘vjud.’. 关键字 &amp;quot;@HOST@&amp;quot; 在启动时被替换成真实的虚拟主机名. &lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为 vcard-temp IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义了处理原则 . &lt;br /&gt;
'''{search, true|false}'''&lt;br /&gt;
:这个选项指定是否搜索功能被允许(值: true) 或禁止(值: false). 如果禁止, 选项 host 将被忽略，并且Jabber用户目录服务将不出现在服务发现条目列表里. 缺省值为 true. &lt;br /&gt;
'''{matches, infinity|Number}'''&lt;br /&gt;
:使用这个选项, 搜索结果的数量被限制. 如果该选项值设为 infinity, 所有结果被汇报. 缺省值为 30. &lt;br /&gt;
'''{ldap_vcard_map, [ {Name, Pattern, LDAPattributes}, ...]}'''&lt;br /&gt;
:使用此选项，你可以设置一个表，映射LDAP属性到vCard字段. Name是 vCard 的类型名，定义于 [http://tools.ietf.org/html/rfc2426 RFC 2426]. Pattern是一个字符串，包含 pattern 变量 &amp;quot;%u&amp;quot;, &amp;quot;%d&amp;quot; 或 &amp;quot;%s&amp;quot;. LDAPattributes 是包含LDAP属性的列表. pattern变量 &amp;quot;%s&amp;quot; 将被从 List_of_LDAP_attributes顺序替换成 LDAP 属性值, &amp;quot;%u&amp;quot; 将被替换成一个JID的user部分, 而&amp;quot;%d&amp;quot; 将被替换成一个JID的domain部分. 缺省为:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    [{&amp;quot;NICKNAME&amp;quot;, &amp;quot;%u&amp;quot;, []},&lt;br /&gt;
     {&amp;quot;FN&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;displayName&amp;quot;]},&lt;br /&gt;
     {&amp;quot;LAST&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;sn&amp;quot;]},&lt;br /&gt;
     {&amp;quot;FIRST&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;givenName&amp;quot;]},&lt;br /&gt;
     {&amp;quot;MIDDLE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;initials&amp;quot;]},&lt;br /&gt;
     {&amp;quot;ORGNAME&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;o&amp;quot;]},&lt;br /&gt;
     {&amp;quot;ORGUNIT&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;ou&amp;quot;]},&lt;br /&gt;
     {&amp;quot;CTRY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;c&amp;quot;]},&lt;br /&gt;
     {&amp;quot;LOCALITY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;l&amp;quot;]},&lt;br /&gt;
     {&amp;quot;STREET&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;street&amp;quot;]},&lt;br /&gt;
     {&amp;quot;REGION&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;st&amp;quot;]},&lt;br /&gt;
     {&amp;quot;PCODE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;postalCode&amp;quot;]},&lt;br /&gt;
     {&amp;quot;TITLE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;title&amp;quot;]},&lt;br /&gt;
     {&amp;quot;URL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;labeleduri&amp;quot;]},&lt;br /&gt;
     {&amp;quot;DESC&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;description&amp;quot;]},&lt;br /&gt;
     {&amp;quot;TEL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;telephoneNumber&amp;quot;]},&lt;br /&gt;
     {&amp;quot;EMAIL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;mail&amp;quot;]},&lt;br /&gt;
     {&amp;quot;BDAY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;birthDay&amp;quot;]},&lt;br /&gt;
     {&amp;quot;ROLE&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;employeeType&amp;quot;]},&lt;br /&gt;
     {&amp;quot;PHOTO&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;jpegPhoto&amp;quot;]}]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''{ldap_search_fields, [ {Name, Attribute}, ...]}'''&lt;br /&gt;
:这个选项定义搜索表单和参与搜索的LDAP属性. Name 是搜索表单字段的名字，它将使用翻译文件自动翻译 (查看 msgs/*.msg 找寻可用的单词). Attribute 是LDAP属性或 pattern &amp;quot;%u&amp;quot;. 缺省值是:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    [{&amp;quot;User&amp;quot;, &amp;quot;%u&amp;quot;},&lt;br /&gt;
     {&amp;quot;Full Name&amp;quot;, &amp;quot;displayName&amp;quot;},&lt;br /&gt;
     {&amp;quot;Given Name&amp;quot;, &amp;quot;givenName&amp;quot;},&lt;br /&gt;
     {&amp;quot;Middle Name&amp;quot;, &amp;quot;initials&amp;quot;},&lt;br /&gt;
     {&amp;quot;Family Name&amp;quot;, &amp;quot;sn&amp;quot;},&lt;br /&gt;
     {&amp;quot;Nickname&amp;quot;, &amp;quot;%u&amp;quot;},&lt;br /&gt;
     {&amp;quot;Birthday&amp;quot;, &amp;quot;birthDay&amp;quot;},&lt;br /&gt;
     {&amp;quot;Country&amp;quot;, &amp;quot;c&amp;quot;},&lt;br /&gt;
     {&amp;quot;City&amp;quot;, &amp;quot;l&amp;quot;},&lt;br /&gt;
     {&amp;quot;Email&amp;quot;, &amp;quot;mail&amp;quot;},&lt;br /&gt;
     {&amp;quot;Organization Name&amp;quot;, &amp;quot;o&amp;quot;},&lt;br /&gt;
     {&amp;quot;Organization Unit&amp;quot;, &amp;quot;ou&amp;quot;}]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''{ldap_search_reported, [ {SearchField, VcardField}, ...]}'''&lt;br /&gt;
:这个选项定义哪个搜索字段应该汇报. SearchField 是一个搜索表单的字段名，它将使用翻译文件自动翻译 (去 msgs/*.msg 查看可用的单词). VcardField 是vCard 字段名，定义于 ldap_vcard_map 选项. 缺省为:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
    [{&amp;quot;Full Name&amp;quot;, &amp;quot;FN&amp;quot;},&lt;br /&gt;
     {&amp;quot;Given Name&amp;quot;, &amp;quot;FIRST&amp;quot;},&lt;br /&gt;
     {&amp;quot;Middle Name&amp;quot;, &amp;quot;MIDDLE&amp;quot;},&lt;br /&gt;
     {&amp;quot;Family Name&amp;quot;, &amp;quot;LAST&amp;quot;},&lt;br /&gt;
     {&amp;quot;Nickname&amp;quot;, &amp;quot;NICKNAME&amp;quot;},&lt;br /&gt;
     {&amp;quot;Birthday&amp;quot;, &amp;quot;BDAY&amp;quot;},&lt;br /&gt;
     {&amp;quot;Country&amp;quot;, &amp;quot;CTRY&amp;quot;},&lt;br /&gt;
     {&amp;quot;City&amp;quot;, &amp;quot;LOCALITY&amp;quot;},&lt;br /&gt;
     {&amp;quot;Email&amp;quot;, &amp;quot;EMAIL&amp;quot;},&lt;br /&gt;
     {&amp;quot;Organization Name&amp;quot;, &amp;quot;ORGNAME&amp;quot;},&lt;br /&gt;
     {&amp;quot;Organization Unit&amp;quot;, &amp;quot;ORGUNIT&amp;quot;}]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例子:&lt;br /&gt;
&lt;br /&gt;
* 假设 ldap.example.org 是我们的一个LDAP服务器的名字. 我们有用户，他们的密码在 &amp;quot;ou=Users,dc=example,dc=org&amp;quot; 目录. 同时我们也有地址簿 addressbook, 它包含用户的 emails 和他们的其他信息， 在 &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot; 目录. 相应的验证节应该看起来是这样:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      %% 验证方法&lt;br /&gt;
      {auth_method, ldap}.&lt;br /&gt;
      %% 我们的LDAP服务器的DNS名&lt;br /&gt;
      {ldap_servers, [&amp;quot;ldap.example.org&amp;quot;]}.&lt;br /&gt;
      %% 我们想授权的用户仅为 'shadowAccount' object class&lt;br /&gt;
      {ldap_filter, &amp;quot;(objectClass=shadowAccount)&amp;quot;}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;现在我们想使用用户的 LDAP-信息 作为他们的 vCards. 我们在我们的 LDAP schema定义了四个属性: &amp;quot;mail&amp;quot; — emai地址, &amp;quot;givenName&amp;quot; — 名, &amp;quot;sn&amp;quot; — 姓, &amp;quot;birthDay&amp;quot; — 生日. 我们也想用户搜索到每个其他人. 让我们看一下如何设置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {modules,&lt;br /&gt;
        ...&lt;br /&gt;
        {mod_vcard_ldap,&lt;br /&gt;
         [&lt;br /&gt;
          %% We use the same server and port, but want to bind anonymously because&lt;br /&gt;
          %% our LDAP server accepts anonymous requests to&lt;br /&gt;
          %% &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot; subtree.&lt;br /&gt;
          {ldap_rootdn, &amp;quot;&amp;quot;},&lt;br /&gt;
          {ldap_password, &amp;quot;&amp;quot;},&lt;br /&gt;
          %% define the addressbook's base&lt;br /&gt;
          {ldap_base, &amp;quot;ou=AddressBook,dc=example,dc=org&amp;quot;},&lt;br /&gt;
          %% uidattr: user's part of JID is located in the &amp;quot;mail&amp;quot; attribute&lt;br /&gt;
          %% uidattr_format: common format for our emails&lt;br /&gt;
          {ldap_uids, [{&amp;quot;mail&amp;quot;,&amp;quot;%u@mail.example.org&amp;quot;}]},&lt;br /&gt;
          %% We have to define empty filter here, because entries in addressbook does not&lt;br /&gt;
          %% belong to shadowAccount object class&lt;br /&gt;
          {ldap_filter, &amp;quot;&amp;quot;},&lt;br /&gt;
          %% Now we want to define vCard pattern&lt;br /&gt;
          {ldap_vcard_map,&lt;br /&gt;
           [{&amp;quot;NICKNAME&amp;quot;, &amp;quot;%u&amp;quot;, []}, % just use user's part of JID as his nickname&lt;br /&gt;
            {&amp;quot;FIRST&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;givenName&amp;quot;]},&lt;br /&gt;
            {&amp;quot;LAST&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;sn&amp;quot;]},&lt;br /&gt;
            {&amp;quot;FN&amp;quot;, &amp;quot;%s, %s&amp;quot;, [&amp;quot;sn&amp;quot;, &amp;quot;givenName&amp;quot;]}, % example: &amp;quot;Smith, John&amp;quot;&lt;br /&gt;
            {&amp;quot;EMAIL&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;mail&amp;quot;]},&lt;br /&gt;
            {&amp;quot;BDAY&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;birthDay&amp;quot;]}]},&lt;br /&gt;
          %% Search form&lt;br /&gt;
          {ldap_search_fields,&lt;br /&gt;
           [{&amp;quot;User&amp;quot;, &amp;quot;%u&amp;quot;},&lt;br /&gt;
            {&amp;quot;Name&amp;quot;, &amp;quot;givenName&amp;quot;},&lt;br /&gt;
            {&amp;quot;Family Name&amp;quot;, &amp;quot;sn&amp;quot;},&lt;br /&gt;
            {&amp;quot;Email&amp;quot;, &amp;quot;mail&amp;quot;},&lt;br /&gt;
            {&amp;quot;Birthday&amp;quot;, &amp;quot;birthDay&amp;quot;}]},&lt;br /&gt;
          %% vCard fields to be reported&lt;br /&gt;
          %% Note that JID is always returned with search results&lt;br /&gt;
          {ldap_search_reported,&lt;br /&gt;
           [{&amp;quot;Full Name&amp;quot;, &amp;quot;FN&amp;quot;},&lt;br /&gt;
            {&amp;quot;Nickname&amp;quot;, &amp;quot;NICKNAME&amp;quot;},&lt;br /&gt;
            {&amp;quot;Birthday&amp;quot;, &amp;quot;BDAY&amp;quot;}]}&lt;br /&gt;
        ]}&lt;br /&gt;
        ...&lt;br /&gt;
      }.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:注意 mod_vcard_ldap 模块在LDAP搜索用户的信息之前会先检查用户是否存在.&lt;br /&gt;
&lt;br /&gt;
* ldap_vcard_map 例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {ldap_vcard_map,&lt;br /&gt;
       [{&amp;quot;NICKNAME&amp;quot;, &amp;quot;%u&amp;quot;, []},&lt;br /&gt;
        {&amp;quot;FN&amp;quot;, &amp;quot;%s&amp;quot;, [&amp;quot;displayName&amp;quot;]},&lt;br /&gt;
        {&amp;quot;CTRY&amp;quot;, &amp;quot;Russia&amp;quot;, []},&lt;br /&gt;
        {&amp;quot;EMAIL&amp;quot;, &amp;quot;%u@%d&amp;quot;, []},&lt;br /&gt;
        {&amp;quot;DESC&amp;quot;, &amp;quot;%s\n%s&amp;quot;, [&amp;quot;title&amp;quot;, &amp;quot;description&amp;quot;]}&lt;br /&gt;
       ]},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ldap_search_fields 例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {ldap_search_fields,&lt;br /&gt;
       [{&amp;quot;User&amp;quot;, &amp;quot;uid&amp;quot;},&lt;br /&gt;
        {&amp;quot;Full Name&amp;quot;, &amp;quot;displayName&amp;quot;},&lt;br /&gt;
        {&amp;quot;Email&amp;quot;, &amp;quot;mail&amp;quot;}&lt;br /&gt;
       ]},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ldap_search_reported 例子:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {ldap_search_reported,&lt;br /&gt;
       [{&amp;quot;Full Name&amp;quot;, &amp;quot;FN&amp;quot;},&lt;br /&gt;
        {&amp;quot;Email&amp;quot;, &amp;quot;EMAIL&amp;quot;},&lt;br /&gt;
        {&amp;quot;Birthday&amp;quot;, &amp;quot;BDAY&amp;quot;},&lt;br /&gt;
        {&amp;quot;Nickname&amp;quot;, &amp;quot;NICKNAME&amp;quot;}&lt;br /&gt;
       ]},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====mod_vcard_xupdate====&lt;br /&gt;
&lt;br /&gt;
用户的客户端能在该用户的vCard存储一个头像. 基于vCard的头像 协议 ([[XEP-0153]]) 提供了一个方法给客户端来通知联系人他的头像的哈希值. 然而, 简单或小的客户端可能没有实现那个协议.&lt;br /&gt;
&lt;br /&gt;
如果本模块被激活, 所有出站的客户端出席信息节代替客户端自动获得头像哈希值. 所以, 联系人收到这个带有更新数据的出席信息节(见 [[XEP-0153]])，就好像客户端自己把它插入进去的一样. 如果客户端已经在出席信息节里包含了这样的元素, 它被替换成 ejabberd 生成的元素.&lt;br /&gt;
&lt;br /&gt;
通过激活本模块, 每次 vCard 修改就重新进行一次哈希值计算, 每个由客户端发送的出席信息导致一次哈希值接收，以及一次出席信息节的重写. 因此, 激活本模块将在服务器发生一些计算开销，如果客户端频繁修改他们的出席信息的话.&lt;br /&gt;
&lt;br /&gt;
====mod_version====&lt;br /&gt;
&lt;br /&gt;
本模块实现软件版本([[XEP-0092]]). 所以, 当被查询时它应答 ejabberd 的版本.&lt;br /&gt;
&lt;br /&gt;
选项:&lt;br /&gt;
&lt;br /&gt;
'''{show_os, true|false}'''&lt;br /&gt;
:是否应该显示操作系统. 缺省值是 true. &lt;br /&gt;
'''{iqdisc, Discipline}'''&lt;br /&gt;
:这为软件版本(jabber:iq:version) IQ queries (见 [[Ejabberd2:安装和操作指南#iqdisc|3.3.2]] 节)定义了处理原则 .&lt;br /&gt;
&lt;br /&gt;
==管理ejabberd服务器==&lt;br /&gt;
===ejabberdctl===&lt;br /&gt;
&lt;br /&gt;
使用ejabberdctl命令行管理脚本，你可以执行ejabberdctl命令(详见下一节, [[Ejabberd2:安装和操作指南#ejabberdctl命令|4.1.1]]) 和一些普通的 ejabberd 命令 (详见 [[[[Ejabberd2:安装和操作指南#ejabberd命令|4.2]]). 这意味着你可以在一个本地或远程ejabberd服务器(通过提供参数 --node NODENAME)上启动，停止以及执行一些其他的管理任务.&lt;br /&gt;
&lt;br /&gt;
ejabberdctl脚本可在文件 ejabberdctl.cfg 里配置. 这个文件包含每个可配置的选项的详细的信息. 见 [[Ejabberd2:安装和操作指南#Erlang运行时系统|4.1.2]] 节.&lt;br /&gt;
&lt;br /&gt;
ejabberdctl脚本返回数字状态码. 成功显示为 0, 错误显示为 1, 其它码可被用于特定结果. 这可以由其他脚本使用，来自动决定一个命令是否成功, 例如使用: echo $?&lt;br /&gt;
&lt;br /&gt;
====ejabberdctl命令====&lt;br /&gt;
&lt;br /&gt;
不带任何参数执行 ejabberdctl时, 它显示可用的选项. 如果没有一个 ejabberd 服务器在运行, 可用的参数是:&lt;br /&gt;
&lt;br /&gt;
'''start'''&lt;br /&gt;
:以后台模式启动ejabberd. 这是缺省方法. &lt;br /&gt;
'''debug'''&lt;br /&gt;
:连接一个 Erlang shell 到一个已存在的 ejabberd 服务器. 这允许在ejabberd服务器上执行交互命令. &lt;br /&gt;
'''live'''&lt;br /&gt;
:以live模式启动 ejabberd: shell 保持连接到已启动的服务器, 显示日志信息并允许执行交互命令. &lt;br /&gt;
&lt;br /&gt;
如果已经有一个ejabberd服务器在系统里运行, ejabberdctl 展示以下 ejabberdctl 命令以及那台服务器上所有可用的 ejabberd 命令 (见 [[Ejabberd2:安装和操作指南#ejabberd命令|4.2.1]] 节).&lt;br /&gt;
&lt;br /&gt;
ejabberdctl命令如下:&lt;br /&gt;
&lt;br /&gt;
'''help'''&lt;br /&gt;
:获得关于ejabberdctl或任何可用的命令的帮助. 试下 ejabberdctl help help. &lt;br /&gt;
'''status'''&lt;br /&gt;
:检查ejabberd服务器的状态. &lt;br /&gt;
'''stop'''&lt;br /&gt;
:停止ejabberd服务器. &lt;br /&gt;
'''restart'''&lt;br /&gt;
:重启ejabberd服务器. &lt;br /&gt;
'''mnesia'''&lt;br /&gt;
:获得关于Mnesia数据库的信息. &lt;br /&gt;
&lt;br /&gt;
ejabberdctl脚本可被限制为需要验证并执行一些 ejabberd命令; 见 [[Ejabberd2:安装和操作指南#用AccessCommands限制执行|4.2.2]] 节. 增加这个选项到文件 ejabberd.cfg. 在这个例子没有限制:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{ejabberdctl_access_commands, []}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果账号 robot1@example.org 被注册到 ejabberd ，以密码 abcdef (使用 MD5 为 E8B501798950FC58AAD83C8C14978E), 并且 ejabberd.cfg 包含以下设定:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
{acl, bots, {user, &amp;quot;robot1&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
{access, ctlaccess, [{allow, bots}]}.&lt;br /&gt;
{ejabberdctl_access_commands, [ {ctlaccess, [registered_users, register], []} ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
那么你可以在 shell 里做这个:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ejabberdctl registered_users example.org&lt;br /&gt;
Error: no_auth_provided&lt;br /&gt;
$ ejabberdctl --auth robot1 example.org E8B501798950FC58AAD83C8C14978E registered_users example.org&lt;br /&gt;
robot1&lt;br /&gt;
testuser1&lt;br /&gt;
testuser2&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Erlang运行时系统====&lt;br /&gt;
&lt;br /&gt;
ejabberd是一个 Erlang/OTP 应用，运行在一个Erlang运行时系统内部. 这个系统是用环境变量和命令行参数来配置的. ejabberdctl管理脚本可能会使用其中的一些. 你可以在ejabberdctl.cfg文件里配置其中的一部分, 里面已包含了关于它们的详细描述. 本节描述所有环境变量和命令行参数的参考.&lt;br /&gt;
&lt;br /&gt;
环境变量:&lt;br /&gt;
&lt;br /&gt;
'''EJABBERD_CONFIG_PATH'''&lt;br /&gt;
:ejabberd配置文件的路径. &lt;br /&gt;
'''EJABBERD_MSGS_PATH'''&lt;br /&gt;
:翻译字符串的目录路径. &lt;br /&gt;
'''EJABBERD_LOG_PATH'''&lt;br /&gt;
:ejabberd服务日志文件的路径. &lt;br /&gt;
'''EJABBERD_SO_PATH'''&lt;br /&gt;
:二进制系统库的目录路径. &lt;br /&gt;
'''EJABBERD_DOC_PATH'''&lt;br /&gt;
:ejabberd文档的目录路径. &lt;br /&gt;
'''EJABBERD_PID_PATH'''&lt;br /&gt;
:ejabberd启动时建立的PID文件的路径. &lt;br /&gt;
'''HOME'''&lt;br /&gt;
:ejabberd的家Home目录的路径. 这个路径用于读取文件 .erlang.cookie. &lt;br /&gt;
'''ERL_CRASH_DUMP'''&lt;br /&gt;
:崩溃报告dump文件的路径. &lt;br /&gt;
'''ERL_INETRC'''&lt;br /&gt;
:指示使用名字解析的哪个IP. 如果使用 -sname, 要么指定这个选项，要么指定 -kernel inetrc filepath. &lt;br /&gt;
'''ERL_MAX_PORTS'''&lt;br /&gt;
:并发开放的Erlang端口的最大数量. &lt;br /&gt;
'''ERL_MAX_ETS_TABLES'''&lt;br /&gt;
:ETS和Mnesia表的最大数量. &lt;br /&gt;
&lt;br /&gt;
命令行参数:&lt;br /&gt;
&lt;br /&gt;
'''-sname ejabberd'''&lt;br /&gt;
:这个Erlang节点将只使用主机名的第一部分来指定, 即，本域之外的其他Erlang节点不能够联系联络这个节点. 在大多数情况下这是可取的. &lt;br /&gt;
'''-name ejabberd'''&lt;br /&gt;
:这个Erlang节点将被完全指定. 这只在如果你计划在不同的网络配置一个ejabberd集群时有用. &lt;br /&gt;
'''-kernel inetrc ’&amp;quot;/etc/ejabberd/inetrc&amp;quot;’'''&lt;br /&gt;
:指出使用名字解析的哪个IP. 如果使用 -sname, 要么指定这个选项，要么指定 ERL_INETRC. &lt;br /&gt;
'''-kernel inet_dist_listen_min 4200 inet_dist_listen_min 4210'''&lt;br /&gt;
:定义 epmd ( [[Ejabberd2:安装和操作指南#epmd|5.2]] 节)可以监听的第一个和最后一个端口. &lt;br /&gt;
'''-detached'''&lt;br /&gt;
:启动Erlang系统并从系统控制台分离. 运行守护进程和后台进程时有用. &lt;br /&gt;
'''-noinput'''&lt;br /&gt;
:确保Erlang系统不尝试读任何输入. 运行守护进程和后台进程时有用. &lt;br /&gt;
'''-pa /var/lib/ejabberd/ebin'''&lt;br /&gt;
:指定Erlang二进制文件(*.beam)所在目录. &lt;br /&gt;
'''-s ejabberd'''&lt;br /&gt;
:告诉Erlang运行时系统启动ejabberd应用. &lt;br /&gt;
'''-mnesia dir ’&amp;quot;/var/lib/ejabberd/&amp;quot;’'''&lt;br /&gt;
:指定Mnesia数据库目录. &lt;br /&gt;
'''-sasl sasl_error_logger {file, &amp;quot;/var/log/ejabberd/erlang.log&amp;quot;}'''&lt;br /&gt;
:Erlang/OTP系统日志文件的路径. 这里SASL意味着 系统架构支持库“System Architecture Support Libraries” 而不是 简单验证和安全层 “Simple Authentication and Security Layer”. &lt;br /&gt;
'''+K [true|false]'''&lt;br /&gt;
:内核轮询. &lt;br /&gt;
'''-smp [auto|enable|disable]'''&lt;br /&gt;
:SMP(多CPU)支持. &lt;br /&gt;
'''+P 250000'''&lt;br /&gt;
:Erlang进程的最大数量. &lt;br /&gt;
'''-remsh ejabberd@localhost'''&lt;br /&gt;
:在一个远程Erlang节点打开一个Erlang shell. &lt;br /&gt;
'''-hidden'''&lt;br /&gt;
:到其他节点的连接是隐藏的(没有公开发布). 结果是这个节点不被认为是集群的一部分. 当启动一个临时的ctl或debug节点的时候这是很重要的. &lt;br /&gt;
&lt;br /&gt;
注意当使用shell脚本的时候一些字符需要逃逸, 例如 &amp;quot; 和 {}. 你可在Erlang手册页 (erl -man erl)找到其他选项.&lt;br /&gt;
&lt;br /&gt;
===ejabberd命令===&lt;br /&gt;
&lt;br /&gt;
一个ejabberd命令是一个通过名字指定的抽象函数, 在ejabberd_commands 服务里注册并有一个已定义的编号和出入和输出类型. 那些命令能被定义在任何Erlang模块并使用任何合法的前端执行.&lt;br /&gt;
&lt;br /&gt;
ejabberd包含一个前端用来执行ejabberd命令: 脚本ejabberdctl. 其他可被安装以不同方式来执行ejabberd命令的已知的前端有: ejabberd_xmlrpc (XML-RPC 服务), mod_rest (HTTP POST 服务), mod_shcommands (ejabberd WebAdmin 页面).&lt;br /&gt;
&lt;br /&gt;
====ejabberd命令清单====&lt;br /&gt;
&lt;br /&gt;
ejabberd缺省包含了一些ejabberd命令. 当更多模块被安装, 在前端又会有新命令可以用.&lt;br /&gt;
&lt;br /&gt;
获得可用命令和它们的帮助的最容易的方法, 是使用ejabberdctl脚本:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ejabberdctl help&lt;br /&gt;
Usage: ejabberdctl [--node nodename] [--auth user host password] command [options]&lt;br /&gt;
&lt;br /&gt;
Available commands in this ejabberd node:&lt;br /&gt;
  backup file                  Store the database to backup file&lt;br /&gt;
  connected_users              List all established sessions&lt;br /&gt;
  connected_users_number       Get the number of established sessions&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最多人感兴趣的是:&lt;br /&gt;
&lt;br /&gt;
'''reopen_log'''&lt;br /&gt;
:在日志文件改名之后重新打开它们. 如果在调用此命令之前旧文件没有被改名, 它们自动改名为 &amp;quot;*-old.log&amp;quot;. 见 [[Ejabberd2:安装和操作指南#日志文件|7.1]] 节. &lt;br /&gt;
'''backup ejabberd.backup'''&lt;br /&gt;
:存储内部的 Mnesia 数据库到一个二进制备份文件. &lt;br /&gt;
'''restore ejabberd.backup'''&lt;br /&gt;
:立刻从一个二进制文件恢复内部的 Mnesia 数据库. 如果你有一个很大的数据库，这将消耗很多内存, 所以最好使用 install_fallback. &lt;br /&gt;
'''install_fallback ejabberd.backup'''&lt;br /&gt;
:安装成fallback的二进制备份文件: 它将在下一次ejabberd启动的时候被用于恢复数据库. 这意味着, 在运行这个命令之后, 你不得不重启 ejabberd. 这个命令比restore需要更少的内存. &lt;br /&gt;
'''dump ejabberd.dump'''&lt;br /&gt;
:Dump内部的 Mnesia 数据库到一个文本文件 dump. &lt;br /&gt;
'''load ejabberd.dump'''&lt;br /&gt;
:立刻从一个文本文件dump恢复. 这不建议用于大数据库, 因为它将消耗很多时间, 内存和cpu. 在那种情况下，它适合使用 backup 和 install_fallback. &lt;br /&gt;
'''import_piefxis, export_piefxis, export_piefxis_host'''&lt;br /&gt;
:这些选项可被用于迁移帐户，使用 [http://xmpp.org/extensions/xep-0227.html XEP-0227] 格式的 XML文件 从/到 另外一个 Jabber/XMPP 服务器或转移一个虚拟主机的用户到另一个 ejabberd 安装环境. 也见于 [https://support.process-one.net/doc/display/MESSENGER/ejabberd+migration+kit ejabberd迁移工具]. &lt;br /&gt;
'''import_file, import_dir'''&lt;br /&gt;
:这些选项可被用于迁移使用jabberd1.4格式的XML文件的帐户, 从其他 Jabber/XMPP 服务器. 已经有 [http://www.ejabberd.im/migrate-to-ejabberd 从其他软件迁移到ejabberd]的教程. &lt;br /&gt;
'''delete_expired_messages'''&lt;br /&gt;
:这个选项可被用于删除旧的离线消息. 当离线消息数量非常高的时候有用. &lt;br /&gt;
'''delete_old_messages days'''&lt;br /&gt;
:删除指定天数之前的离线消息. &lt;br /&gt;
'''register user host password'''&lt;br /&gt;
:在那个域以给定的密码注册一个帐号. &lt;br /&gt;
'''unregister user host'''&lt;br /&gt;
:注销给定帐号.&lt;br /&gt;
&lt;br /&gt;
====以AccessCommands限制执行====&lt;br /&gt;
&lt;br /&gt;
前端可能被配置成限制访问特定的命令. 在那种情况下, 必须提供验证信息. 在每个前端，AccessCommands 选项被定义在不同的地方. 但是所有情况下这个选项的语法都是相同的:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
AccessCommands = [ {Access, CommandNames, Arguments}, ...]&lt;br /&gt;
Access = atom()&lt;br /&gt;
CommandNames = all | [CommandName]&lt;br /&gt;
CommandName = atom()&lt;br /&gt;
Arguments = [ {ArgumentName, ArgumentValue}, ...]&lt;br /&gt;
ArgumentName = atom()&lt;br /&gt;
ArgumentValue = any()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
缺省值是不定义任何限制: []. 当执行一个命令时提供验证信息, 为一个被允许执行相应命令的本地XMPP帐号的 Username, Hostname 和 Password . 这意味着这个帐号必须在本地ejabberd已经注册, 因为这个信息将被验证. 可能提供纯文本密码或它的 MD5 哈希值.&lt;br /&gt;
&lt;br /&gt;
当定义了一个或多个访问限制，并且提供了验证信息, 每个限制被验证直到某人完全符合: 这个帐号和 Access rule匹配, 命令名字列于 CommandNames 之中, 并且提供的参数和Arguments不抵触.&lt;br /&gt;
&lt;br /&gt;
以下例子用来理解这个语法, 让我们假设那些选项:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
{acl, bots, {user, &amp;quot;robot1&amp;quot;, &amp;quot;example.org&amp;quot;}}.&lt;br /&gt;
{access, commaccess, [{allow, bots}]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
访问限制的列表只允许 robot1@example.org 执行所有命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[{commaccess, all, []}]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
看看另一个限制列表 (相应的 ACL 和 ACCESS 没有显式):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
 %% 这个 bot 能执行所有命令:&lt;br /&gt;
 {bot, all, []},&lt;br /&gt;
 %% 这个 bot 只能执行命令 'dump'. 不限制参数:&lt;br /&gt;
 {bot_backups, [dump], []}&lt;br /&gt;
 %% 这个 bot 可执行所有命令,&lt;br /&gt;
 %% 但是如果使用 'host' 参数, 它必须是 &amp;quot;example.org&amp;quot;:&lt;br /&gt;
 {bot_all_example, all, [{host, &amp;quot;example.org&amp;quot;}]},&lt;br /&gt;
 %% 这个 bot 只能执行命令 'register',&lt;br /&gt;
 %% 并且如果使用参数 'host' , 它必须是 &amp;quot;example.org&amp;quot;:&lt;br /&gt;
 {bot_reg_example, [register], [{host, &amp;quot;example.org&amp;quot;}]},&lt;br /&gt;
 %% 这个 bot 能执行命令 'register' 和 'unregister',&lt;br /&gt;
 %% 如果使用参数 host , 它必须是 &amp;quot;test.org&amp;quot;:&lt;br /&gt;
 {_bot_reg_test, [register, unregister], [{host, &amp;quot;test.org&amp;quot;}]}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Web管理===&lt;br /&gt;
&lt;br /&gt;
ejabberd Web管理允许使用web浏览器管理大部分ejabberd.&lt;br /&gt;
&lt;br /&gt;
这个功能缺省是激活的: 一个使用选项 web_admin (见 [[Ejabberd2:安装和操作指南#监听端口|3.1.3]] 节)的 ejabberd_http 监听者被包含在监听的端口里. 然后你可以在你中意的wen浏览器里打开 http://server:port/admin/ . 你将被要求键入一个拥有管理员权限的ejabberd用户的 username (全 Jabber ID) 和 password . 在验证之后你将看到一个页面类似 figure 4.1.&lt;br /&gt;
    &lt;br /&gt;
:''webadmmain.png''&lt;br /&gt;
:''Figure 4.1: Top page from the Web Admin''&lt;br /&gt;
&lt;br /&gt;
这里你可以编辑访问限制, 管理用户, 建立备份, 管理数据库, 允许/禁止 监听的端口, 查看服务器统计数据,…&lt;br /&gt;
&lt;br /&gt;
access rule 配置决定那些帐号可以访问Web管理以及修改它. access rule webadmin_view 仅被赋予查看权限: 那些帐号能以只读方式浏览Web管理.&lt;br /&gt;
&lt;br /&gt;
示例配置:&lt;br /&gt;
&lt;br /&gt;
* 你可以把Web管理伺服于和HTTP 轮询界面相同的端口. 在这个了例子里你应该把你的web浏览器指向 http://example.org:5280/admin/ 来管理所有虚拟主机或指向 http://example.org:5280/admin/server/example.com/ 来管理虚拟主机 example.com. 在你访问Web管理之前你需要键入从一个被允许配置ejabberd的已注册的用户那里得到的 username, JID 和 password . 在这个例子里你可键入 username ‘admin@example.net’ 来管理所有虚拟主机 (第一个 URL). 如果你以‘admin@example.com’登录到http://example.org:5280/admin/server/example.com/ ，你只能管理虚拟主机 example.com. 帐号‘reviewer@example.com’可以只读模式浏览虚拟主机.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {acl, admins, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.net&amp;quot;}}.&lt;br /&gt;
      {host_config, &amp;quot;example.com&amp;quot;, [{acl, admins, {user, &amp;quot;admin&amp;quot;, &amp;quot;example.com&amp;quot;}}]}.&lt;br /&gt;
      {host_config, &amp;quot;example.com&amp;quot;, [{acl, viewers, {user, &amp;quot;reviewer&amp;quot;, &amp;quot;example.com&amp;quot;}}]}.&lt;br /&gt;
&lt;br /&gt;
      {access, configure, [{allow, admins}]}.&lt;br /&gt;
      {access, webadmin_view, [{allow, viewers}]}.&lt;br /&gt;
&lt;br /&gt;
      {hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
&lt;br /&gt;
      {listen,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {5280, ejabberd_http, [http_poll, web_admin]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 因为安全的原因, 你可以在一个安全的连接上伺服Web管理, 在一个不同于HTTP轮询接口的端口上, 并把它绑定到内部的局域网IP. 这个Web管理将只能被浏览器从https://192.168.1.1:5282/admin/ 访问:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
      {hosts, [&amp;quot;example.org&amp;quot;]}.&lt;br /&gt;
&lt;br /&gt;
      {listen,&lt;br /&gt;
       [&lt;br /&gt;
        ...&lt;br /&gt;
        {5280, ejabberd_http, [&lt;br /&gt;
                               http_poll&lt;br /&gt;
                              ]},&lt;br /&gt;
        {{5282, &amp;quot;192.168.1.1&amp;quot;}, ejabberd_http, [&lt;br /&gt;
                                                web_admin,&lt;br /&gt;
                                                tls, {certfile, &amp;quot;/usr/local/etc/server.pem&amp;quot;}&lt;br /&gt;
                                               ]},&lt;br /&gt;
        ...&lt;br /&gt;
       ]}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在ejabberd Web管理 特定的页面包含了一个连接到 ejabberd安装和操作指南 的相关章节. 为了显式这些链接, 本指南的一个 HTML 格式的拷贝必须安装在该系统上. 该文件缺省的放在 &amp;quot;/share/doc/ejabberd/guide.html&amp;quot;. 该文档的目录可以被环境变量 EJABBERD_DOC_PATH 指定. 参见 [[Ejabberd2:安装和操作指南#Erlang运行时系统|4.1.2]] 节.&lt;br /&gt;
&lt;br /&gt;
===特设命令===&lt;br /&gt;
&lt;br /&gt;
如果你激活了 mod_configure 和 mod_adhoc, 你可以使用一个 XMPP 客户端在 ejabberd执行很多管理任务. 该客户端必须支持 Ad-Hoc Commands ([http://xmpp.org/extensions/xep-0050.html XEP-0050]), 而你必须以一个拥有适当权限的帐号登录到该 XMPP 服务器.&lt;br /&gt;
&lt;br /&gt;
===修改计算机主机名===&lt;br /&gt;
&lt;br /&gt;
ejabberd使用分布式的 Mnesia 数据库. 作为分布式数据库, Mnesia 强制它的文件一致性, 所以它在它里面存储Erlang节点名 (见 [[Ejabberd2:安装和操作指南#Erlang节点名|5.4]] 节). 一个Erlang节点的名字包含了该计算机的hostname. 所以, 如果你修改ejabberd运行的机器的名字，或当你移动ejabberd到一个不同的机器上，那么Erlang节点名也修改了.&lt;br /&gt;
&lt;br /&gt;
你有两个办法在一个新节点名的 ejabberd 上使用旧的 Mnesia 数据库: 把旧节点名放入 ejabberdctl.cfg, 或转换数据库到为新节点名.&lt;br /&gt;
&lt;br /&gt;
那些例子步骤将备份, 转换并装载 Mnesia 数据库. 你需要要么有旧的 Mnesia spool 目录，要么有一个 Mnesia 的备份. 如果你已经有一个旧的数据库的备份文件, 你可以直接去步骤 5. 你也需要知道旧节点名和新节点名. 如果你不知道它们, 执行ejabberdctl或在ejabberd 日志文件里查找它们.&lt;br /&gt;
&lt;br /&gt;
在开始之前, 设置一些变量:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
OLDNODE=ejabberd@oldmachine&lt;br /&gt;
NEWNODE=ejabberd@newmachine&lt;br /&gt;
OLDFILE=/tmp/old.backup&lt;br /&gt;
NEWFILE=/tmp/new.backup&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. 强制以旧节点名启动 ejabberd :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl --node $OLDNODE start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. 生成一个备份文件:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl --node $OLDNODE backup $OLDFILE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 停止旧节点:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl --node $OLDNODE stop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. 确保在 Mnesia spool 目录没有文件 . 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mkdir /var/lib/ejabberd/oldfiles&lt;br /&gt;
      mv /var/lib/ejabberd/*.* /var/lib/ejabberd/oldfiles/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. 启动 ejabberd. 不需要再指定任何节点名:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. 转换备份到新节点名:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl mnesia_change_nodename $OLDNODE $NEWNODE $OLDFILE $NEWFILE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. 安装备份文件作为一个fallback:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl install_fallback $NEWFILE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. 停止 ejabberd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl stop&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:你可能在日志文件看到一个错误信息, 这是正常的, 不要担心:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
      Mnesia(ejabberd@newmachine):&lt;br /&gt;
      ** ERROR ** (ignoring core)&lt;br /&gt;
      ** FATAL ** A fallback is installed and Mnesia must be restarted.&lt;br /&gt;
        Forcing shutdown after mnesia_down from ejabberd@newmachine...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. 现在你可以最后启动 ejabberd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      ejabberdctl start&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. 检查是否旧数据库的信息可用: accounts, rosters... 完成之后, 记住从公共目录删除临时备份文件.&lt;br /&gt;
&lt;br /&gt;
==ejabberd安全==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
当你配置防火墙的时候，你需要注意以下 TCP 端口: &lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!端口 !!描述&lt;br /&gt;
|-&lt;br /&gt;
|5222 ||用于 Jabber/XMPP 客户端连接的标准端口, 纯文本或 STARTTLS.&lt;br /&gt;
|-&lt;br /&gt;
|5223 ||Jabber 客户端使用旧的 SSL 方法连接的标准端口 .&lt;br /&gt;
|-&lt;br /&gt;
|5269 ||用于 Jabber/XMPP 服务器连接的标准端口.&lt;br /&gt;
|-&lt;br /&gt;
|4369 ||EPMD ([[Ejabberd2:安装和操作指南#EPMD|5.2]] 节) 监听Erlang节点名请求.&lt;br /&gt;
|-&lt;br /&gt;
|端口范围 ||用于两个Erlang节点之间的连接. 这个范围是可配置的(见 [[Ejabberd2:安装和操作指南#EPMD|5.2]] 节).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===epmd===&lt;br /&gt;
&lt;br /&gt;
[http://www.erlang.org/doc/man/epmd.html epmd (Erlang端口映射守候进程)] 是一个包含在 Erlang/OTP 里的小的名字服务器，并且在建立分布式 Erlang 通讯时被 Erlang 程序使用. ejabberd 需要 epmd 来使用 ejabberdctl 并且使用集群的ejabberd 节点时也需要它. 这个小的程序是由Erlang自动启动的, 并且永不停止. 如果 ejabberd 停止了, 并且没有任何其他 Erlang 程序运行在系统上, 如果你想的话可以安全地停止 epmd.&lt;br /&gt;
&lt;br /&gt;
ejabberd 运行在一个Erlang节点内部. 为了和 ejabberd 通讯, 脚本 ejabberdctl 启动一个新的 Erlang 节点并连接到这个运行着 ejabberd 的Erlang节点. 为了这个通讯能工作, epmd 必须运行和在端口4369监听名字请求. 你应该在防火墙以这种方式禁止端口4369，即只允许你机器上的程序访问它.&lt;br /&gt;
&lt;br /&gt;
如果你建立了一个许多 ejabberd 实例的集群, 每个 ejabberd 实例被称为一个 ejabberd 节点. 那些 ejabberd 节点使用一个特别的 Erlang 通讯方法来建立集群, 那么 EPMD 再次需要监听端口 4369. 所以, 如果你计划计建立一个 ejabberd 节点的集群，你必须为这个集群涉及的机器打开端口 4369. 记住禁止这个端口使得它无法从互联网访问到.&lt;br /&gt;
&lt;br /&gt;
一旦一个Erlang节点使用EPMD和端口4369解析了另一个Erlang节点的节点名, 节点之间就直接通讯. 在这个情况下使用的端口缺省是随机的, 但是可以在文件 ejabberdctl.cfg里配置. Erlang命令行参数被内部使用, 例如:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
erl ... -kernel inet_dist_listen_min 4370 inet_dist_listen_max 4375&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Erlang Cookie===&lt;br /&gt;
&lt;br /&gt;
Erlang cookie 是一个数字和字母组成的字符串. 一个Erlang节点在启动时从命令行参数 -setcookie 读取cookie. 如果没有指定, 则从 $HOME/.erlang.cookie 读取cookie 文件. 如果这个文件不存在, 它会被立刻以一个随机的cookie建立. 两个Erlang节点只有它们有相同的cookie才会通讯 . 在Erlang节点上设置一个cookie允许你结构化你的Erlang网络并定义哪个节点被允许连接到哪个.&lt;br /&gt;
&lt;br /&gt;
感谢Erlang cookies, 你可以阻止对Erlang节点的错误访问, 例如当同一台机器上有许多Erlang节点运行不同程序的时候.&lt;br /&gt;
&lt;br /&gt;
设置一个安全cookie是一个简单的方法来增加非法访问你的Erlang节点的困难度. 然而, 对于阻止对Erlang节点的未授权访问或侵扰，cookie系统不是最终有效的. Erlang节点之间的通讯是未加密的, 所以 cookie 可能被网络上的探针读取. 推荐使得Erlang更加安全的方法是禁止端口4369.&lt;br /&gt;
&lt;br /&gt;
===Erlang节点名===&lt;br /&gt;
&lt;br /&gt;
一个Erlang节点可以拥有一个节点名. 这个名字可能很短 (如果用命令行参数 -sname 指定) 或很长 (如果用参数 -name 指定). 以 -sname 启动一个Erlang节点限制Erlang节点和LAN之间的通讯.&lt;br /&gt;
&lt;br /&gt;
使用选项 -sname 而不是 -name ，是一个简单增加对你的Erlang节点的未授权访问难度的方法. 然而, 对于阻止对Erlang节点的未授权访问或侵扰，它不是最终有效的. 因为有可能伪装你在另一个网络里使用一个修改过的 Erlang epmd. 推荐使得Erlang更加安全的方法是禁止端口4369.&lt;br /&gt;
&lt;br /&gt;
===敏感文件安全===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ejabberd在文件系统里存储敏感数据要么使用纯文本要么是二进制文件. 文件系统许可应被设置为只允许适当的用户读, 写和执行那些文件和目录.&lt;br /&gt;
&lt;br /&gt;
'''ejabberd configuration file: /etc/ejabberd/ejabberd.cfg'''&lt;br /&gt;
:包含外部组件的管理员的 JID 和密码. 备份文件可能也包含这个信息, 所以整个 /etc/ejabberd/ 目录的安全是必要的. &lt;br /&gt;
'''ejabberd service log: /var/log/ejabberd/ejabberd.log'''&lt;br /&gt;
:包含客户端的IP地址. 如果 loglevel 设为 5, 它包含全部的会话和密码. 如果使用了一个 logrotate 系统, 可能有好几个日志文件拥有类似的信息, 所以整个 /var/log/ejabberd/ 目录的安全是必要的. &lt;br /&gt;
'''Mnesia database spool files in /var/lib/ejabberd/'''&lt;br /&gt;
:这个文件存储二进制数据, 但是一些部分仍是可读的. 这个文件由 Mnesia 生成并且它们的许可不能被直接设置, 所以整个 /var/lib/ejabberd/ 目录的安全是必要的. &lt;br /&gt;
'''Erlang cookie file: /var/lib/ejabberd/.erlang.cookie'''&lt;br /&gt;
:见 [[Ejabberd2:安装和操作指南#Erlang Cookie|5.3]] 节.&lt;br /&gt;
&lt;br /&gt;
==集群==&lt;br /&gt;
===如何工作===&lt;br /&gt;
&lt;br /&gt;
一个XMPP域是由一个或多个ejabberd节点伺服的. 这些节点可能运行在通过网络连接的不同的机器上. 它们都必须有能力连接到所有其他节点的4369端口, 并且必须有相同的 magic cookie (见 Erlang/OTP 文档, 换句话说，在所有节点上，文件 ~ejabberd/.erlang.cookie 必须是相同的 ). 这是必须的，因为所有节点交换关于已连接的用户, s2s连接, 已注册的服务, 等等…信息.&lt;br /&gt;
&lt;br /&gt;
每个 ejabberd 节点有意下模块:&lt;br /&gt;
&lt;br /&gt;
* router,&lt;br /&gt;
* local router,&lt;br /&gt;
* session manager,&lt;br /&gt;
* s2s manager. &lt;br /&gt;
&lt;br /&gt;
====Router====&lt;br /&gt;
&lt;br /&gt;
这个模块是每个节点的XMPP包的主router. 它基于它们的目标域来路由它们. 它使用一个全局路由表. 在这个路由表里搜索到包的目的地的域, 并且如果找到, 这个包就被路由到适当的进程. 如果没找到, 它被送到 s2s manager.&lt;br /&gt;
&lt;br /&gt;
====Local Router====&lt;br /&gt;
&lt;br /&gt;
这个模块路由那些目的域等于服务器的主机名之一的包. 如果目的JID有一个空的 user 部分, 它路由到 session manager, 反之则它的处理依赖于它的内容.&lt;br /&gt;
&lt;br /&gt;
====Session Manager====&lt;br /&gt;
&lt;br /&gt;
这个模块路由包到本地用户. 它通过一个出席信息表查找一个包必须被发送给哪个用户资源. 然后该包要么路由到适当的 c2s 进程, 要么存储在离线存储 offline storage, 或弹回.&lt;br /&gt;
&lt;br /&gt;
====s2s Manager====&lt;br /&gt;
&lt;br /&gt;
这个模块路由包到其他 XMPP 服务器. 首先, 它检查是否已存在一个从该包的源域到目的域的s2s连接. 如果有, s2s manager 路由这个包到伺服这个连接的进程, 反之打开一个新的连接.&lt;br /&gt;
&lt;br /&gt;
===集群配置===&lt;br /&gt;
&lt;br /&gt;
假定你已经在一个机器named(第一个)上配置了 ejabberd , 并且你需要配置另外一个来做一个 ejabberd 集群. 那么按以下步骤做:&lt;br /&gt;
&lt;br /&gt;
1. 从第一台机器拷贝 ~ejabberd/.erlang.cookie 文件到第二台机器.&lt;br /&gt;
&lt;br /&gt;
:(或者) 你也可以增加‘-setcookie content_of_.erlang.cookie’选项到以下所有‘erl’ 命令.&lt;br /&gt;
&lt;br /&gt;
2. 在第二台机器上，在ejabberd工作目录中，以 ejabberd 守候进程用户运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      erl -sname ejabberd \&lt;br /&gt;
          -mnesia dir '&amp;quot;/var/lib/ejabberd/&amp;quot;' \&lt;br /&gt;
          -mnesia extra_db_nodes &amp;quot;['ejabberd@first']&amp;quot; \&lt;br /&gt;
          -s mnesia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:这将启动 Mnesia 服务于和 ejabberd@first 相同的数据库. 你可以运行命令 ‘mnesia:info().’检查它. 你应该看到许多远程表和行，类似以下:&lt;br /&gt;
&lt;br /&gt;
:注意: 在你的系统里 Mnesia 目录可能是不同的. 要知道 ejabberd 期望在哪里找到 Mnesia 的缺省安装, 不带参数调用 ejabberdctl 然后它将显式一些帮助, 包括 Mnesia database spool 目录.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      running db nodes   = [ejabberd@first, ejabberd@second]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. 现在在相同的‘erl’会话下运行以下命令:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
      mnesia:change_table_copy_type(schema, node(), disc_copies).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:这将为该数据库建立本地磁盘存储.&lt;br /&gt;
&lt;br /&gt;
:(或者) 在第二个节点通过Web管理修改scheme表的存储类型为‘RAM and disc copy’.&lt;br /&gt;
&lt;br /&gt;
4. 现在你可以增加更多表的复制到这个节点 ，使用‘mnesia:add_table_copy’ 或 ‘mnesia:change_table_copy_type’如上 (只是把 ‘schema’ 替换成其他表名，并且 ‘disc_copies’可以被替换成‘ram_copies’ 或 ‘disc_only_copies’).&lt;br /&gt;
&lt;br /&gt;
:哪个表被复制，依赖于你的需要, 你可以从‘mnesia:info().’命令得到一些提示, 通过查看每个位于 ’first’的表的大小和缺省的存储类型.&lt;br /&gt;
&lt;br /&gt;
复制一个表使得这个节点的这个表的查询更加快速. 写入, 另一方面, 将更慢. 而且当然如果复制之一的机器挂了, 其他复制将被使用.&lt;br /&gt;
&lt;br /&gt;
:看一下 [http://www.erlang.org/doc/apps/mnesia/Mnesia_chap5.html#5.3 Mnesia用户指南的 5.3 节(表 片段)]将有所帮助.&lt;br /&gt;
&lt;br /&gt;
: (或者) 同之前的条目, 但用于不同的表.&lt;br /&gt;
&lt;br /&gt;
5. 运行‘init:stop().’ 或只是 ‘q().’ 退出 Erlang shell. 这可能要花些时间，如果 Mnesia 还没有从first传输和处理完所有数据.&lt;br /&gt;
&lt;br /&gt;
6. 现在在第二台机器上使用和第一台机器类似的配置运行 ejabberd: 你可能不需要重复‘acl’ 和 ‘access’ 选项，因为它们将从第一台机器获得; 并且 mod_irc 只应该在集群里的一台机器上激活. &lt;br /&gt;
&lt;br /&gt;
你可以在其他机器上重复这些步骤来服务于这个域.&lt;br /&gt;
&lt;br /&gt;
===服务负载均衡===&lt;br /&gt;
====组件负载均衡====&lt;br /&gt;
====域负载均衡机制====&lt;br /&gt;
&lt;br /&gt;
ejabberd包含了一个机制来对插入一个ejabberd集群的组件进行负载均衡. 它意味着你可以在每一个ejabberd集群插入相同组件的一个或多个实例并且流量将自动分布.&lt;br /&gt;
&lt;br /&gt;
缺省的分布式机制尝试递送到组件的一个本地实例. 如果有多个本地实例可用, 随机地选取一个实例. 如果没有本地实例可用, 随机选取一个远程组件实例.&lt;br /&gt;
&lt;br /&gt;
如果你需要一个不同的行为, 你可以通过选项 domain_balancing 修改负载均衡行为. 这个选项的语法如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{domain_balancing, &amp;quot;component.example.com&amp;quot;, BalancingCriteria}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
多个负载均衡标准可用:&lt;br /&gt;
&lt;br /&gt;
* destination: 使用包的to属性的全JID.&lt;br /&gt;
* source: 使用包的from属性的全JID.&lt;br /&gt;
* bare_destination: 使用包的to属性的纯JID(没有资源).&lt;br /&gt;
* bare_source: 使用包的from属性的纯JID(没有资源). &lt;br /&gt;
&lt;br /&gt;
如果对应标准的这个值是相同的, 则集群中相同的组件实例将被使用.&lt;br /&gt;
&lt;br /&gt;
====负载均衡水桶====&lt;br /&gt;
&lt;br /&gt;
当一个给定的组件有失败的风险的时候, 域均衡可能导致服务麻烦. 如果一个组件失败了，服务将无法正确工作，除非会话被重新均衡了.&lt;br /&gt;
&lt;br /&gt;
在这种情况下, 最好限制这个问题在由失败组件处理的这些会话. 这就是 domain_balancing_component_number 选项所做的, 使负载均衡机制不动态化, 而是粘在固定数目的组件实例上.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{domain_balancing_component_number, &amp;quot;component.example.com&amp;quot;, Number}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==调试==&lt;br /&gt;
===日志文件===&lt;br /&gt;
&lt;br /&gt;
一个ejabberd节点写两个日志文件:&lt;br /&gt;
&lt;br /&gt;
'''ejabberd.log'''&lt;br /&gt;
:ejabberd 服务日志, 由 ejabberd 节点汇报的消息&lt;br /&gt;
'''erlang.log'''&lt;br /&gt;
:Erlang/OTP 系统日志, 由 Erlang/OTP 使用 SASL (系统架构支持库) 汇报的消息&lt;br /&gt;
&lt;br /&gt;
选项 loglevel 修改文件 ejabberd.log 的详细程度. 语法是:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{loglevel, Level}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可能的 Level 有:&lt;br /&gt;
&lt;br /&gt;
'''0'''&lt;br /&gt;
:没有ejabberd日志 (不推荐) &lt;br /&gt;
'''1'''&lt;br /&gt;
:紧急&lt;br /&gt;
'''2'''&lt;br /&gt;
:错误&lt;br /&gt;
'''3'''&lt;br /&gt;
:警告&lt;br /&gt;
'''4'''&lt;br /&gt;
:信息&lt;br /&gt;
'''5'''&lt;br /&gt;
:调试&lt;br /&gt;
&lt;br /&gt;
例如, 缺省配置为:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{loglevel, 4}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
日志文件持续增长, 所以推荐定期流转. 为了流转日志文件, 重命名这个文件然后重新打开它们. ejabberdctl命令reopen-log (请参考 [[Ejabberd2:安装和操作指南# ejabberdctl命令|4.1.1]] 节) 重新打开日志文件, 同时也重命名旧文件，如果你不重命名它们的话.&lt;br /&gt;
&lt;br /&gt;
===调试控制台===&lt;br /&gt;
&lt;br /&gt;
调试控制台是连接到一个已运行的 ejabberd 服务器的 Erlang shell. 使用这个 Erlang shell, 一个有经验的管理员可以执行复杂的任务.&lt;br /&gt;
&lt;br /&gt;
这个 shell 给予对ejabberd 服务器的完全控制, 所以使用它要非常小心. 在文章 [http://www.ejabberd.im/interconnect-erl-nodes Erlang节点的互连] 里有一些简单和安全的例子&lt;br /&gt;
&lt;br /&gt;
要退出这个shell, 关闭窗口或键入: control+c control+c.&lt;br /&gt;
&lt;br /&gt;
===Watchdog警告===&lt;br /&gt;
&lt;br /&gt;
ejabberd包含了一个看门狗 watchdog 机制，当找出和内存使用有关的问题时，对开发者可能有用. 如果ejabberd服务器的一个进程消耗了超过配置阀值的内存, 一个消息将被发送到ejabberd配置文件中选项 watchdog_admins 定义的 XMPP 帐号.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{watchdog_admins, [JID, ...]}.'''&lt;br /&gt;
&lt;br /&gt;
消耗的内存以words衡量: 一个word在32位系统上是4字节bytes, 在64位系统上是8字节bytes. 这个阀值缺省是 1000000 words. 这个值可以用选项 watchdog_large_heap来配置, 或在一个会话中使用watchdog警报机器人.&lt;br /&gt;
&lt;br /&gt;
语法是:&lt;br /&gt;
&lt;br /&gt;
'''{watchdog_large_heap, Number}.'''&lt;br /&gt;
&lt;br /&gt;
示例配置:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{watchdog_admins, [&amp;quot;admin2@localhost&amp;quot;, &amp;quot;admin2@example.org&amp;quot;]}.&lt;br /&gt;
{watchdog_large_heap, 30000000}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
要移除watchdog管理员, 在选项里移除. 为了移除所有watchdog管理员, 设置该选项为空列表:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
{watchdog_admins, []}.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录 A 国际化和本地化==&lt;br /&gt;
&lt;br /&gt;
ejabberd的源码支持本地化. 翻译者可编辑 [http://www.gnu.org/software/gettext/ gettext] .po 文件，使用任何可用的软件 (KBabel, Lokalize, Poedit...) 或一个简单的文本编辑器.&lt;br /&gt;
&lt;br /&gt;
接着gettext用来提取, 更新和导出那些 .po 文件成为能被ejabberd读取的 .msg 格式. 为执行那些管理任务, 在 src/ 目录执行 ''make translations''. 可翻译的字符串被从源码提取出来生成文件 ejabberd.pot. 这个文件合并每个 .po 文件来生成更新的 .po 文件. 最后那些 .po 文件被导出成 .msg 文件, 那是个容易被 ejabberd 读取的格式.&lt;br /&gt;
&lt;br /&gt;
所有內建的模块都支持内部的IQ queries的xml:lang 属性 . Figure A.1, 例如, 展示了应答以下 query:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq id='5'&lt;br /&gt;
    to='example.org'&lt;br /&gt;
    type='get'&lt;br /&gt;
    xml:lang='ru'&amp;gt;&lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#items'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    discorus.png&lt;br /&gt;
    Figure A.1: Service Discovery when xml:lang=’ru’&lt;br /&gt;
&lt;br /&gt;
Web管理也支持 Accept-Language HTTP 头.&lt;br /&gt;
&lt;br /&gt;
    webadmmainru.png&lt;br /&gt;
    Figure A.2: Web Admin showing a virtual host when the web browser provides the HTTP header ‘Accept-Language: ru’&lt;br /&gt;
&lt;br /&gt;
==附录 B 发行备注==&lt;br /&gt;
&lt;br /&gt;
发行备注在 [http://www.process-one.net/en/ejabberd/release_notes/ ejabberd主页]&lt;br /&gt;
&lt;br /&gt;
==附录 C 鸣谢==&lt;br /&gt;
&lt;br /&gt;
感谢所有对本指南有贡献的人:&lt;br /&gt;
&lt;br /&gt;
* Alexey Shchepin (xmpp:aleksey@jabber.ru)&lt;br /&gt;
* Badlop (xmpp:badlop@jabberes.org)&lt;br /&gt;
* Evgeniy Khramtsov (xmpp:xram@jabber.ru)&lt;br /&gt;
* Florian Zumbiehl (xmpp:florz@florz.de)&lt;br /&gt;
* Michael Grigutsch (xmpp:migri@jabber.i-pobox.net)&lt;br /&gt;
* Mickael Remond (xmpp:mremond@process-one.net)&lt;br /&gt;
* Sander Devrieze (xmpp:s.devrieze@gmail.com)&lt;br /&gt;
* Sergei Golovan (xmpp:sgolovan@nes.ru)&lt;br /&gt;
* Vsevolod Pelipas (xmpp:vsevoload@jabber.ru)&lt;br /&gt;
&lt;br /&gt;
==附录 D 版权信息==&lt;br /&gt;
&lt;br /&gt;
略...&lt;br /&gt;
&lt;br /&gt;
Ejabberd Installation and Operation Guide.&lt;br /&gt;
Copyright © 2003 — 2010 ProcessOne&lt;br /&gt;
&lt;br /&gt;
This document is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
You should have received a copy of the GNU General Public License along with this document; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0096</id>
		<title>XEP-0096</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0096"/>
				<updated>2010-10-11T08:06:46Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 要求 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0096.html XEP-0096]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0096: 文件传输'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP流初始化扩展的外壳,用于两个实体之间的文件传输. 该协议提供了一个模块化框架使能交换被传输文件的信息以及参数的协商(例如使用的通道).&lt;br /&gt;
&lt;br /&gt;
作者: Thomas Muldowney, Matthew Miller, Ryan Eatmon&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0096#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 草案&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 1.1&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2004-04-13&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''草案标准'''.对本协议的执行是被鼓励的,也适于布署到生产系统,但是在它成为最终标准之前可能还会有一些变动.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
在Jabber社区，传统的文件传输的方法是Out-of-Band Data带外传输协议。该协议有一些缺点：&lt;br /&gt;
&lt;br /&gt;
# 它是不可靠的&lt;br /&gt;
# 当有一方在防火墙后面的话，该协议无效&lt;br /&gt;
# 对要交换的文件有元数据的限制。&lt;br /&gt;
&lt;br /&gt;
本文档定义了一个流启动的流程用于解决带外传输的问题，并提供了一种健壮的、可靠的通过Jabber网络文件传输的算法。&lt;br /&gt;
&lt;br /&gt;
==要求==&lt;br /&gt;
&lt;br /&gt;
* 允许无缝文件传输，包括必要的回滚机制。&lt;br /&gt;
&lt;br /&gt;
* 保证一方或者双方都在防火墙之后时，文件传输还能进行。&lt;br /&gt;
&lt;br /&gt;
* 定义一个完整的文件传输的元数据，如下：&lt;br /&gt;
&lt;br /&gt;
# description&lt;br /&gt;
# size&lt;br /&gt;
# name&lt;br /&gt;
# date&lt;br /&gt;
# hash&lt;br /&gt;
&lt;br /&gt;
* 可选的，支持文件传输的范围。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==协议==&lt;br /&gt;
&lt;br /&gt;
文件传输情形属于http://jabber.org/protocol/si/profile/file-transfer命名空间。该情形很简单：由可能的描述可选择的传输范围的子元素组成的根元素组成。&lt;br /&gt;
&lt;br /&gt;
根元素&amp;lt;file&amp;gt;有4个属性。这些属性只有在流初始化的情况下使用：&lt;br /&gt;
&lt;br /&gt;
* size - 发送文件的大小，按字节计算&lt;br /&gt;
&lt;br /&gt;
* name - 发送者想要发送的文件名&lt;br /&gt;
&lt;br /&gt;
* date - 文件的最后修改日期。日期格式使用XMPP Date and Time Profiles指定的格式。&lt;br /&gt;
&lt;br /&gt;
* hash - 文件内容的MD5&lt;br /&gt;
&lt;br /&gt;
文件大小和文件名属性必须(MUST)在传输情形中出现，其他属性可以(MAY)出现。&lt;br /&gt;
&lt;br /&gt;
根元素还有2个可能的子元素：&amp;lt;desc&amp;gt; 和 &amp;lt;range&amp;gt;，他们都是可选的(OPTIONAL)。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;desc&amp;gt;是发送者提供的对于文件描述，接收者可以更加明确被发送的是什么。它不能(MUST NOT)在结果中发送。&lt;br /&gt;
&lt;br /&gt;
当提供了&amp;lt;range&amp;gt;元素时，它不应该包含属性。这表示发送者能按照范围发送。当发送流初始化的结果中包含了&amp;lt;range&amp;gt;元素时，是用以下属性：&lt;br /&gt;
&lt;br /&gt;
* offset - 指定了位置，按字节计算，开始文件传输的起点。如果没有指定，默认值为0。&lt;br /&gt;
&lt;br /&gt;
* length - 指定了从偏移量开始的要接收的字节数。默认值是从偏移量开始到文件末尾的字节数。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;range&amp;gt;元素中的2个元素都是可选的(OPTIONAL)。发送无属性的元素等同于没有&amp;lt;range&amp;gt;元素。当在流初始化的结果中没有&amp;lt;range&amp;gt;元素时，发送者必须(MUST)从偏移量为0处发送完整的文件。更通常的情况是，从偏移量位置开始根据指定长度通过字节流发送。&lt;br /&gt;
&lt;br /&gt;
===强制实现的技术===&lt;br /&gt;
&lt;br /&gt;
为了能够允许无缝实时进行文件传输以及适当的回滚机制，为了更好的处理这些情况，对于这些情况的具体实现必须(MUST)支持SOCKS5 Bytestreams [4] 和In-Band Bytestreams [5]。相关的命名空间也要包含于&amp;quot;stream-method&amp;quot;的可选值中，如下例子中所示：&lt;br /&gt;
&lt;br /&gt;
此外，具体的实现也可以(MAY)支持其他机制。&lt;br /&gt;
&lt;br /&gt;
==例子==&lt;br /&gt;
&lt;br /&gt;
'''例子1. 在流初始化中，简单的使用示例'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set' id='offer1' to='receiver@jabber.org/resource'&amp;gt;&lt;br /&gt;
  &amp;lt;si xmlns='http://jabber.org/protocol/si' &lt;br /&gt;
      id='a0'&lt;br /&gt;
      mime-type='text/plain'&lt;br /&gt;
      profile='http://jabber.org/protocol/si/profile/file-transfer'&amp;gt;&lt;br /&gt;
    &amp;lt;file xmlns='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
          name='test.txt'&lt;br /&gt;
          size='1022'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature xmlns='http://jabber.org/protocol/feature-neg'&amp;gt;&lt;br /&gt;
      &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
        &amp;lt;field var='stream-method' type='list-single'&amp;gt;&lt;br /&gt;
          &amp;lt;option&amp;gt;&amp;lt;value&amp;gt;http://jabber.org/protocol/bytestreams&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
          &amp;lt;option&amp;gt;&amp;lt;value&amp;gt;http://jabber.org/protocol/ibb&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;/x&amp;gt;&lt;br /&gt;
    &amp;lt;/feature&amp;gt;&lt;br /&gt;
  &amp;lt;/si&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''例子2. 在流初始化结果中，简单的使用示例'''    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result' to='sender@jabber.org/resource' id='offer1'&amp;gt;&lt;br /&gt;
  &amp;lt;si xmlns='http://jabber.org/protocol/si'&amp;gt;&lt;br /&gt;
    &amp;lt;feature xmlns='http://jabber.org/protocol/feature-neg'&amp;gt;&lt;br /&gt;
      &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
        &amp;lt;field var='stream-method'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;http://jabber.org/protocol/bytestreams&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;/x&amp;gt;&lt;br /&gt;
    &amp;lt;/feature&amp;gt;&lt;br /&gt;
  &amp;lt;/si&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
'''例子3. 在流初始化中，完整的使用示例'''    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='set' id='offer1' to='receiver@jabber.org/resource'&amp;gt;&lt;br /&gt;
  &amp;lt;si xmlns='http://jabber.org/protocol/si' &lt;br /&gt;
      id='a0'&lt;br /&gt;
      mime-type='text/plain'&lt;br /&gt;
      profile='http://jabber.org/protocol/si/profile/file-transfer'&amp;gt;&lt;br /&gt;
    &amp;lt;file xmlns='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
          name='test.txt'&lt;br /&gt;
          size='1022'&lt;br /&gt;
          hash='552da749930852c69ae5d2141d3766b1'&lt;br /&gt;
          date='1969-07-21T02:56:15Z'&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;This is a test. If this were a real file...&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/file&amp;gt;&lt;br /&gt;
    &amp;lt;feature xmlns='http://jabber.org/protocol/feature-neg'&amp;gt;&lt;br /&gt;
      &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt;&lt;br /&gt;
        &amp;lt;field var='stream-method' type='list-single'&amp;gt;&lt;br /&gt;
          &amp;lt;option&amp;gt;&amp;lt;value&amp;gt;http://jabber.org/protocol/bytestreams&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
          &amp;lt;option&amp;gt;&amp;lt;value&amp;gt;http://jabber.org/protocol/ibb&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;/x&amp;gt;&lt;br /&gt;
    &amp;lt;/feature&amp;gt;&lt;br /&gt;
  &amp;lt;/si&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
'''例子4. 在流初始化结果中，完整的使用示例'''    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result' to='sender@jabber.org/resource' id='offer1'&amp;gt;&lt;br /&gt;
  &amp;lt;si xmlns='http://jabber.org/protocol/si'&amp;gt;&lt;br /&gt;
    &amp;lt;file xmlns='http://jabber.org/protocol/si/profile/file-transfer'/&amp;gt;&lt;br /&gt;
    &amp;lt;feature xmlns='http://jabber.org/protocol/feature-neg'&amp;gt;&lt;br /&gt;
      &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt;&lt;br /&gt;
        &amp;lt;field var='stream-method'&amp;gt;&lt;br /&gt;
          &amp;lt;value&amp;gt;http://jabber.org/protocol/bytestreams&amp;lt;/value&amp;gt;&lt;br /&gt;
        &amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;/x&amp;gt;&lt;br /&gt;
    &amp;lt;/feature&amp;gt;&lt;br /&gt;
  &amp;lt;/si&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从文件的起点处接收256个字节&lt;br /&gt;
&lt;br /&gt;
'''例子 5.'''   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;range length='256'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从文件偏移量为128个字节处开始接收256个字节&lt;br /&gt;
&lt;br /&gt;
'''例子 6.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;range offset='128' length='256'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从文件偏移量为128个字节处开始接收剩下的文件&lt;br /&gt;
&lt;br /&gt;
'''例子 7.'''   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;range offset='128'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下的范围等同于没有发送范围请求，整个文件将被发送。&lt;br /&gt;
&lt;br /&gt;
'''例子 8.'''   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;range/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文不需要与Internet Assigned Numbers Authority (IANA) [6]交互。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册事项==&lt;br /&gt;
&lt;br /&gt;
===流初始化情况===&lt;br /&gt;
&lt;br /&gt;
本文档描述的情形包含于由XMPP Registrar维护的流初始化情形注册(参考&amp;lt;http://www.xmpp.org/registrar/si-profiles.html&amp;gt;)。注册请求如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;profile&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;http://jabber.org/protocol/si/profile/file-transfer&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0096&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;A profile for file transfer between any two entities.&amp;lt;/desc&amp;gt;&lt;br /&gt;
&amp;lt;/profile&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===URI查询类型===&lt;br /&gt;
&lt;br /&gt;
XMPP注册维护了XMPP URIs的查询和键-值对应的使用，并且被XMPP URI Query Components所验证(参考&amp;lt;http://www.xmpp.org/registrar/querytypes.html&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
就如下描述的，文件传输的注册类型是&amp;quot;sendfile&amp;quot;和&amp;quot;recvfile&amp;quot;。注意&amp;quot;sendfile&amp;quot;意味着另一个实体将发送一个文件给控制着IRI/URI的XMPP实体，&amp;quot;recvfile&amp;quot;意味着另一个实体将会从控制着IRI/URI的XMPP实体那里接收文件。&lt;br /&gt;
&lt;br /&gt;
====发送文件====&lt;br /&gt;
&lt;br /&gt;
为了允许另一个实体发送文件，IRI/URI就遵循如下：&lt;br /&gt;
&lt;br /&gt;
'''例子9. 发送文件：IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
xmpp:romeo@montague.net/orchard?sendfile&lt;br /&gt;
     &lt;br /&gt;
具体的应用程序应该(SHOULD)提供一个界面，允许用户提供关于要发送的文件的信息(比如，为了选择一个文件，“浏览”用户计算机的文件系统)。结果，应用程序应该(SHOULD)发送一个发布流初始化请求的信息给在IRI/URI封装的XMPP地址。&lt;br /&gt;
&lt;br /&gt;
'''例子 10. 发送文件：结果节点'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='juliet@capulet.com/balcony' to='romeo@montague.net'&amp;gt;&lt;br /&gt;
  &amp;lt;sipub xmlns='http://jabber.org/protocol/si-pub'&lt;br /&gt;
      id='publish-0123'&lt;br /&gt;
      mime-type='text/plain'&lt;br /&gt;
      profile='http://jabber.org/protocol/si/profile/file-transfer'&amp;gt;&lt;br /&gt;
    &amp;lt;file xmlns='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
          name='missive.txt'&lt;br /&gt;
          size='1024'&lt;br /&gt;
          date='2005-11-29T11:21Z'/&amp;gt;&lt;br /&gt;
  &amp;lt;/sipub&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下提交注册&amp;quot;sendfile&amp;quot;类型。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;sendfile&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/si/profile/file-transfer&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables initiation of an inbound file transfer to XMPP entity&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0096&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====接收文件====&lt;br /&gt;
&lt;br /&gt;
允许另一个实体接收文件，IRI/URI如下：&lt;br /&gt;
&lt;br /&gt;
'''例子11. 接收文件: IRI/URI'''&lt;br /&gt;
&lt;br /&gt;
xmpp:romeo@montague.net/orchard?recvfile;sid=pub234;mime-type=text%2Fplain;name=reply.txt;size=2048&lt;br /&gt;
     &lt;br /&gt;
该IRI/URI等同于以下XML节点：&lt;br /&gt;
&lt;br /&gt;
'''例子12. 接收文件：等同的节点'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;message from='romeo@montague.net' to='juliet@capulet.com/balcony'&amp;gt;&lt;br /&gt;
  &amp;lt;sipub xmlns='http://jabber.org/protocol/si-pub'&lt;br /&gt;
      id='pub234'&lt;br /&gt;
      mime-type='text/plain'&lt;br /&gt;
      profile='http://jabber.org/protocol/si/profile/file-transfer'&amp;gt;&lt;br /&gt;
    &amp;lt;file xmlns='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
          name='reply.txt'&lt;br /&gt;
          size='2048'/&amp;gt;&lt;br /&gt;
  &amp;lt;/sipub&amp;gt;&lt;br /&gt;
&amp;lt;/message&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
根据XEP-0137，应用程序应该(SHOULD)通过发送如下表单初始化文件传输：&lt;br /&gt;
&lt;br /&gt;
'''例子13. 接收文件：结果节点'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard'&amp;gt;&lt;br /&gt;
  &amp;lt;start xmlns='http://jabber.org/protocol/si-pub' id='pub234'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：开始流的请求要发送给在XMPP IRI/URI中定义的实体的全JID。因此，IRI/URI应该(SHOULD)包含全JID。如果没有如此，接收者必须(MUST)通过出席信息或者服务发现来查找全JID。如果接收者不能查找到发送者的全JID(比如，在最后一次出现时，通过发送订阅出席请求并从发送者的资源接收到出席信息)，那么它应该(SHOULD)取消文件传输。&lt;br /&gt;
&lt;br /&gt;
以下的提交注册了&amp;quot;recvfile&amp;quot;查询类型。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;querytype&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;recvfile&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;proto&amp;gt;http://jabber.org/protocol/si/profile/file-transfer&amp;lt;/proto&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;enables initiation of an outbound file transfer from XMPP entity&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;XEP-0096&amp;lt;/doc&amp;gt;&lt;br /&gt;
  &amp;lt;keys&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;mime-type&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the MIME type of the file being offered&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;name&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the name of the file being offered&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;sid&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the session ID associated with the file being offered&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
    &amp;lt;key&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;size&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;desc&amp;gt;the size in bytes of the file being offered&amp;lt;/desc&amp;gt;&lt;br /&gt;
    &amp;lt;/key&amp;gt;&lt;br /&gt;
  &amp;lt;/keys&amp;gt;&lt;br /&gt;
&amp;lt;/querytype&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==XML Schema==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/si/profile/file-transfer'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0096: http://www.xmpp.org/extensions/xep-0096.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='file'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence minOccurs='0'&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='desc' type='xs:string'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element ref='range'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='date' type='xs:dateTime' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='hash' type='xs:string' use='optional'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='name' type='xs:string' use='required'/&amp;gt;&lt;br /&gt;
      &amp;lt;xs:attribute name='size' type='xs:integer' use='required'/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;xs:element name='range'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:simpleContent&amp;gt;&lt;br /&gt;
        &amp;lt;xs:extension base='empty'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='length' type='xs:integer' use='optional'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:attribute name='offset' type='xs:integer' use='optional'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:extension&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:simpleContent&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0096&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://xmpp.org/extensions/xep-0001.html#states-Draft 草案]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.1&lt;br /&gt;
&lt;br /&gt;
最后更新：2004-04-13&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core, XEP-0095&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：si-filetransfer&lt;br /&gt;
&lt;br /&gt;
XML架构(Schema): &amp;lt;http://www.xmpp.org/schemas/file-transfer.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0096.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0096.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0096.xml XML] [http://xmpp.org/extensions/xep-0096.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Thomas Muldowney'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:temas@jabber.org temas@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JabberID: temas@jabber.org&lt;br /&gt;
&lt;br /&gt;
'''Matthew Miller'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:linuxwolf@outer-planes.net linuxwolf@outer-planes.net]&lt;br /&gt;
&lt;br /&gt;
:JabberID: linuxwolf@outer-planes.net&lt;br /&gt;
&lt;br /&gt;
'''Ryan Eatmon'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:reatmon@jabber.org reatmon@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JabberID: reatmon@jabber.org&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# XEP-0066: Out of Band Data &amp;lt;http://www.xmpp.org/extensions/xep-0066.html&amp;gt;.&lt;br /&gt;
# XEP-0095: Stream Initiation &amp;lt;http://www.xmpp.org/extensions/xep-0095.html&amp;gt;.&lt;br /&gt;
# XEP-0082: XMPP Date and Time Profiles &amp;lt;http://www.xmpp.org/extensions/xep-0082.html&amp;gt;.&lt;br /&gt;
# XEP-0065: SOCKS5 Bytestreams &amp;lt;http://www.xmpp.org/extensions/xep-0065.html&amp;gt;.&lt;br /&gt;
# XEP-0047: In-Band Bytestreams &amp;lt;http://www.xmpp.org/extensions/xep-0047.html&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构(IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
# XEP-0147: XMPP URI Query Components &amp;lt;http://www.xmpp.org/extensions/xep-0147.html&amp;gt;.&lt;br /&gt;
# XEP-0137: Publishing Stream Initiation Requests &amp;lt;http://www.xmpp.org/extensions/xep-0137.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
Version 1.1 (2004-04-13)&lt;br /&gt;
&lt;br /&gt;
More fully defined the XMPP Registrar considerations. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.1 (2003-12-30)&lt;br /&gt;
&lt;br /&gt;
Improved explanatory text; fixed several errors in the schema. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2003-10-17)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Draft. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.7 (2003-10-07)&lt;br /&gt;
&lt;br /&gt;
Added IBB as a MUST requirement. (tjm) &lt;br /&gt;
&lt;br /&gt;
Version 0.6 (2003-08-18)&lt;br /&gt;
&lt;br /&gt;
Cleaned up some namespace inconsistencies, added the &amp;lt;desc&amp;gt; element for file descriptions. (tjm) &lt;br /&gt;
&lt;br /&gt;
Version 0.5 (2003-07-15)&lt;br /&gt;
&lt;br /&gt;
Stream ids not needed on return results. Moved s5b, ibb, and url-data to the actual namespaces of the stream protocols. (rwe) &lt;br /&gt;
&lt;br /&gt;
Version 0.4 (2003-06-30)&lt;br /&gt;
&lt;br /&gt;
Fixed various typos and inconsistencies (lw) &lt;br /&gt;
&lt;br /&gt;
Version 0.3 (2003-06-30)&lt;br /&gt;
&lt;br /&gt;
Added XML Schema (lw) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2003-06-24)&lt;br /&gt;
&lt;br /&gt;
Clarified many examples, added linuxwolf as an author (again, my bad, should have been there), clarified the allowed streams and how data is sent over it. (tjm) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2003-06-10)&lt;br /&gt;
&lt;br /&gt;
Initial version. (tjm) &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
结束&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0138</id>
		<title>XEP-0138</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0138"/>
				<updated>2010-10-11T08:06:44Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 绪论 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://www.xmpp.org/extensions/xep-0138.html XEP-0138]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0138: 流压缩'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP协议扩展,用于协商XML流的压缩,特别在标准TLS压缩无法协商的情况下. 该协议提供了一个模块化框架,可以容纳广泛的压缩算法; ZLIB 压缩算法是强制性的实现，但实现也可以可能支持额外的其他算法.&lt;br /&gt;
&lt;br /&gt;
作者: Joe Hildebrand, Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0138#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 最终版&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 2.0&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2009-05-27&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个'''最终版''',可被认为是一个稳定的技术,供实现和布署.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
[[RFC3920|XMPP Core]] [[XEP-0138#附录G:备注|1]]指明了使用TLS(参考[http://tools.ietf.org/html/rfc4346 RFC 4346] [[XEP-0138#附录G:备注|2]] )加密XML流，TLS包括了压缩加密流量的能力(参考[http://tools.ietf.org/html/rfc3749 RFC 3749] [[XEP-0138#附录G:备注|3]] )。然而，不是所有计算机平台都实现了TLS，而流压缩可以使基于这些平台的应用实现互通。本文档定义了在TLS之外的协议XML流的压缩算法。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==用例==&lt;br /&gt;
&lt;br /&gt;
协议流如下：&lt;br /&gt;
&lt;br /&gt;
'''例子1. 收到实体提供的流压缩特征'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:features&amp;gt;&lt;br /&gt;
  &amp;lt;starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/&amp;gt;&lt;br /&gt;
  &amp;lt;compression xmlns='http://jabber.org/features/compress'&amp;gt;&lt;br /&gt;
    &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
    &amp;lt;method&amp;gt;lzw&amp;lt;/method&amp;gt;&lt;br /&gt;
  &amp;lt;/compression&amp;gt;&lt;br /&gt;
&amp;lt;/stream:features&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：&amp;lt;compression/&amp;gt;元素必须(MUST)包含至少一个&amp;lt;method/&amp;gt;子元素。每个&amp;lt;method/&amp;gt;必须(MUST)包含指定了压缩方法的XML字符，方法名应该(SHOULD)是在本文档的 [[XEP-0138#压缩方法注册|压缩方法注册]] 中注册的。&lt;br /&gt;
&lt;br /&gt;
初始实体可能(MAY)在收到的压缩方法中请求一个压缩方法。&lt;br /&gt;
&lt;br /&gt;
'''例子2. 初始实体请求流压缩'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ccompress xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;method&amp;gt;zlib&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/compress&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：如果初始实体不理解声明的压缩方法，它应该(SHOULD)忽略压缩选项，就像没有发布压缩方法一样处理。&lt;br /&gt;
&lt;br /&gt;
如果接受实体不支持初始实体请求的压缩方法，那么接收者实体必须(MUST)返回一个&amp;lt;unsupported-method/&amp;gt;错误&lt;br /&gt;
&lt;br /&gt;
'''例子3. 接收实体报告该方法不支持。'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;failure xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;unsupported-method/&amp;gt;&lt;br /&gt;
&amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果接收实体发现请求的方法不能接受或者由于其他原因而不能使用，它必须(MUST)返回一个&amp;lt;setup-failed/&amp;gt;错误：&lt;br /&gt;
&lt;br /&gt;
'''例子4. 接收实体报告流压缩协商失败'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;failure xmlns='http://jabber.org/protocol/compress'&amp;gt;&lt;br /&gt;
  &amp;lt;setup-failed/&amp;gt;&lt;br /&gt;
&amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：协商失败不应该(SHOULD NOT)被看作不可挽救的错误，因此不应该(SHOULD NOT)导致流错误。特别的，初始实体可以在失败后，重新协商。&lt;br /&gt;
&lt;br /&gt;
如果没有错误，接收实体必须(MUST)通知初始实体协商成功。&lt;br /&gt;
&lt;br /&gt;
'''例子5. 接收实体通知流压缩的协商结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;compressed xmlns='http://jabber.org/protocol/compress'/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在2个实体必须(MUST)都忽略先前的流(未压缩的)，就像TLS协商和SASL协商(在RFC3920指定)一样，必须(MUST)用一个新的(压缩的)流开始通讯。因此初始实体必须(MUST)初始一个新的流给接收实体：&lt;br /&gt;
&lt;br /&gt;
'''例子6. 初始实体初始新的(压缩)流'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:stream&lt;br /&gt;
    xmlns='jabber:client'&lt;br /&gt;
    xmlns:stream='http://etherx.jabber.org/streams'&lt;br /&gt;
    to='shakespeare.lit'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果在新的(压缩)流发送之后处理失败，发现出错的实体应该(SHOULD)生成出错流并关闭流。&lt;br /&gt;
&lt;br /&gt;
'''例子7. 因为流错误实体关闭流'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;stream:error&amp;gt;&lt;br /&gt;
  &amp;lt;undefined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/&amp;gt;&lt;br /&gt;
  &amp;lt;failure xmlns='http://jabber.org/protocol/compress'/&amp;gt;&lt;br /&gt;
    &amp;lt;processing-failed/&amp;gt;&lt;br /&gt;
  &amp;lt;/failure&amp;gt;&lt;br /&gt;
&amp;lt;/stream:error&amp;gt;&lt;br /&gt;
&amp;lt;/stream:stream&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==业务规则==&lt;br /&gt;
&lt;br /&gt;
应用以下规则：&lt;br /&gt;
&lt;br /&gt;
* 如果正在协商流压缩，它必须(MUST)是双向的。&lt;br /&gt;
&lt;br /&gt;
* TLS压缩和流压缩不应该(SHOULD NOT)同时使用。&lt;br /&gt;
&lt;br /&gt;
* 如果TLS压缩失败了，那么之后可以再进行流压缩协商。&lt;br /&gt;
&lt;br /&gt;
关于流特性协商的顺序的细节，参考 [[XEP-0138#压缩方法注册|推荐的流特性协商顺序]]&lt;br /&gt;
&lt;br /&gt;
==强制实现的技术==&lt;br /&gt;
&lt;br /&gt;
在[http://tools.ietf.org/html/rfc1950 RFC 1950] [[XEP-0138#附录G:备注|5]] 中对ZLIB压缩方法的支持必需的(REQUIRED).&lt;br /&gt;
&lt;br /&gt;
所有其他方法是可选的;这些方法可能将来会进入本文的 [[XEP-0138#压缩方法注册|压缩方法注册]]章节所述的注册项.&lt;br /&gt;
&lt;br /&gt;
==可选的技术==&lt;br /&gt;
&lt;br /&gt;
除了ZLIB之外，具体的实现也可以(MAY)支持以下方法：&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/extensions/xep-0229.html LZW流压缩] [[XEP-013#附录G:备注|6]]&lt;br /&gt;
&lt;br /&gt;
==实现注意==&lt;br /&gt;
&lt;br /&gt;
当使用ZLIB压缩的时候，在当前的发送完成之后，发送方的应用应该(SHOULD)完成ZLIB流部分刷新。注意这些语句有点含糊的：发送方的应用可能在发送每个XML节后刷新流并且发送数据，但是另一方面也可能在发送了等待发送队列里的所有节点后刷新流并且发送数据。何时刷新压缩应用的状态取决于发送方的应用。&lt;br /&gt;
&lt;br /&gt;
==安全事项==&lt;br /&gt;
&lt;br /&gt;
通过TLS(在[[RFC3920 RFC 3920]]中定义)加密的流和压缩流(在本文档定义的)并不是互相排斥的，但是通过TLS加密的流必须(MUST)在流压缩协商之前先协商，这是确保流的安全性。&lt;br /&gt;
&lt;br /&gt;
==IANA事项==&lt;br /&gt;
&lt;br /&gt;
本文档和互联网端口号授权组织 (IANA) [[XEP-0138#附录G:备注|7]]没有交互。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册事项==&lt;br /&gt;
&lt;br /&gt;
===流特性===&lt;br /&gt;
&lt;br /&gt;
在流特性的注册项中，[http://xmpp.org/registrar/ XMPP注册项] [[XEP-0138#附录G:备注|8]]中包含'http://jabber.org/features/compress'&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
在协议命名空间的注册项中，XMPP注册项中包含'http://jabber.org/protocol/compress'&lt;br /&gt;
&lt;br /&gt;
===压缩方法注册===&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;http://www.xmpp.org/registrar/compress.html&amp;gt;中，XMPP注册项维护了压缩方法的注册。&lt;br /&gt;
&lt;br /&gt;
====过程====&lt;br /&gt;
&lt;br /&gt;
为了提交新的注册项到注册登记处，登记者必须根据以下表单将其包含在相关的扩展协议中或者发送邮件到&amp;lt;registrar@xmpp.org&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;method&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;the XML character data of the method element&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;a natural-language description of the compression method&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;the document that specifies or registers the compression method&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
登记者可能同时登记多个压缩方法，每个方法都包含一个独立的&amp;lt;method/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
====注册====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;method&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;zlib&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;desc&amp;gt;the ZLIB compression method&amp;lt;/desc&amp;gt;&lt;br /&gt;
  &amp;lt;doc&amp;gt;RFC 1950&amp;lt;/doc&amp;gt;&lt;br /&gt;
&amp;lt;/method&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==XML Schemas==&lt;br /&gt;
&lt;br /&gt;
===流特性===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/features/compress'&lt;br /&gt;
    xmlns='http://jabber.org/features/compress'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0138: http://www.xmpp.org/extensions/xep-0138.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compression'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='method' type='xs:NCName' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xs:schema&lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema'&lt;br /&gt;
    targetNamespace='http://jabber.org/protocol/compress'&lt;br /&gt;
    xmlns='http://jabber.org/protocol/compress'&lt;br /&gt;
    elementFormDefault='qualified'&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:import namespace='urn:ietf:params:xml:ns:xmpp-stanzas'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt;&lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt;&lt;br /&gt;
      The protocol documented by this schema is defined in&lt;br /&gt;
      XEP-0138: http://www.xmpp.org/extensions/xep-0138.html&lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compress'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='method' type='xs:NCName' minOccurs='1' maxOccurs='unbounded'/&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='compressed' type='empty'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:element name='failure'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt;&lt;br /&gt;
      &amp;lt;xs:choice&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='setup-failed' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='processing-failed' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:element name='unsupported-method' type='empty'/&amp;gt;&lt;br /&gt;
        &amp;lt;xs:sequence xmlns:err='urn:ietf:params:xml:ns:xmpp-stanzas'&amp;gt;&lt;br /&gt;
          &amp;lt;xs:group ref='err:stanzaErrorGroup'/&amp;gt;&lt;br /&gt;
          &amp;lt;xs:element ref='err:text' minOccurs='0'/&amp;gt;&lt;br /&gt;
        &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;
      &amp;lt;/xs:choice&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:element&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt;&lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt;&lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt;&lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt;&lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0138&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：2.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2009-05-27&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：XMPP Core&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：compress&lt;br /&gt;
&lt;br /&gt;
compress名字空间的XML架构: &amp;lt;http://www.xmpp.org/schemas/compress.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
feature名字空间的XML架构: &amp;lt;http://www.xmpp.org/schemas/compress-feature.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注册表: &amp;lt;http://xmpp.org/registrar/compress.html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0138.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0138.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0138.xml XML] [http://xmpp.org/extensions/xep-0138.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Joe Hildebrand'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:jhildebr@cisco.com jhildebr@cisco.com]&lt;br /&gt;
&lt;br /&gt;
:JabberID: hildjj@jabber.org&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
:Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
:JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
:URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
&lt;br /&gt;
# RFC 3920: 可扩展的消息和出席信息协议 (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
# RFC 4346: TLS协议版本1.1 &amp;lt;http://tools.ietf.org/html/rfc4346&amp;gt;.&lt;br /&gt;
# RFC 3749: TLS协议压缩方法 &amp;lt;http://tools.ietf.org/html/rfc3749&amp;gt;.&lt;br /&gt;
# XEP-0170: 推荐的流特性协商顺序 &amp;lt;http://www.xmpp.org/extensions/xep-0170.html&amp;gt;.&lt;br /&gt;
# RFC 1950: ZLIB压缩数据格式规范版本 3.3 &amp;lt;http://tools.ietf.org/html/rfc1950&amp;gt;.&lt;br /&gt;
# XEP-0229: LZW流压缩 &amp;lt;http://www.xmpp.org/extensions/xep-0229.html&amp;gt;.&lt;br /&gt;
# 互联网编号分配机构(IANA) 是用于互联网协议的唯一性参数值分配的核心协调者, 例如号码和URI计划. 更多信息, 见 &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
# XMPP登记员XMPP Registrar 维护着一个保留的协议名字空间以及用于由XMPP标准基金会批准的XMPP扩展协议的上下文参数的注册项的列表. 更多信息, 见 &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用&lt;br /&gt;
&lt;br /&gt;
Version 2.0 (2009-05-27)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the XMPP Council, advanced status to Final.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.3 (2007-09-26)&lt;br /&gt;
&lt;br /&gt;
Moved specification of LZW algorithm to XEP-0229.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.2 (2007-08-22)&lt;br /&gt;
&lt;br /&gt;
Clarified when compression shall be considered to start; per XEP-0170, specified that compression should be negotiated after SASL.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.1 (2005-12-14)&lt;br /&gt;
&lt;br /&gt;
More completely specified error handling; mentioned LZW (DCLZ) method.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2005-06-16)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Draft.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.5 (2005-05-18)&lt;br /&gt;
&lt;br /&gt;
Modifications to address Council feedback: used RFC 3920 terminology; specified error conditions; specified ZLIB as mandatory to implement.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.4 (2005-05-11)&lt;br /&gt;
&lt;br /&gt;
Corrected several errors in the schemas.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.3 (2005-03-28)&lt;br /&gt;
&lt;br /&gt;
Specified compression methods registry.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-09-28)&lt;br /&gt;
&lt;br /&gt;
Fixed TLS text per list discussion.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-07-16)&lt;br /&gt;
&lt;br /&gt;
Initial version.&lt;br /&gt;
&lt;br /&gt;
(jjh/psa) &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
结束&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0004</id>
		<title>XEP-0004</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0004"/>
				<updated>2010-10-11T08:06:42Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 需求 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0004.html XEP-0004]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0004: 数据表单'''&lt;br /&gt;
&lt;br /&gt;
摘要: 本文定义了一个XMPP扩展协议用于数据表单，可以用于worklows如服务配置以及特定应用的数据描述和报告。这个协议包括表单处理的轻量级语义(如请求,响应,提交和取消),定义了几种常见的字段类型(布尔、单个或多个选择的列表选项、单行或多行的文本,单个或多个JabberID、隐藏字段,等等),为以后的数据类型提供扩展性,可以用在广泛的应用中。该协议并不是要提供完整的表格处理功能（由W3C XForms技术提供），而是提供这种功能的基本子集给XMPP使用。&lt;br /&gt;
&lt;br /&gt;
作者:	Ryan Eatmon, Joe Hildebrand, Jeremie Miller, Thomas Muldowney, Peter Saint-Andre&lt;br /&gt;
&lt;br /&gt;
XMPP扩展协议的版权(1999-2008)归XMPP标准化基金会(XSF)所有&lt;br /&gt;
&lt;br /&gt;
版权:	© 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0004#法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
状态: 最终&lt;br /&gt;
&lt;br /&gt;
类型: 标准跟踪&lt;br /&gt;
&lt;br /&gt;
版本: 2.9&lt;br /&gt;
&lt;br /&gt;
最后更新日期: 2007-08-13&lt;br /&gt;
&lt;br /&gt;
注意: 这里定义的协议是XMPP标准化基金会的一个最终标准.对于实现和布署来说可以被认为是一个稳定技术.&lt;br /&gt;
&lt;br /&gt;
==绪论==&lt;br /&gt;
&lt;br /&gt;
几个现有的Jabber/XMPP的协议包含用户和应用程序之间的结构数据交换，为常用的任务，如注册（[http://xmpp.org/extensions/xep-0077.html In-Band Registration][[XEP-0004#附录G:备注|1]]）和搜索（[http://xmpp.org/extensions/xep-0055.html Jabber Search] [[XEP-0004#附录G:备注|2]]）。不幸的是，这些早期的协议是“硬编码”，因此很大的限制了可交换信息的范围。此外，其他协议(如，[http://xmpp.org/extensions/xep-0045.html Multi-User Chat] [[XEP-0004#附录G:备注|3]])可能需要以交换数据为目的，例如配置，但是配置选项可能根据具体实施或部署不同。最后，开发人员可能要以灵活的方式扩展其他协议(如, [http://xmpp.org/extensions/xep-0030.html Service Discovery][[XEP-0004#附录G:备注|4]])，以提供在基本协议没有定义的信息。在所有这些情况下，这将有助于使用一个通用的数据描述格式，可以用于动态表单生成和各种情况下的数据“建模”。&lt;br /&gt;
&lt;br /&gt;
一个例子可能会有帮助。试想一下，当用户创建一个文本会议服务的多用户聊天室，该服务允许用户以各种方式配置房间。虽然大多数实现可能提供了一个较为常见的可配置功能集（讨论记录，房间拥有者的最大数量，等等）。还会有一些分歧：也许一个实现允许把房间日志以各种文件类型（XML，HTML，PDF等格式）和各种时间周期（每小时，每天，每周等）保存。而另一个实现，可能只存在登录的开/关选择一种格式（如，在HTML保存每日日志）。很明显，第一个实现比第二个实现有更多的配置选项。而不像“硬编码”每个选项通过不同的XML元素（如，&amp;lt;room_logging_period/&amp;gt;），一个好的设计应该包含更多灵活的格式。&lt;br /&gt;
&lt;br /&gt;
此处所描述的'jabber:x:data'协议为Jabber/XMPP实体的使用定义了灵活的格式，控制在“名称值”对的简单和[http://www.w3.org/TR/xforms/ XForms 1.0] [[XEP-0004#附录G:备注|5]]（当这个协议被设计时才开始发展的）的复杂之间。在很多方面，'jabber:x:data' 与[http://www.w3.org/TR/xhtml1/ XHTML 1.0][[XEP-0004#附录G:备注|6]]的表单模块类似。但它提供一些Jabber特有的数据类型，允许应用程序请求数据字段，更自然地集成到IQ节的“workflow”语义中。而且它可以作为现有的Jabber/XMPP协议的扩展，而当这个协议被开发出来时，XHTML的表单模块却不能（尤其是当时并没有[http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/ Modularization of XHTML] [[XEP-0004#附录G:备注|7]]）。&lt;br /&gt;
&lt;br /&gt;
==需求==&lt;br /&gt;
&lt;br /&gt;
本文档涉及下列需求:&lt;br /&gt;
&lt;br /&gt;
# '''数据收集''' -- 该协议应允许表单处理实体（通常是一个服务器，服务，或bot）从表单提交实体（通常是一个由用户控制的客户端）收集数据。应该是通过不同的数据字段来做，每个都可以是不同的数据“类型”，而且允许自由格式的输入或多个选项的选择（就像HTML表单一样）。&lt;br /&gt;
# '''数据报告''' -- 该协议应允许表单处理的实体向表单提交的实体报告数据，再通过不同的数据字段。 &lt;br /&gt;
# '''可移植性''' -- 协议应该尽量只定义普通数据格式和基本的数据类型。提示应该在相关的用户界面提供，但应该仅仅是提示，而不是严格的要求。 &lt;br /&gt;
# '''简单''' -- 协议在客户端的实施应该简单，并且大多数复杂的工作（如，数据有效性和处理）应由服务器和组件去完成，而不是客户端。 &lt;br /&gt;
# '''灵活性''' -- 协议应该具有灵活性和可扩展性，而不像“硬编码”。&lt;br /&gt;
# '''兼容性''' -- 协议应该为已有的Jabber/XMPP协议定义一个扩展，而且不破坏已有的实现，除非绝对必要。&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;br /&gt;
&lt;br /&gt;
==协议==&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data' 命名空间的基本语法如下（正式的描述可以在下面的XML节中找到）:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='{form-type}'&amp;gt; &lt;br /&gt;
  &amp;lt;title/&amp;gt; &lt;br /&gt;
  &amp;lt;instructions/&amp;gt; &lt;br /&gt;
  &amp;lt;field var='field-name' &lt;br /&gt;
         type='{field-type}' &lt;br /&gt;
         label='description'&amp;gt; &lt;br /&gt;
    &amp;lt;desc/&amp;gt; &lt;br /&gt;
    &amp;lt;required/&amp;gt; &lt;br /&gt;
    &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
    &amp;lt;option label='option-label'&amp;gt;&amp;lt;value&amp;gt;option-value&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
  &amp;lt;/field&amp;gt; &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素，应该包括直接作为&amp;lt;message/&amp;gt;节第一级子元素或作为&amp;lt;iq/&amp;gt; 节（其中第一级子元素是由一个&amp;quot;wrapper&amp;quot;命名空间限制的）的第二级子节。参见下文列举的限制。&lt;br /&gt;
&lt;br /&gt;
可选项&amp;lt;title/&amp;gt;和&amp;lt;instructions/&amp;gt;元素，允许表单处理实体把表单标记为一个整体并指定自然语言指令，后面跟着表单提交实体。这些元素的XML字符数据不应包含换行符（\n和\r字符），而任何换行符操作（如，在用户界面显示）在这里不是特指的。但&amp;lt;instructions/&amp;gt;元素的多个实体可以被包括在内。&lt;br /&gt;
&lt;br /&gt;
===表单类型===&lt;br /&gt;
&lt;br /&gt;
'jabber:x:data'表单中数据的收集或提供可以位于不同的上下文。例子包括一个需要填写的空表单，填好的表单，一个提交结果，一个搜索结果，或仅仅是用'jabber:x:data'命名空间封装的一组数据。完整的数据上下文由3个条件提供：&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;wrapper&amp;quot;协议（即，以&amp;lt;iq/&amp;gt;节直接子元素为根元素的命名空间和受'jabber:x:data' 命名空间限制的&amp;lt;x/&amp;gt;元素的父元素）。&lt;br /&gt;
# 一个包含事务（如，一个IQ &amp;quot;set&amp;quot;或&amp;quot;result&amp;quot;）或会话结构（如，一个消息&amp;lt;thread/&amp;gt;）的表单的位置。&lt;br /&gt;
# 表单中&amp;lt;x/&amp;gt;根元素的类型属性&lt;br /&gt;
&lt;br /&gt;
前面2件上下文信息有其他协议提供，而表单类型见下表描述。&lt;br /&gt;
&lt;br /&gt;
:'''表1：表单类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|表单 || 表单处理实体请求表单提交实体去完成表单。&lt;br /&gt;
|-&lt;br /&gt;
|提交 || 表单提交实体提交数据给表单处理实体。提交信息可以包含不是空表单提供的字段，但表单处理实体必须忽略任何无法识别的字段。&lt;br /&gt;
|-&lt;br /&gt;
|取消 || 表单提交实体取消给表单处理实体提交的数据。&lt;br /&gt;
|-&lt;br /&gt;
|结果 || 单处理实体返回数据（如查询结果）给表单提交实体，或数据是一个通用的数据集。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
为了维护表单类型中获取的数据的上下文，必须遵守以下规则:&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;iq/&amp;gt;节，受&amp;quot;wrapper&amp;quot; 命名空间限制的根元素，以&amp;quot;form&amp;quot; 或&amp;quot;submit&amp;quot;的一种形式，必须以一种&amp;quot;result&amp;quot;形式的表单返回。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;quot;wrapper&amp;quot;命名空间根元素的子元素。根据[http://tools.ietf.org/html/rfc3920 XMPP Core] [[XEP-0004#附录G:备注|8]]所定义， 'id' 属性必须在IQ结果中被复制。对于表单类型为&amp;quot;form&amp;quot; 或 &amp;quot;result&amp;quot;,&amp;lt;iq/&amp;gt;节应该是&amp;quot;result&amp;quot;类型。对于表单类型为&amp;quot;submit&amp;quot; 或&amp;quot;cancel&amp;quot;，  &amp;lt;iq/&amp;gt;节应该是&amp;quot;set&amp;quot;类型。&lt;br /&gt;
&lt;br /&gt;
:* 对于&amp;lt;message/&amp;gt;节，如果提供的话，&amp;lt;thread/&amp;gt;应该在回复中被复制。受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素，必须是&amp;lt;message/&amp;gt;节的子元素。&lt;br /&gt;
&lt;br /&gt;
===字段元素===&lt;br /&gt;
&lt;br /&gt;
一个&amp;quot;form&amp;quot;，&amp;quot;submit&amp;quot;，或 &amp;quot;result&amp;quot;类型的数据表单应该包含至少一个&amp;lt;field/&amp;gt;元素。一个&amp;quot;cancel&amp;quot;类型的表单，不应该包含任何&amp;lt;field/&amp;gt;元素。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;field/&amp;gt;元素可以包含以下任何子元素:&lt;br /&gt;
&lt;br /&gt;
:'''&amp;lt;desc/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据提供了该字段一个自然语言的描述，为了在用户代理中介绍（如，作为一个&amp;quot;tool-tip&amp;quot;，帮助按钮，或在字段附近的文本标记）。&amp;lt;desc/&amp;gt;元素不应包含换行符（\n和\r字符），因为布局负责用户代理，任何换行的处理（如，在用户界面演示）在这里是未指明的。（注意：提供一个字段的描述，使用&amp;lt;desc/&amp;gt;元素是被推荐的，而不是一个单独的&amp;quot;fixed&amp;quot;类型的&amp;lt;field/&amp;gt;元素。）&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;required/&amp;gt;'''&lt;br /&gt;
:该元素必须为空，标记所需的字段，为了被表单识别为有效字段。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;value/&amp;gt;'''&lt;br /&gt;
:该元素的XML字符数据定义了在&amp;quot;form&amp;quot;类型数据表单中的字段（根据表单处理实体）的默认值，在&amp;quot;submit&amp;quot;类型数据表单中由表单提交实体提供的数据，或在&amp;quot;result&amp;quot;类型数据表单中的数据结果。在&amp;quot;form&amp;quot;类型数据表单中，如果表单处理实体通过&amp;lt;value/&amp;gt;元素提供了一个默认值，表单提交实体就不应该尝试去执行一个不同的默认值。&lt;br /&gt;
 &lt;br /&gt;
:'''&amp;lt;option/&amp;gt;'''&lt;br /&gt;
:在&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;字段类型中的一个选项。&amp;lt;value/&amp;gt;子元素的XML字符定义了选项的值，而且标签属性为选项定义了一个人们易读的名称。&amp;lt;option/&amp;gt;元素必须且只能包含一个&amp;lt;value/&amp;gt;子元素。如果字段类型不是&amp;quot;list-single&amp;quot;或&amp;quot;list-multi&amp;quot;，就一定不能包含&amp;lt;option/&amp;gt;元素。&lt;br /&gt;
 &lt;br /&gt;
如果&amp;lt;field/&amp;gt;元素类型是其他的而不是“fixed”（见下文），它必须拥有一个'var'属性在表单中唯一标识字段（如果是“fixed”，可以拥有一个'var'属性）。&amp;lt;field/&amp;gt;元素可以拥有一个标签属性，为字段定义一个人们易读的名称。对于“form”类型的数据表单，每个&amp;lt;field/&amp;gt;元素应该拥有'type'属性，它定义了字段数据的数据 &amp;quot;type&amp;quot;（如果没有'type'被指定，则默认为&amp;quot;text-single&amp;quot;）。在其他表单类型的上下文中提供的字段，也可以拥有一个'type'属性。对于&amp;quot;submit&amp;quot;类型的数据表单，'type'中包含的属性是可选的，因为表单处理实体被假定知道它处理的表单的数据类型。&lt;br /&gt;
&lt;br /&gt;
如果字段出现在用户页面上（如，问卷中的项或表单结果），在XML中的字段元素的顺序，应该决定出现在用户处的项目的顺序。&lt;br /&gt;
&lt;br /&gt;
===字段类型===&lt;br /&gt;
以下字段类型代表Jabber/XMPP实体之间通用的数据类型。这些字段并打算像数据类型一样被广泛定义，如[http://www.w3.org/TR/xmlschema-2/ XML Schema Part 2] [[XEP-0004#附录G:备注|9]], 也没有定义用户界面元素。&lt;br /&gt;
&lt;br /&gt;
:'''表2:字段类型'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; &lt;br /&gt;
! 类型 !! 描述&lt;br /&gt;
|-&lt;br /&gt;
|布尔型 || 该字段允许一个实体收集或提供一个在两个选项中只能二选一的选择。默认值为&amp;quot;false&amp;quot;。[[XEP-0004#附录G:备注|10]]&lt;br /&gt;
|-&lt;br /&gt;
|固定 || 该字段是用于数据的描述（如，人们易读的&amp;quot;section&amp;quot;头信息）而不是数据的收集或提供。&amp;lt;value/&amp;gt;子元素不应该包含换行符（\n和\r字符）；然而一个应用应该生成多个固定的字段，每个都包含&amp;lt;value/&amp;gt;子元素。&lt;br /&gt;
|-&lt;br /&gt;
|隐藏 || 该字段未展现给表单提交实体，但是和表单一起返回。表单提交实体不能修改隐藏字段的值，但如果这种行为被定义为是“使用协议”时可以这样做。&lt;br /&gt;
|-&lt;br /&gt;
|多jid || 该字段允许一个实体收集或提供多个Jabber ID。每个提供的JID应该是唯一的（比较确定的，包括Nodeprep的应用、Nameprep和Resourceprep profiles of Stringprep，按XMPP Core中说明的），而重复的JID一定会被忽略。*&lt;br /&gt;
|-&lt;br /&gt;
|单jid || 该字段允许一个实体收集或提供单个的Jabber ID。&lt;br /&gt;
|-&lt;br /&gt;
|多选项列表 || 该字段允许一个实体从很多选项中收集或提供一个或多个选项。表单提交实体从表单处理实体提交的选项中选择一个或多个项，而且不能插入新的选项。表单处理实体不能修改从表单处理实体处获取的项目的顺序，因为项目的顺序可能很重要。**&lt;br /&gt;
|-&lt;br /&gt;
|单选项列表|| 该字段允许一个实体从很多选项中收集或提供一个选项。表单提交实体从表单处理实体提交的选项中选择一个项，而且不能插入新的选项。**&lt;br /&gt;
|-&lt;br /&gt;
|多文本|| 该字段允许一个实体收集或提供多行的文本。***&lt;br /&gt;
|-&lt;br /&gt;
|私有文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上遮蔽。（如，星号显示的多个实体）&lt;br /&gt;
|-&lt;br /&gt;
|单文本|| 该字段允许一个实体收集或提供一行或一个词的文本，其应该在界面上显示。这个字段类型是缺省的而且必须假定，当一个表单提交实体收到一个不知道的字段类型时。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;jid-single&amp;quot;或&amp;quot;jid-multi&amp;quot;提供的数据必须包含一个或一个以上的有效Jabber ID，有效性是由XMPP Core（参看后面章节的Data Validation）定义的寻址规则决定的。&lt;br /&gt;
&lt;br /&gt;
注意：在list-multi和list-single中的&amp;lt;option/&amp;gt;元素必须是唯一的，唯一性是由‘label’属性的值和&amp;lt;value/&amp;gt;元素中的XML字符数据决定的。（即，2个都必须是唯一的）&lt;br /&gt;
&lt;br /&gt;
注意：为字段类型&amp;quot;text-multi&amp;quot;提供的数据不应该包含任何换行符（\n和\r字符）。而应用程序应该把数据分为多个字符串（基于平台插入的换行符），然后用不同的&amp;lt;value/&amp;gt;元素中的XML字符数据指定每一个字符串。同样的，以&amp;quot;text-multi&amp;quot;字段类型接收了多个&amp;lt;value/&amp;gt;元素的应用程序，应该把value元素中的XML字符数据合并成一个文本块以提交给用户。每一个字符串为平台适时的通过换行符分开。&lt;br /&gt;
&lt;br /&gt;
===表单结果中的多个项目===&lt;br /&gt;
在某些情况下（如，查询请求的结果），传达多个项目是必须的。因此，一个&amp;quot;result&amp;quot;类型的数据表单可能包含2个上面基本语法没有描述的子元素:&lt;br /&gt;
&lt;br /&gt;
#只有一个&amp;lt;reported/&amp;gt;元素，可以理解为一个“表头”描述数据去遵循。 &lt;br /&gt;
#零个或更多&amp;lt;item/&amp;gt;元素，可以理解为包含符合请求的数据（如果有的话）的&amp;quot;table cells&amp;quot;。 &lt;br /&gt;
&lt;br /&gt;
其语法如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;x xmlns='jabber:x:data' &lt;br /&gt;
   type='result'&amp;gt; &lt;br /&gt;
  &amp;lt;reported&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name' label='description' type='{field-type}'/&amp;gt; &lt;br /&gt;
  &amp;lt;/reported&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  &amp;lt;item&amp;gt; &lt;br /&gt;
    &amp;lt;field var='field-name'&amp;gt; &lt;br /&gt;
      &amp;lt;value&amp;gt;field-value&amp;lt;/value&amp;gt; &lt;br /&gt;
    &amp;lt;/field&amp;gt; &lt;br /&gt;
  &amp;lt;/item&amp;gt; &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
  . &lt;br /&gt;
&amp;lt;/x&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些元素每个都必须包含一个或多个&amp;lt;field/&amp;gt;子元素。&amp;lt;reported/&amp;gt;元素为结果项定义数据格式，通过为每个项目指定所期望的字段。为此，除了'var'属性，&amp;lt;field/&amp;gt;元素还应该有'type'属性'label'属性；而且不能包含&amp;lt;value/&amp;gt;元素。在结果集中，每个&amp;lt;item/&amp;gt;元素定义一个项目，而且必须包含在&amp;lt;reported/&amp;gt;元素（虽然&amp;lt;value/&amp;gt;元素中的XML字符数据可能为空）中指定的字段。&lt;br /&gt;
&lt;br /&gt;
==数据有效性==&lt;br /&gt;
&lt;br /&gt;
数据有效性是表单处理实体（通常是一个服务器，服务，或bot）的责任，而不是表单提交实体（通常是一个由用户控制的客户端）。这有助于满足保持客户端实现简单的要求。如果表单处理实体确定提供的数据是无效的，它应该返回一个“不接受”的错误。选择在XMPP &amp;lt;text/&amp;gt;元素中提供文字说明，或识别问题的特殊应用子元素（参考[http://xmpp.org/extensions/xep-0086.html Error Condition Mappings] [[XEP-0004#附录G:备注|11]]中的映射和格式）。&lt;br /&gt;
&lt;br /&gt;
==例子==&lt;br /&gt;
&lt;br /&gt;
对于下面的例子，我们假设存在一个bot hosting服务在Jabber network上，位于&amp;lt;botster.shakespeare.lit&amp;gt;。这个服务允许注册用户创建和配置新的bots，对已经存在的bots查找和交互，等等。我们假定这些交互的发生使用的Ad-Hoc Commands [12]协议，协议被用作表单的&amp;quot;wrapper&amp;quot;协议，受'jabber:x:data'命名空间限制。下面章节中的例子，体现了前文中描述的数据表单协议的大部分特性。&lt;br /&gt;
&lt;br /&gt;
注意：额外的例子可以通过各种“使用协议”的说明书中找到。如XEP-0045:Multi-User Chat和XEP-0055:Jabber Search。&lt;br /&gt;
&lt;br /&gt;
===配置===&lt;br /&gt;
&lt;br /&gt;
:第一步是为用户在主机上创建一个新的bot。我们假设这是通过发送一个“创建”命令给期望的bot来实现的:&lt;br /&gt;
&lt;br /&gt;
:'''例1.用户请求Bot创建'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='create' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后主服务返回一个数据表单个用户:&lt;br /&gt;
&lt;br /&gt;
:'''例2.服务返回一个Bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Bot Configuration&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to configure your new bot!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' &lt;br /&gt;
             var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 1: Bot Info&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             label='The name of your bot' &lt;br /&gt;
             var='botname'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' &lt;br /&gt;
             label='Helpful description of your bot' &lt;br /&gt;
             var='description'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' &lt;br /&gt;
             label='Public bot?' &lt;br /&gt;
             var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' &lt;br /&gt;
             label='Password for special access' &lt;br /&gt;
             var='password'/&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 2: Features&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' &lt;br /&gt;
             label='What features will the bot support?' &lt;br /&gt;
             var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Contests'&amp;gt;&amp;lt;value&amp;gt;contests&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='News'&amp;gt;&amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Polls'&amp;gt;&amp;lt;value&amp;gt;polls&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Reminders'&amp;gt;&amp;lt;value&amp;gt;reminders&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='Search'&amp;gt;&amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 3: Subscriber List&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' &lt;br /&gt;
             label='Maximum number of subscribers' &lt;br /&gt;
             var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;option label='10'&amp;gt;&amp;lt;value&amp;gt;10&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='20'&amp;gt;&amp;lt;value&amp;gt;20&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='30'&amp;gt;&amp;lt;value&amp;gt;30&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='50'&amp;gt;&amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='100'&amp;gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
        &amp;lt;option label='None'&amp;gt;&amp;lt;value&amp;gt;none&amp;lt;/value&amp;gt;&amp;lt;/option&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='fixed'&amp;gt;&amp;lt;value&amp;gt;Section 4: Invitations&amp;lt;/value&amp;gt;&amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' &lt;br /&gt;
             label='People to invite' &lt;br /&gt;
             var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;desc&amp;gt;Tell all your friends about your new bot!&amp;lt;/desc&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后用户提交配置表单:&lt;br /&gt;
&lt;br /&gt;
:'''例3.用户提交bot创建表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='romeo@montague.net/home' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='set' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-multi' var='description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;This bot enables you to send requests to&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Google and receive the search results right&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;in your Jabber client. It&amp;amp;apos; really cool!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;It even supports Google News!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:然后服务返回结果给用户:&lt;br /&gt;
&lt;br /&gt;
:'''例4.服务返回bot创建的结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='romeo@montague.net/home' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='create2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands' &lt;br /&gt;
           node='create' &lt;br /&gt;
           sessionid='create:20040408T0128Z' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='hidden' var='FORM_TYPE'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;jabber:bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='botname'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The Jabber Google Bot&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='boolean' var='public'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-private' var='password'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;v3r0na&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-multi' var='features'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;news&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;search&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='list-single' var='maxsubs'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;50&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field type='jid-multi' var='invitelist'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;juliet@capulet.com&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;benvolio@montague.net&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===搜索===&lt;br /&gt;
&lt;br /&gt;
既然用户已经创建了这个搜索bot,我们假设他所邀请的好友中的一个，决定通过发送一个搜索请求来试一试:&lt;br /&gt;
&lt;br /&gt;
:'''例5.用户请求搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           action='execute'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例6.服务返回搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search1'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='executing'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='form'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;instructions&amp;gt;Fill out this form to search for information!&amp;lt;/instructions&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' &lt;br /&gt;
             var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;required/&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例7.用户提交搜索表单'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='juliet@capulet.com/chamber' &lt;br /&gt;
    to='joogle@botster.shakespeare.lit' &lt;br /&gt;
    type='get' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='submit'&amp;gt; &lt;br /&gt;
      &amp;lt;field type='text-single' var='search_request'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;verona&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例8.服务返回搜索结果'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq from='joogle@botster.shakespeare.lit' &lt;br /&gt;
    to='juliet@capulet.com/chamber' &lt;br /&gt;
    type='result' &lt;br /&gt;
    xml:lang='en' &lt;br /&gt;
    id='search2'&amp;gt; &lt;br /&gt;
  &amp;lt;command xmlns='http://jabber.org/protocol/commands'  &lt;br /&gt;
           node='search' &lt;br /&gt;
           status='completed'&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;title&amp;gt;Joogle Search: verona&amp;lt;/title&amp;gt; &lt;br /&gt;
      &amp;lt;reported&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'/&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'/&amp;gt; &lt;br /&gt;
      &amp;lt;/reported&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Comune di Verona - Benvenuti nel sito ufficiale&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.comune.verona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;benvenuto!&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.hellasverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Universita degli Studi di Verona - Home Page&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.univr.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Aeroporti del Garda&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.aeroportoverona.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
      &amp;lt;item&amp;gt; &lt;br /&gt;
        &amp;lt;field var='name'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;Veronafiere - fiera di Verona&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
        &amp;lt;field var='url'&amp;gt; &lt;br /&gt;
          &amp;lt;value&amp;gt;http://www.veronafiere.it/&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;/item&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/command&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==服务发现==&lt;br /&gt;
&lt;br /&gt;
如果一个实体支持包含受'jabber:x:data'命名空间限制的&amp;lt;x/&amp;gt;元素作为&amp;lt;message/&amp;gt;节直接子元素，它必须报告支持包含一个&amp;quot;jabber:x:data&amp;quot;（参看Protocol Namespaces中关于一个或多个永久命名空间的发行）的服务搜索特征，去响应服务搜索信息请求:&lt;br /&gt;
&lt;br /&gt;
:'''例9.服务搜索信息请求'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='romeo@montague.net/orchard' &lt;br /&gt;
    to='juliet@capulet.com/balcony' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''例10.服务搜索信息响应'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='juliet@capulet.com/balcony' &lt;br /&gt;
    to='romeo@montague.net/orchard' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
    &amp;lt;feature var='jabber:x:data'/&amp;gt; &lt;br /&gt;
    ... &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果实体支持数据表单，间接的通过在wrapper命名空间中包含数据表单，它不能为'jabber:x:data'命名空间通知支持，因为在wrapper协助中的支持是隐性的。&lt;br /&gt;
&lt;br /&gt;
==安全性考虑==&lt;br /&gt;
&lt;br /&gt;
没有安全问题与上述的规范和XMPP Core中相关章节的描述有关。&lt;br /&gt;
&lt;br /&gt;
==IANA考虑==&lt;br /&gt;
&lt;br /&gt;
这份文档与[http://www.iana.org/ Internet Assigned Numbers Authority (IANA)] [[XEP-0004#附录G:备注|13]]无关。&lt;br /&gt;
&lt;br /&gt;
==XMPP注册考虑==&lt;br /&gt;
&lt;br /&gt;
===协议命名空间===&lt;br /&gt;
&lt;br /&gt;
[http://xmpp.org/registrar/ XMPP Registrar] [[XEP-0004#附录G:备注|14]]在它注册的协议命名空间中包含'jabber:x:data'命名空间。&lt;br /&gt;
&lt;br /&gt;
===参数值===&lt;br /&gt;
&lt;br /&gt;
XMPP注册员维持着一个与'jabber:x:data'命名空间相关的注册参数值。具体定义在[http://xmpp.org/extensions/xep-0068.html Field Standardization for Data Forms] [[XEP-0004#附录G:备注|15]]。注册的地方是&amp;lt;http://xmpp.org/registrar/formtypes.html&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==XML 架构==&lt;br /&gt;
&lt;br /&gt;
该架构是描述性的，不是规范的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;xs:schema &lt;br /&gt;
    xmlns:xs='http://www.w3.org/2001/XMLSchema' &lt;br /&gt;
    targetNamespace='jabber:x:data' &lt;br /&gt;
    xmlns='jabber:x:data' &lt;br /&gt;
    elementFormDefault='qualified'&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
      The protocol documented by this schema is defined in &lt;br /&gt;
      XEP-0004: http://www.xmpp.org/extensions/xep-0004.html &lt;br /&gt;
    &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='x'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='instructions'  &lt;br /&gt;
                    minOccurs='0'  &lt;br /&gt;
                    maxOccurs='unbounded'  &lt;br /&gt;
                    type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='title' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='reported' minOccurs='0' maxOccurs='1'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='item' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='required'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='cancel'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='form'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='result'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='submit'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='field'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='desc' minOccurs='0' type='xs:string'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element name='required' minOccurs='0' type='empty'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='option' minOccurs='0' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='type' use='optional'&amp;gt; &lt;br /&gt;
        &amp;lt;xs:simpleType&amp;gt; &lt;br /&gt;
          &amp;lt;xs:restriction base='xs:NCName'&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='boolean'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='fixed'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='hidden'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='jid-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='list-single'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-multi'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-private'/&amp;gt; &lt;br /&gt;
            &amp;lt;xs:enumeration value='text-single'/&amp;gt; &lt;br /&gt;
          &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
        &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:attribute&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='var' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='option'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='value'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
      &amp;lt;xs:attribute name='label' type='xs:string' use='optional'/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='value' type='xs:string'/&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='reported'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:annotation&amp;gt; &lt;br /&gt;
      &amp;lt;xs:documentation&amp;gt; &lt;br /&gt;
        When contained in a &amp;quot;reported&amp;quot; element, the &amp;quot;field&amp;quot; element &lt;br /&gt;
        SHOULD NOT contain a &amp;quot;value&amp;quot; child. &lt;br /&gt;
      &amp;lt;/xs:documentation&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:annotation&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:element name='item'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:complexType&amp;gt; &lt;br /&gt;
      &amp;lt;xs:sequence&amp;gt; &lt;br /&gt;
        &amp;lt;xs:element ref='field' maxOccurs='unbounded'/&amp;gt; &lt;br /&gt;
      &amp;lt;/xs:sequence&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:complexType&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:element&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xs:simpleType name='empty'&amp;gt; &lt;br /&gt;
    &amp;lt;xs:restriction base='xs:string'&amp;gt; &lt;br /&gt;
      &amp;lt;xs:enumeration value=''/&amp;gt; &lt;br /&gt;
    &amp;lt;/xs:restriction&amp;gt; &lt;br /&gt;
  &amp;lt;/xs:simpleType&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/xs:schema&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==最终状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范已经是最终状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* 指定的'var'属性是所有字段类型所必须的，除了&amp;quot;fixed&amp;quot;, 因为'var'属性是可选的。&lt;br /&gt;
&lt;br /&gt;
* 通过服务搜索指定何时去通知支持。&lt;br /&gt;
  &lt;br /&gt;
* 移除引用&amp;lt;presence/&amp;gt;节。&lt;br /&gt;
&lt;br /&gt;
==草稿状态的修改==&lt;br /&gt;
&lt;br /&gt;
当本规范在草稿状态时，下面的实体协议已经做了修改：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能直接包含在&amp;lt;message/&amp;gt;和&amp;lt;presence/&amp;gt;节中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素可能包含一个&amp;lt;title/&amp;gt;子元素，在表单或结果中。&lt;br /&gt;
* &amp;lt;x/&amp;gt;元素必须拥有一个‘类型’属性。&lt;br /&gt;
* &amp;lt;field/&amp;gt;元素可能是类型='jid-single'。&lt;br /&gt;
* 结果可能以&amp;lt;item/&amp;gt;标签的方式返回报告。&lt;br /&gt;
* 结果可能包含一个&amp;lt;reported/&amp;gt;元素的结果集。&lt;br /&gt;
* &amp;lt;reported/&amp;gt;字段可能拥有一个‘类型’属性，提供如何与数据交互的提示（类型='jid-single'是最有用的）。&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0004&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：2.9&lt;br /&gt;
&lt;br /&gt;
最后更新：2007-07-13&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[RFC3920|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
替代标准：无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：x-data&lt;br /&gt;
&lt;br /&gt;
XML架构:&amp;lt;http://www.xmpp.org/schemas/x-data.xsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0004.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0004.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0004.xml XML] [http://xmpp.org/extensions/xep-0004.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
&lt;br /&gt;
'''Ryan Eatmon'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:reatmon@jabber.org reatmon@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: reatmon@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Joe Hildebrand'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jhildebr@cisco.com jhildebr@cisco.com]&lt;br /&gt;
&lt;br /&gt;
JabberID: hildjj@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Jeremie Miller'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:jer@jabber.org jer@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: jer@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Thomas Muldowney'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:temas@jabber.org temas@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: temas@jabber.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: [mailto:stpeter@jabber.org stpeter@jabber.org]&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
#XEP-0077: In-Band Registration &amp;lt;http://xmpp.org/extensions/xep-0077.html&amp;gt;.&lt;br /&gt;
#XEP-0055: Jabber Search &amp;lt;http://xmpp.org/extensions/xep-0055.html&amp;gt;.&lt;br /&gt;
#XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
#XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
#XForms 1.0 &amp;lt;http://www.w3.org/TR/xforms&amp;gt;.&lt;br /&gt;
#XHTML 1.0 &amp;lt;http://www.w3.org/TR/xhtml1&amp;gt;.&lt;br /&gt;
#Modularization of XHTML &amp;lt;http://www.w3.org/TR/2004/WD-xhtml-modularization-20040218/&amp;gt;.&lt;br /&gt;
#RFC 3920: Extensible Messaging and Presence Protocol (XMPP): Core &amp;lt;http://tools.ietf.org/html/rfc3920&amp;gt;.&lt;br /&gt;
#XML Schema Part 2: Datatypes &amp;lt;http://www.w3.org/TR/xmlschema-2/&amp;gt;.&lt;br /&gt;
#In accordance with Section 3.2.2.1 of XML Schema Part 2: Datatypes, the allowable lexical representations for the xs:boolean datatype are the strings &amp;quot;0&amp;quot; and &amp;quot;false&amp;quot; for the concept 'false' and the strings &amp;quot;1&amp;quot; and &amp;quot;true&amp;quot; for the concept 'true'; implementations MUST support both styles of lexical representation.&lt;br /&gt;
#XEP-0086: Error Condition Mappings &amp;lt;http://xmpp.org/extensions/xep-0086.html&amp;gt;.&lt;br /&gt;
#XEP-0050: Ad-Hoc Commands &amp;lt;http://xmpp.org/extensions/xep-0050.html&amp;gt;.&lt;br /&gt;
#The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
#The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
#XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
&lt;br /&gt;
注意: &lt;br /&gt;
&lt;br /&gt;
'''版本 2.9 (2007-08-13)'''&lt;br /&gt;
&lt;br /&gt;
Clarified the definition and handling of the list-multi and list-single field types; specified that hidden field values should not be modified unless such behavior is defined for the using protocol; specified that a submission should include all fields provided in the empty form and may include additional fields, but that additional fields must be ignored if not understood by the form-processing entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.8 (2007-05-21)'''&lt;br /&gt;
&lt;br /&gt;
Removed mentions of presence stanzas; added section on discovering support; added section on substantive changes in Final state.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
'''版本 2.7 (2006-01-25)'''&lt;br /&gt;
&lt;br /&gt;
Incorporated errata: (1) clarified rules regarding inclusion of option and value elements depending on field type; (2) clarified handling of default values; (3) added value elements to list-multi field in Example 2; (4) harmonized spelling of form-processing entity and form-submitting entity.&lt;br /&gt;
&lt;br /&gt;
(psa)&lt;br /&gt;
&lt;br /&gt;
Version 2.6 (2004-10-13)&lt;br /&gt;
Incorporated errata: (1) corrected syntax of &amp;lt;reported/&amp;gt; element (&amp;lt;field/&amp;gt; element should not contain a &amp;lt;value/&amp;gt; child); (2) corrected Example 8.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.5 (2004-05-07)&lt;br /&gt;
Clarified terminology regarding form-processing entities and form-submitting entities; corrected several small errors in the schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.4 (2004-05-04)&lt;br /&gt;
Per discussion by the authors and Jabber Council, specified that the 'var' attribute is required for all field types except &amp;quot;fixed&amp;quot;, for which the 'var' attribute is optional.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.3 (2004-03-31)&lt;br /&gt;
Formalization and further editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.2 (2004-01-22)&lt;br /&gt;
Editorial revisions.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.1 (2003-02-16)&lt;br /&gt;
Added schema.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 2.0 (2002-12-09)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Final.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 1.1 (2002-10-15)&lt;br /&gt;
Call for Experience changes (see Changes in Draft State section). This version voted to Final on 2002-12-09.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 1.0 (2002-04-24)&lt;br /&gt;
Per a vote of the Jabber Council, changed status to Draft.&lt;br /&gt;
&lt;br /&gt;
(psa) &lt;br /&gt;
Version 0.6 (2002-03-15)&lt;br /&gt;
Protocol tweaks based on Standards list discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.5 (2002-02-06)&lt;br /&gt;
Protocol tweaks based on implementation and discussion.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.4 (2001-11-16)&lt;br /&gt;
Major redesign to attempt to clarify the scope of this document and limit what it is trying to solve.&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.3 (2001-07-23)&lt;br /&gt;
Protocol update&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.2 (2001-06-29)&lt;br /&gt;
Protocol update and DocBook version&lt;br /&gt;
&lt;br /&gt;
(rwe) &lt;br /&gt;
Version 0.1 (2001-01-25)&lt;br /&gt;
Initial release&lt;br /&gt;
&lt;br /&gt;
(rwe)&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	<entry>
		<id>http://wiki.jabbercn.org/XEP-0128</id>
		<title>XEP-0128</title>
		<link rel="alternate" type="text/html" href="http://wiki.jabbercn.org/XEP-0128"/>
				<updated>2010-10-11T08:04:58Z</updated>
		
		<summary type="html">&lt;p&gt;Sprint20092010: /* 附录H:修订历史 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:XMPP扩展]]&lt;br /&gt;
[[Category:已翻译]]&lt;br /&gt;
&lt;br /&gt;
'''本文的英文原文来自[http://xmpp.org/extensions/xep-0128.html XEP-0128]'''&lt;br /&gt;
&lt;br /&gt;
'''XEP-0128: 发现服务扩展'''&lt;br /&gt;
&lt;br /&gt;
摘要: 这个文件规定了发现服务的扩展信息的最佳做法。&lt;br /&gt;
&lt;br /&gt;
作者: Peter Saint-Andre &lt;br /&gt;
&lt;br /&gt;
版权: © 1999 - 2010 XMPP标准化基金会(XSF). 参见[[XEP-0030#附录C:法律通告|法律通告]].&lt;br /&gt;
&lt;br /&gt;
现状: 活跃 &lt;br /&gt;
&lt;br /&gt;
类型: 信息 &lt;br /&gt;
&lt;br /&gt;
版本: 1.0 &lt;br /&gt;
&lt;br /&gt;
最后更新: 2004-10-20 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
注意：注意：此信息规范定义了一个最佳实践或协议配置文件已被批准的XMPP理事会和/或董事XSF局。实现是鼓励和最佳做法或协议配置文件是在生产系统中部署适当的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
开发人员觉得[http://xmpp.org/extensions/xep-0030.html 发现服务]不能包含更多的信息. 例如, &amp;lt;identity/&amp;gt; 元素不包含'description'属性, 我们可以增加这个属性吗? 答案是可以,但现在不行,太迟了(因为XEP-0030是最终版). 因此,最好的办法是制定一个扩充机制.&lt;br /&gt;
&lt;br /&gt;
让我们参考一个示例. 一个[http://xmpp.org/extensions/xep-0045.html 多用户聊天室][http://xmpp.org/extensions/xep-0128.html#nt-id92624[2]] 可能想要获取更多的信息, 包括房间描述信息,房间主题,房间在线人数和房间所有者的JID.&lt;br /&gt;
&lt;br /&gt;
增加一个新属性的服务发现架构(即使真的是一个选项)不能解决的问题,因为一MUC的服务可能需要提供某些信息，而发布，[http://xmpp.org/extensions/xep-0060.html 订阅] [http://xmpp.org/extensions/xep-0128.html#nt-id92653[3]]服务可能需要提供其信息。 &lt;br /&gt;
&lt;br /&gt;
一个更好的解决办法是通过一个扩展的信息包括命名空间，提供了一种灵活的结构化数据格式定义合格。 谢天谢地，我们已经拥有了这样一个协议： [http://xmpp.org/extensions/xep-0004.html 数据表格] [http://xmpp.org/extensions/xep-0128.html#nt-id92681[4]]。 此外，我们拥有一个共同的方式来定义字段形式用于数据： [http://xmpp.org/extensions/xep-0068.html 数据表格现场标准化] [http://xmpp.org/extensions/xep-0128.html#nt-id92702 [5]]。 使用这些构建模块，我们可以定义为扩展服务发现结果的一些最佳做法。&lt;br /&gt;
&lt;br /&gt;
==建议==&lt;br /&gt;
如果一个实体的希望提供服务发现协议的扩展信息,出现在回复信息内,它应该这样做:每个独立的&amp;lt;field/&amp;gt;元素包含&amp;lt;value/&amp;gt;点数据信息子节点,所有&amp;lt;field/&amp;gt;元素包含在一个类型为&amp;quot;result&amp;quot;命名空间值为'jabber:x:data'的&amp;lt;x/&amp;gt;元素里.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type=&amp;quot;result&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;query xmlns=&amp;quot;http://jabber.org/protocol/disco#info&amp;quot;&amp;gt;  &lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;x type='result' xmlns='jabber:x:data'&amp;gt;&lt;br /&gt;
    &amp;lt;field var='[var-name]' label='[optional]'&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;[var-value]&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;/field&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
  &amp;lt;/x&amp;gt;&lt;br /&gt;
&amp;lt;/query&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果数据字段被用来在由XMPP标准基金会核准的议定书时，他们应该符合相关的XMPP扩展协议规范并按照XEP - 0068定义的规则注册，返回信息中包含一个&amp;lt;field/&amp;gt;元素,其'var'属性为&amp;quot;FORM_TYPE&amp;quot;，其'type'属性的值为&amp;quot;hidden&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
一个实体不能提供'http://jabber.org/protocol/disco#items' 命名空间相关子信息,因为服务发现的核心原则是：一个实体必须确定其身份,不界定的身份与子节点的实体.&lt;br /&gt;
&lt;br /&gt;
==示例==&lt;br /&gt;
===IM服务器===&lt;br /&gt;
&lt;br /&gt;
以下是即时消息服务器返回一个标准的服务查询的例子.&lt;br /&gt;
&lt;br /&gt;
'''例1. 实体查询信息服务器'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='capulet.com' &lt;br /&gt;
    to='shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt;&lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;iq type='result' from='shakespeare.lit' &lt;br /&gt;
    to='capulet.com' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='server' &lt;br /&gt;
        type='im' &lt;br /&gt;
        name='shakespeare.lit jabber server'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/network/serverinfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5222&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='c2s_port_ssl'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;5223&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='http_access'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/jabber&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='ip_version'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv4&amp;lt;/value&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;ipv6&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='info_url'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://shakespeare.lit/support.php&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===群===&lt;br /&gt;
&lt;br /&gt;
下面是在多用户房间里查询服务的例子.&lt;br /&gt;
&lt;br /&gt;
'''例2. 用户查询房间信息'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;iq type='get' &lt;br /&gt;
    from='hag66@shakespeare.lit/pda' &lt;br /&gt;
    to='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'/&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;iq type='result' &lt;br /&gt;
    from='darkcave@macbeth.shakespeare.lit' &lt;br /&gt;
    to='hag66@shakespeare.lit/pda' &lt;br /&gt;
    id='disco1'&amp;gt; &lt;br /&gt;
  &amp;lt;query xmlns='http://jabber.org/protocol/disco#info'&amp;gt; &lt;br /&gt;
    &amp;lt;identity &lt;br /&gt;
        category='conference' &lt;br /&gt;
        type='text' &lt;br /&gt;
        name='A Dark Cave'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='http://jabber.org/protocol/muc'/&amp;gt; &lt;br /&gt;
    &amp;lt;feature var='jabber:iq:register'/&amp;gt; &lt;br /&gt;
    &amp;lt;x xmlns='jabber:x:data' type='result'&amp;gt; &lt;br /&gt;
      &amp;lt;field var='FORM_TYPE' type='hidden'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;http://jabber.org/protocol/muc#roominfo&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_description' label='Description'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;The place for all good witches!&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_subject' label='Subject'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;Spells&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_occupants' label='Number of occupants'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;3&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
      &amp;lt;field var='muc#roominfo_lang' label='Language of discussion'&amp;gt; &lt;br /&gt;
        &amp;lt;value&amp;gt;en&amp;lt;/value&amp;gt; &lt;br /&gt;
      &amp;lt;/field&amp;gt; &lt;br /&gt;
    &amp;lt;/x&amp;gt; &lt;br /&gt;
  &amp;lt;/query&amp;gt; &lt;br /&gt;
&amp;lt;/iq&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==实现说明==&lt;br /&gt;
&lt;br /&gt;
一般来说，XMPP标准基金会给每一个发现服务在注册登记时指定一个FORM_TYPE.此外，特定的应用可以定义应用程序以及具体FORM_TYPEs，一个实体可以有多个服务发现的身份（例如，一个XMPP服务器也可能作为一个发布，订阅服务）。因此，它是可能的（允许一个单一的服务发现的结果，发现含有多种服务扩展元素（可能高达2为每个标识元素））。然而，在实践中是不可能发现任何特定服务的结果将包含多个服务扩展元素的发现。&lt;br /&gt;
&lt;br /&gt;
==安全注意事项==&lt;br /&gt;
&lt;br /&gt;
应用程序应确网络上任何实体都能发现服务扩展信息.&lt;br /&gt;
&lt;br /&gt;
==IANA注意事项==&lt;br /&gt;
&lt;br /&gt;
这份文件并不需要与互联网分配编码机构(IANA) [6]互动.&lt;br /&gt;
&lt;br /&gt;
==XMPP协议注册事项==&lt;br /&gt;
&lt;br /&gt;
本文件并不需要的相互作用的XMPP注册 [ 7 ]，但是，最佳做法是在XMPP的登记FORM_TYPEs和field值.&lt;br /&gt;
&lt;br /&gt;
==附录==&lt;br /&gt;
&lt;br /&gt;
===附录A:文档信息===&lt;br /&gt;
&lt;br /&gt;
系列：[http://xmpp.org/extensions/ XEP]&lt;br /&gt;
&lt;br /&gt;
序号：0128&lt;br /&gt;
&lt;br /&gt;
发布者：[http://xmpp.org/xsf/ XMPP标准基金会]&lt;br /&gt;
&lt;br /&gt;
状态：[http://www.xmpp.org/extensions/xep-0001.html#states-Final 终结版]&lt;br /&gt;
&lt;br /&gt;
类型：[http://www.xmpp.org/extensions/xep-0001.html#types-Standards%20Track 标准跟踪]&lt;br /&gt;
&lt;br /&gt;
版本：1.0&lt;br /&gt;
&lt;br /&gt;
最后更新：2004-10-20&lt;br /&gt;
&lt;br /&gt;
批准机构：[http://xmpp.org/council/ XMPP理事会]&lt;br /&gt;
&lt;br /&gt;
依赖标准：[[XEP-0004|XEP-0030|XEP-0068|XMPP Core]]&lt;br /&gt;
&lt;br /&gt;
取代: 无&lt;br /&gt;
&lt;br /&gt;
被替代标准：无&lt;br /&gt;
&lt;br /&gt;
缩略名：N/A&lt;br /&gt;
&lt;br /&gt;
原文控制： [http://svn.xmpp.org:18080/browse/XMPP/trunk/extensions/xep-0128.xml HTML] [http://svn.xmpp.org:18080//changelog/~rss/XMPP/trunk/extensions/xep-0128.xml/rss.xml RSS]&lt;br /&gt;
&lt;br /&gt;
本文的其它格式： [http://xmpp.org/extensions/xep-0030.xml XML] [http://xmpp.org/extensions/xep-0128.pdf PDF]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录B:作者信息===&lt;br /&gt;
'''Peter Saint-Andre'''&lt;br /&gt;
&lt;br /&gt;
Email: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
JabberID: stpeter@jabber.org&lt;br /&gt;
&lt;br /&gt;
URI: https://stpeter.im/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Template:XEP附录CDEF}}&lt;br /&gt;
&lt;br /&gt;
===附录G:备注===&lt;br /&gt;
1. XEP-0030: Service Discovery &amp;lt;http://xmpp.org/extensions/xep-0030.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. XEP-0045: Multi-User Chat &amp;lt;http://xmpp.org/extensions/xep-0045.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. XEP-0060: Publish-Subscribe &amp;lt;http://xmpp.org/extensions/xep-0060.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
4. XEP-0004: Data Forms &amp;lt;http://xmpp.org/extensions/xep-0004.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. XEP-0068: Field Data Standardization for Data Forms &amp;lt;http://xmpp.org/extensions/xep-0068.html&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see &amp;lt;http://www.iana.org/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
7. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see &amp;lt;http://xmpp.org/registrar/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
===附录H:修订历史===&lt;br /&gt;
注意: 本协议的旧版本可能在 http://xmpp.org/extensions/attic/ 还可用 &lt;br /&gt;
&lt;br /&gt;
Version 1.0 (2004-10-20)&lt;br /&gt;
&lt;br /&gt;
Per a vote of the Jabber Council, advanced status to Active; also added implementation notes. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.2 (2004-03-15)&lt;br /&gt;
&lt;br /&gt;
Clarified syntax and corrected several errors; added IM server example. (psa) &lt;br /&gt;
&lt;br /&gt;
Version 0.1 (2004-03-05)&lt;br /&gt;
&lt;br /&gt;
Initial version. (psa) &lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
结束&lt;br /&gt;
It is named Christian Louboutin for the reason that man who create Christian Louboutin shoes. At the same time, it's helpful to reduce the risk of injury for the player. If you think your feet should be protected well during the strenuous exercise, the Christian Louboutin Pumps are the right choice for you.&lt;br /&gt;
There are many Cheap Christian Louboutin Heels from our shop. If you want to learn more informations of those Christian Louboutin Boots, please visite our website http://www.louboutinshopsale.com/. Are you looking for a comfortable shoes? We are ready for you to give you great discount Christian Louboutin Sandals and best service.&lt;/div&gt;</summary>
		<author><name>Sprint20092010</name></author>	</entry>

	</feed>