﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-hoojo-随笔分类-Operfire/XMPP</title><link>http://www.blogjava.net/hoojo/category/51688.html</link><description>学习在于积累：滴水可以石穿！学而不思则罔，思而不学则殆！ </description><language>zh-cn</language><lastBuildDate>Mon, 13 Aug 2012 09:35:27 GMT</lastBuildDate><pubDate>Mon, 13 Aug 2012 09:35:27 GMT</pubDate><ttl>60</ttl><item><title>JavaScript/jQuery、HTML、CSS 构建 Web IM 远程及时聊天通信程序</title><link>http://www.blogjava.net/hoojo/archive/2012/08/13/385360.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Mon, 13 Aug 2012 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/08/13/385360.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/385360.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/08/13/385360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/385360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/385360.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇文章主要介绍用JavaScript和jQuery、HTML、CSS以及用第三方聊天JavaScript（jsjac）框架构建一个BS Web的聊天应用程序。此程序可以和所有连接到Openfire服务器的应用进行通信、发送消息。如果要运行本程序还需要一个聊天服务器Openfire， 以及需要用到Http方式和Openfire通信的第三方库（JabberHTTPBind）。 JabberHTTPB...&nbsp;&nbsp;<a href='http://www.blogjava.net/hoojo/archive/2012/08/13/385360.html'>阅读全文</a><img src ="http://www.blogjava.net/hoojo/aggbug/385360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-08-13 09:39 <a href="http://www.blogjava.net/hoojo/archive/2012/08/13/385360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移动应用（手机应用）开发IM聊天程序解决方案</title><link>http://www.blogjava.net/hoojo/archive/2012/07/31/384441.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Tue, 31 Jul 2012 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/07/31/384441.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/384441.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/07/31/384441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/384441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/384441.html</trackback:ping><description><![CDATA[<p>这个解决方法已经定制下来很久了，上一段时间比较忙，没有时间整这些东西。最近稍微好些，不怎么加班。所以抽空总结下，同时也分享给大家，也算是给大家一个借鉴吧！或许这并不是最好的解决方案，但只要能满足当前需求的最好方案也算是最好的解决方案，谁说不是呢！O(&#8745;_&#8745;)O~</p> <p>&nbsp;</p> <p>我们采用的方案如下：</p> <blockquote> <p>先看图</p> <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/IM_D61B/xmpp-server-client.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="xmpp-server-client" alt="xmpp-server-client" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/IM_D61B/xmpp-server-client_thumb.png" border="0" height="417" width="640" /></a></p></blockquote> <p>上图的流程大致上是这样的：  </p><blockquote> <p>手机端向PC端发送聊天内容  </p><p>1、手机端程序通过Socket连接服务器端的ServerSocket  </p><p>2、然后服务器端根据手机Mobile客户端发送过来统一规范的报文或聊天内容，进行解析  </p><p>3、然后将解析的内容，再用smack框架转发到openfire服务器  </p><p>4、最后由openfire服务器向客户端（BS、CS、PhoneClient）程序发送聊天信息。这里的客户端可以是pc上的浏览器，pc上的桌面应用，手机应用等  </p><p>5、PC客户端BS程序（用http bind方式监听）的长连接监听到openfire服务器发送过来的数据，直接在页面中显示</p></blockquote> <p>&nbsp; </p><blockquote> <p>同样，PC客户端向手机端发送聊天内容  </p><p>1、PC客户端（BS）可以直接用http bind（xmpp 提供的http请求的长连接方式）直接向openfire服务器发送聊天数据；  </p><p>2、然后openfire服务器接收到聊天内容的时候，这时候socket服务器中的smack框架中有一个聊天内容的监听器  </p><p>3、监听到PC端向openfire发送的内容后，会用socket的流向手机端发送我们定义好的报文或是聊天内容  </p><p>4、手机端的socket会不停的轮询（可以模拟心跳式长连接的方式），判断是否有消息到达，如果有则显示</p></blockquote> <p>&nbsp; </p><p>而普通的聊天程序的流程则是客户端发送信息到openfire服务器，openfire服务器再将消息转发给其他客户端。他们省去了socket服务器这部分，那我们为什么要加上socket服务器这部分呢？  </p><blockquote> <p>我们这样做也是有自己的道理的：  </p><p>首先，如果让手机端自己实现向openfire服务器发送程序的代码，那工作量是相当大的。因为每个手机平台使用的语言都不同，每个平台都需要实现向openfire服务器发送聊天信息的报文。这其实就是在做重复的工作，而且每个平台实现向手机端发送报文信息的技术会让每个手机端的开发人员都要学会一套和openfire交互的代码。这势必会重复工作、重复相同业务的代码。所以，把这些代码放在一个tcp/ip的socket中转服务器进行统一发送，这也是有好处的。  </p><p>其次，把所以发送消息在报文在socket服务器完成，可以对业务进行一个统一的处理、消息过滤。</p></blockquote> <p>&nbsp;</p> <p><strong><strike><font color="#ff0000" size="2">手机端被否决的解决方案，供参考</font></strike></strong></p> <blockquote> <p>手机端用http长连接的方式，这个是不行的</p> <p>其一、手机的移动网络不稳定，长连接会经常断掉，当然你可以自动进行重连</p> <p>其二、长连接一直连接在服务器上，占用服务器资源。当然你可以使用心跳式长连接或是轮询方式</p> <p>其三、手机端一直连接服务器会使用手机端用户的网络带宽流量（流量不是免费的，客户会怎么想）</p> <p>其四、手机端一直连着服务器，对手机的电量也有消耗（现在智能机解决电量也是一个问题）</p></blockquote><img src ="http://www.blogjava.net/hoojo/aggbug/384441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-07-31 15:16 <a href="http://www.blogjava.net/hoojo/archive/2012/07/31/384441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMPP/Smack/Openfire javax.net.ssl.SSLException: Received fatal alert: internal_error</title><link>http://www.blogjava.net/hoojo/archive/2012/07/12/382901.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Thu, 12 Jul 2012 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/07/12/382901.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/382901.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/07/12/382901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/382901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/382901.html</trackback:ping><description><![CDATA[<p>在xmpp协议通信中，用smack框架登录非本地openfire服务器的时候，出现javax.net.ssl.SSLException: Received fatal alert: internal_error异常信息。原因是登录他网openfire服务器出现登录延时（在没有成功链接到openfire服务器），然后就进行登录login操作的时候，就会出现这个异常。</p> <p>&nbsp;</p> <p>解决办法</p> <blockquote> <p>1、在链接openfire服务器后，线程休眠一段时间，再进行登录login操作。</p> <p>……</p> <p>connection.connect();<br>Thread.sleep(3000);  <p>connection.login(user, pass);  <p>……  <p>&nbsp; <p>2、设置setPacketReplyTimeout参数  <p>......  <p>SmackConfiguration.setPacketReplyTimeout(PACKET_REPLY_TIMEOUT);<br>config = new ConnectionConfiguration(SERVER, PORT);  <p>......  <p>注意：如果设置了休眠时间或setPacketReplyTimeout参数后还是出现错误，请讲时间设置再大些看看</p></blockquote> <p>参考官方解答：<a title="http://community.igniterealtime.org/message/206443#206443" href="http://community.igniterealtime.org/message/206443#206443">http://community.igniterealtime.org/message/206443#206443</a></p><img src ="http://www.blogjava.net/hoojo/aggbug/382901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-07-12 16:49 <a href="http://www.blogjava.net/hoojo/archive/2012/07/12/382901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Smack 结合 Openfire服务器，建立IM通信，发送聊天消息</title><link>http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Mon, 25 Jun 2012 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/381445.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/381445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/381445.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在文章开始，请你了解和熟悉openfire方面的相关知识，这样对你理解下面代码以及下面代码的用途有很好的了解。同时，你可能需要安装一个简单的CS聊天工具，来测试你的代码是否成功的在openfire服务器上建立会话链接，并成功的向在线用户发送聊天消息。 必须了解：http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html http://w...&nbsp;&nbsp;<a href='http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html'>阅读全文</a><img src ="http://www.blogjava.net/hoojo/aggbug/381445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-06-25 17:41 <a href="http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Openfire与XMPP协议</title><link>http://www.blogjava.net/hoojo/archive/2012/06/18/381035.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Mon, 18 Jun 2012 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/06/18/381035.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/381035.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/06/18/381035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/381035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/381035.html</trackback:ping><description><![CDATA[<p>关于xmpp协议可以参考：<a href="http://www.jabbercn.org/RFC3920">http://www.jabbercn.org</a></p> <p><b>什么是OpenFire</b> <p>Openfire 采用Java开发，开源的实时协作（RTC）服务器基于XMPP（Jabber）协议。 <p>　　您可以使用它轻易的构建高效率的即时通信服务器。Openfire安装和使用都非常简单，并利用Web进行管理。单台服务器可支持上万并发用户。 <p>由于是采用开放的XMPP协议，您可以使用各种支持XMPP协议的IM客户端软件登陆服务。 <p><b>XMPP</b><b>（</b><b>Jabber</b><b>）协议</b><b></b> <p><b>1、 </b><b>介绍</b><b></b> <p>XMPP是一种基于XML的协议，它继承了在XML环境中灵活的发展性。因此，基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求，以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。而且，XMPP包含了针对服务器端的软件协议，使之能与另一个进行通话，这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。 <p><b>2、 </b>定义：<b></b> <p>XMPP（可扩展消息处理现场协议）是基于可扩展标记语言（XML）的协议，它用于即时消息（IM）以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息，即使其操作系统和浏览器不同。 <p>XMPP的前身是Jabber， 一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分； <p>核心的XML流传输协议 <p>基于XML FreeEIM流传输的即时通讯扩展应用 <p>XMPP的核心XML流传输协议的定义使得XMPP能够在一个比以往网络通信协议更规范的平台上。借助于XML易于解析和阅读的特性，使得XMPP的协议能够非常漂亮。 <p>XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定义的，与其他业已得到广泛使用的即时通讯协议，诸如AIM，QQ等有功能完整，完善等先进性。 <p>在IETF 中，把IM协议划分为四种协议，即时信息和出席协议(Instant Messaging and Presence Protocol, IMPP)、出席和即时信息协议(Presence and Instant Messaging Protocol, PRIM)、针对即时信息和出席扩展的会话发起协议(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE)，以及可扩展的消息出席协议(XMPP)。最初研发IMPP 也是为了创建一种标准化的协议，但是今天，IMPP 已经发展成为基本协议单元，定义所有即时通信协议应该支持的核心功能集。 <p>3、 XMPP协议的优点 <p>a. XMPP 协议是公开的，由JSF开源社区组织开发的。XMPP 协议并不属于任何的机构和个人，而是属于整个社区，这一点从根本上保证了其开放性。 <p>b. XMPP 协议具有良好的扩展性。在XMPP 中，即时消息和到场信息都是基于XML 的结构化信息，这些信息以XML 节(XML Stanza)的形式在通信实体间交换。XMPP 发挥了XML 结构化数据的通用传输层的作用，它将出席和上下文敏感信息嵌入到XML 结构化数据中，从而使数据以极高的效率传送给最合适的资源。基于XML 建立起来的应用具有良好的语义完整性和扩展性。 <p>c. 分布式的网络架构。XMPP 协议都是基于Client/Server 架构，但是XMPP协议本身并没有这样的限制。网络的架构和电子邮件十分相似，但没有结合任何特定的网络架构，适用范围非常广泛。 <p>d. XMPP 具有很好的弹性。XMPP 除了可用在即时通信的应用程序，还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。 <p>e. 安全性。XMPP在Client-to-Server通信，和Server-to-Server通信中都使用TLS (Transport Layer Security)协议作为通信通道的加密方法，保证通信的安全。任何XMPP服务器可以独立于公众XMPP网络（例如在企业内部网络中），而使用SASL及TLS等技术更加增强了通信的安全性。如下图所示： <p>4、 XMPP协议的组成 <p>主要的XMPP 协议范本及当今应用很广的XMPP 扩展： <p>l RFC 3920 XMPP（新的RFC6120）：核心。定义了XMPP 协议框架下应用的网络架构，引入了XML Stream（XML 流）与XML Stanza（XML 节），并规定XMPP 协议在通信过程中使用的XML 标签。使用XML 标签从根本上说是协议开放性与扩展性的需要。此外，在通信的安全方面，把TLS 安全传输机制与SASL 认证机制引入到内核，与XMPP 进行无缝的连接，为协议的安全性、可靠性奠定了基础。Core 文档还规定了错误的定义及处理、XML 的使用规范、JID（Jabber Identifier，Jabber 标识符）的定义、命名规范等等。所以这是所有基于XMPP 协议的应用都必需支持的文档。 <p>l RFC 3921：用户成功登陆到服务器之后，发布更新自己的在线好友管理、发送即时聊天消息等业务。所有的这些业务都是通过三种基本的XML 节来完成的：IQ Stanza（IQ 节）, Presence Stanza（Presence 节）, Message Stanza（Message 节）。RFC3921 还对阻塞策略进行了定义，定义是多种阻塞方式。可以说，RFC3921 是RFC3920 的充分补充。两个文档结合起来，就形成了一个基本的即时通信协议平台，在这个平台上可以开发出各种各样的应用。 <p>l XEP-0030 服务搜索。一个强大的用来测定XMPP 网络中的其它实体所支持特性的协议。 <p>l XEP-0115 实体性能。XEP-0030 的一个通过即时出席的定制，可以实时改变交变广告功能。 <p>l XEP-0045 多人聊天。一组定义参与和管理多用户聊天室的协议，类似于Internet 的Relay Chat，具有很高的安全性。 <p>l XEP-0096 文件传输。定义了从一个XMPP 实体到另一个的文件传输。 <p>l XEP-0124 HTTP 绑定。将XMPP 绑定到HTTP 而不是TCP，主要用于不能够持久的维持与服务器TCP 连接的设备。 <p>l XEP-0166 Jingle。规定了多媒体通信协商的整体架构。 <p>l XEP-0167 Jingle Audio Content Description Format。定义了从一个XMPP 实体到另一个的语音传输过程。 <p>l XEP-0176 Jingle ICE（Interactive Connectivity Establishment）Transport。ICE传输机制，文件解决了如何让防火墙或是NAT（Network Address Translation）保护下的实体建立连接的问题。 <p>l XEP-0177 Jingle Raw UDP Transport。纯UDP 传输机制，文件讲述了如何在没有防火墙且在同一网络下建立连接的。 <p>l XEP-0180 Jingle Video Content Description Format。定义了从一个XMPP 实体到另一个的视频传输过程。 <p>l XEP-0181 Jingle DTMF（Dual Tone Multi-Frequency）。 <p>l XEP-0183 Jingle Telepathy Transport Method。 <p>5、 XMPP协议网络架构 <p>XMPP是一个典型的C/S架构，而不是像大多数即时通讯软件一样，使用P2P客户端到客户端的架构，也就是说在大多数情况下，当两个客户端进行通讯时，他们的消息都是通过服务器传递的(也有例外，例如在两个客户端传输文件时)．采用这种架构，主要是为了简化客户端，将大多数工作放在服务器端进行，这样，客户端的工作就比较简单，而且，当增加功能时，多数是在服务器端进行．XMPP服务的框架结构如下图所示．XMPP中定义了三个角色，XMPP客户端，XMPP服务器、网关．通信能够在这三者的任意两个之间双向发生．服务器同时承担了客户端信息记录、连接管理和信息的路由功能．网关承担着与异构即时通信系统的互联互通，异构系统可以包括SMS(短信)、MSN、ICQ等．基本的网络形式是单客户端通过TCP／IP连接到单服务器，然后在之上传输XML，工作原理是： <p>(1) 点连接到服务器； <p>(2) 务器利用本地目录系统中的证书对其认证； <p>(3) 点指定目标地址，让服务器告知目标状态； <p>(4) 务器查找、连接并进行相互认证； <p>(5) 点之间进行交互； <p>6、 XMPP客户端 <p>XMPP 系统的一个设计标准是必须支持简单的客户端。事实上，XMPP 系统架构对客户端只有很少的几个限制。一个XMPP 客户端必须支持的功能有： <p>1. 通过 TCP 套接字与XMPP 服务器进行通信； <p>2. 解析组织好的 XML 信息包； <p>3. 理解消息数据类型。 <p>XMPP 将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易，更新系统功能也同样变得容易。XMPP 客户端与服务端通过XML 在TCP 套接字的5222 端口进行通信，而不需要客户端之间直接进行通信。 <p>基本的XMPP 客户端必须实现以下标准协议（XEP-0211）： <p>RFC3920 核心协议Core <p>RFC3921 即时消息和出席协议Instant Messaging and Presence <p>XEP-0030 服务发现Service Discovery <p>XEP-0115 实体能力Entity Capabilities <p>7、 XMPP服务器 <p>XMPP 服务器遵循两个主要法则： <p>1、监听客户端连接，并直接与客户端应用程序通信； <p>2、与其他 XMPP 服务器通信； <p>XMPP开源服务器一般被设计成模块化，由各个不同的代码包构成，这些代码包分别处理Session管理、用户和服务器之间的通信、服务器之间的通信、DNS（Domain Name System）转换、存储用户的个人信息和朋友名单、保留用户在下线时收到的信息、用户注册、用户的身份和权限认证、根据用户的要求过滤信息和系统记录等。另外，服务器可以通过附加服务来进行扩展，如完整的安全策略，允许服务器组件的连接或客户端选择，通向其他消息系统的网关。 <p>基本的XMPP 服务器必须实现以下标准协议 <p>RFC3920 核心协议Core <p>RFC3921 即时消息和出席协议Instant Messaging and Presence <p>XEP-0030 服务发现Service Discovery <p>8、 XMPP网关 <p>XMPP 突出的特点是可以和其他即时通信系统交换信息和用户在线状况。由于协议不同，XMPP 和其他系统交换信息必须通过协议的转换来实现，目前几种主流即时通信协议都没有公开，所以XMPP 服务器本身并没有实现和其他协议的转换，但它的架构允许转换的实现。实现这个特殊功能的服务端在XMPP 架构里叫做网关(gateway)。目前，XMPP 实现了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的协议转换。由于网关的存在，XMPP 架构事实上兼容所有其他即时通信网络，这无疑大大提高了XMPP 的灵活性和可扩展性。 <p>9、 XMPP地址格式 <p>一个实体在XMPP网络结构中被称为一个接点，它有唯一的标示符jabber identifier(JID)，即实体地址，用来表示一个Jabber用户，但是也可以表示其他内容，例如一个聊天室．一个有效的JID包括一系列元素： <p>(1) 名(domain identifier)； <p>(2) 点(node identifier)； <p>(3) 源(resource identifier)． <p>它的格式是node@domain/resource，node@domain，类似电子邮件的地址格式．domain用来表示接点不同的设备或位置，这个是可选的，例如a在Server1上注册了一个用户，用户名为doom，那么a的JID就是doom@serverl，在发送消息时，指明doom@serverl就可以了，resource可以不用指定，但a在登录到这个Server时，fl的JID可能是doom@serverl、exodus(如果a用Exodus软件登录)，也可能是doom@serverl/psi(如果a用psi软件登录)．资源只用来识别属于用户的位置或设备等，一个用户可以同时以多种资源与同一个XMPP服务器连接。 <p>10、 XMPP消息格式 <p>XMPP中定义了3个顶层XML元素: Message、Presence、IQ，下面针对这三种元素进行介绍。 <p><b>&lt;Message&gt;</b> <p>用于在两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息，不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。 <p>To : 标识消息的接收方。 <p>from : 指发送方的名字或标示(id) <p>Text: 此元素包含了要提交给目标用户的信息。 <p>结构如下所示: <p>&lt;message to= ‘lily@jabber.org/contact’ type =’chat’&gt; <p>&lt;body&gt; 你好，在忙吗&lt;/body&gt; <p>&lt;/message&gt; <p><b>&lt;Presence&gt;</b> <p>用来表明用户的状态，如：online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时，就会在stream的上下文中插入一个Presence元素，来表明自身的状态．结构如下所示： <p>&lt;presence&gt; <p>From =‘lily @ jabber.com/contact’ <p>To = ‘yaoman @ jabber.com/contact' <p>&lt;status&gt; Online &lt;/status&gt; <p>&lt;/presence&gt; <p>&lt;presence&gt;元素可以取下面几种值: <p>Probe: 用于向接受消息方法发送特殊的请求 <p>subscribe: 当接受方状态改变时，自动向发送方发送presence信息。 <p><b>&lt; IQ &gt;</b> <p>一种请求／响应机制，从一个实体从发送请求，另外一个实体接受请求，并进行响应．例如，client在stream的上下文中插入一个元素，向Server请求得到自己的好友列表，Server返回一个，里面是请求的结果． <p>&lt;iq &gt; 主要的属性是type。包括: <p>Get :获取当前域值。 <p>Set :设置或替换get查询的值。 <p>Result :说明成功的响应了先前的查询。 <p>Error: 查询和响应中出现的错误。 <p>结构如下所示: <p>&lt;iq from =‘lily @ jabber.com/contact’id=’1364564666’ Type=’result’&gt; <h4>XMPP通信协议</h4> <p><b>一、 </b><b>Stream</b> <div id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">&lt;!-- #################### 通信内容采用压缩技术，以及通信的相关协议 ####################### --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">stream:stream</span> <span style="color: #ff0000">xmlns:stream</span><span style="color: #0000ff">="http://etherx.jabber.org/streams"</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="jabber:client"</span> <span style="color: #ff0000">from</span><span style="color: #0000ff">="127.0.0.1"</span> <span style="color: #ff0000">id</span><span style="color: #0000ff">="e38900bc"</span> <span style="color: #ff0000">xml:lang</span><span style="color: #0000ff">="en"</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">&lt;!--</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">xmlns 表示通信客户端</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">from 客户端的地址（来源）</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">id</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">lang 通信语言</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">--&gt;</span>        </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">stream:features</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">&lt;!-- 开始tls协议[TLS]的频道加密方法 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">starttls</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="urn:ietf:params:xml:ns:xmpp-tls"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">starttls</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">&lt;!-- 加密技术、安全证书 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">mechanisms</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="urn:ietf:params:xml:ns:xmpp-sasl"</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span>DIGEST-MD5<span style="color: #0000ff">&lt;/</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span>PLAIN<span style="color: #0000ff">&lt;/</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span>ANONYMOUS<span style="color: #0000ff">&lt;/</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span>CRAM-MD5<span style="color: #0000ff">&lt;/</span><span style="color: #800000">mechanism</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">mechanisms</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">&lt;!-- 采用压缩技术 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">compression</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/features/compress"</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">method</span><span style="color: #0000ff">&gt;</span>zlib<span style="color: #0000ff">&lt;/</span><span style="color: #800000">method</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">compression</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">&lt;!-- 权限 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">auth</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/features/iq-auth"</span> <span style="color: #0000ff">/&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">&lt;!-- 注册 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">register</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://jabber.org/features/iq-register"</span> <span style="color: #0000ff">/&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">stream:features</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--></div></div>
<p>关于TSL 参考：<a href="http://www.jabbercn.org/RFC3920">http://www.jabbercn.org/RFC3920</a>
<p><b>1</b><b>、</b><b>TSL</b><b>协议遵循以下规则：</b><b></b>
<p>A、 一个遵守本协议的初始化实体必须（MUST）在初始化流的头信息中包含一个'version'属性并把值设为“1.0”。
<p>B、 如果TLS握手发生在两个服务器之间，除非服务器声称的DNS主机名已经被解析，通信不能（MUST NOT）继续进行。
<p>C、 当一个遵守本协议的接收实体接收了一个初始化流（它的头信息中包含一个'version'属性并且值设为“1.0”），在发送应答流的的头信息（其中包含版本标记）之后，它必须发送（MUST）&lt;starttls/&gt;元素（名字空间为 'urn:ietf:params:xml:ns:xmpp-tls'）以及其他它支持的流特性。
<p>D、 如果初始化实体选择使用TLS,TLS握手必须在SASL握手之前完成；这个顺序用于帮助保护SASL握手时发送的认证信息的安全，同时可以在必要的时候在TLS握手之前为SASL外部机制提供证书。
<p>E、 TLS握手期间,一个实体不能（MUST NOT）在流的根元素中发送任何空格符号作为元素的分隔符（在下面的TLS示例中的任何空格符都仅仅是为了便于阅读）；这个禁令用来帮助确保安全层字节精度。
<p>F、 接收实体必须（MUST）在发送&lt;proceed/&gt; 元素的关闭符号"&gt;" 之后立刻开始TLS协商。初始化实体必须（MUST）在从接收实体接收到&lt;proceed/&gt; 元素的关闭符号"&gt;" 之后立刻开始TLS协商。
<p>G、 初始化实体必须（MUST）验证接收实体出示的证书；关于证书验证流程参见Certificate Validation ( 第十四章第二节)。
<p>H、 证书必须（MUST）检查初始化实体(比如一个用户)提供的主机名；而不是通过DNS系统解析出来的主机名；例如，如果用户指定一个主机名"example.com"而一个DNS SRV [SRV]查询返回"im.example.com"，证书必须（MUST）检查"example.com".如果任何种类的XMPP实体（例如客户端或服务器）的JID出现在一个证书里，它必须（MUST）表现为一个别名实体里面的UTF8字符串，存在于subjectAltName之中。如何使用 [ASN.1] 对象标识符 "id-on-xmppAddr" 定义在本文的第五章第一节第一小节。
<p>I、 如果 TLS 握手成功了，接收实体必须（MUST） 丢弃TLS 生效之前从初始化实体得到的任何不可靠的信息
<p>J、 如果 TLS 握手成功了，初始化实体必须（MUST） 丢弃TLS 生效之前从接收实体得到的任何不可靠的信息
<p>K、 如果 TLS 握手成功了，接收实体不能(MUST NOT)在流重新开始的时候通过提供其他的流特性来向初始化实体提供 STARTTLS 扩展
<p>L、 如果 TLS 握手成功了，初始化实体必须(MUST)继续进行SASL握手
<p>M、 如果 TLS 握手失败了，接收实体必须（MUST）终止XML流和相应的TCP连接。
<p>N、 关于必须（MUST）支持的机制，参照 Mandatory-to-Implement Technologies (第十四章第七节) 。
<p><b>2</b><b>、当一个初始化实体用</b><b>TLS</b><b>保护一个和接收实体之间的流，其步骤如下</b><b>:</b>
<p>A. 初始化实体打开一个TCP连接，发送一个打开的XML流头信息（其'version'属性设置为"1.0"）给接收实体以初始化一个流。
<p>B. 接收实体打开一个TCP连接，发送一个XML流头信息（其'version'属性设置为"1.0"）给初始化实体作为应答。
<p>C. 接收实体向初始化实体提议STARTTLS范围（包括其他支持的流特性），如果TLS对于和接收实体交互是必需的，它应该（SHOULD）在&lt;starttls/&gt;元素中包含子元素&lt;required/&gt;
<p>D. 初始化实体发出STARTTLS命令(例如, 一个符合'urn:ietf:params:xml:ns:xmpp-tls'名字空间的 &lt;starttls/&gt; 元素) 以通知接收实体它希望开始一个TLS握手来保护流。
<p>E. 接收实体必须（MUST）以'urn:ietf:params:xml:ns:xmpp-tls'名字空间中的&lt;proceed/&gt;元素或&lt;failure/&gt;元素应答。如果失败，接收实体必须（MUST）终止XML流和相应的TCP连接。如果继续进行，接收实体必须（MUST）尝试通过TCP连接完成TLS握手并且在TLS握手完成之前不能（MUST NOT）发送任何其他XML数据。
<p>F. 初始化实体和接收实体尝试完成TLS握手。（要符合[TLS]规范）
<p>G. 如果 TLS 握手不成功, 接收实体必须（MUST）终止 TCP 连接. 如果 TLS 握手成功, 初始化实体必须（MUST）发送给接收实体一个打开的XML流头信息来初始化一个新的流（先发送一个关闭标签&lt;/stream&gt;是不必要的,因为接收实体和初始化实体必须(MUST)确保原来的流在TLS握手成功之后被关闭） 。
<p>H. 在从初始化实体收到新的流头信息之后，接收实体必须（MUST）发送一个新的XML流头信息给初始化实体作为应答，其中应包含可用的特性但不包含STATRTTLS特性。</p><img src ="http://www.blogjava.net/hoojo/aggbug/381035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-06-18 20:00 <a href="http://www.blogjava.net/hoojo/archive/2012/06/18/381035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jwchat 的安装和配置、Service unavailable、Authorization failed问题汇总</title><link>http://www.blogjava.net/hoojo/archive/2012/05/17/378444.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Thu, 17 May 2012 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/05/17/378444.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/378444.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/05/17/378444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/378444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/378444.html</trackback:ping><description><![CDATA[<p>上一篇介绍了Openfire开源聊天IM服务器的安装：<a title="http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html" href="http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html">http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html</a></p> <p>这篇文章介绍Jwchat的安装和配置</p> <p>&nbsp;</p> <p>首先Jwchat的配置和安装需要具备的环境：  <p>Tomcat 5.0.28+/Tomcat 6  <p>JDK 1.6+  <p>Openfire 3.7.1  <p>1、 下载jwchat工程文件  <p>下载站点：<a href="http://blog.jwchat.org/jwchat/download/">http://blog.jwchat.org/jwchat/download/</a>  <p>Zip下载：<a href="http://downloads.sourceforge.net/jwchat/jwchat-1.0.zip?use_mirror">http://downloads.sourceforge.net/jwchat/jwchat-1.0.zip?use_mirror</a>=  <p>&nbsp; <p>2、 下载完成后，将jwchat-1.0.zip解压到你的tomcat的webapps目录，将jwchat-1.0命名为jwchat，如果不这样的话，可能会出现错误，如Authorization failed。至少这样会方便你访问jwchat工程。  <p>然后将index.html.zh_CN等这样带有*.后缀.zh_CN的这样的文件的.zh_CN都删掉，进行重命名。.zh_CN是表示中文版的，当然你也可以直接将*.后缀.后缀的文件进行重命名，那样就是默认的英文版的了。  <p>批量命名工具类：  <div id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">package com.hoo.util;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">&nbsp;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">import java.io.File;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">&nbsp;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">/**</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * &lt;b&gt;function:&lt;/b&gt; 文件命名工具类</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @author hoojo</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @createDate 2012-5-14 下午01:58:14</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @file FileRenameUtils.java</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @package com.hoo.util</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @blog http://blog.csdn.net/IBM_hoojo</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @email hoojo_@126.com</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> * @version 1.0</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000"> */</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">public</span> <span style="color: #0000ff">abstract</span> <span style="color: #0000ff">class</span> FileRenameUtils {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">private</span> final <span style="color: #0000ff">static</span> String FILE_PATH = <span style="color: #006080">"D:\\apache-tomcat-6.0.33\\webapps\\jwchat"</span>;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #008000">/**</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * &lt;b&gt;function:&lt;/b&gt; 将指定目录下的文件的type类型的文件，进行重命名，命名后的文件将去掉type</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * &lt;p&gt;example: 如果type = html； index.html.html -&gt; index.html&lt;/p&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * &lt;p&gt;example: 如果type = zh_CN； index.html.zh_CN -&gt; index.html&lt;/p&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * @author hoojo</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * @createDate 2012-5-16 下午02:16:48</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * @param path</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     * @param type</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #008000">     */</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> rename(String path, String type) {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">if</span> (path == <span style="color: #0000ff">null</span> || <span style="color: #006080">""</span>.equals(path)) {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            path = FILE_PATH;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        File dir = <span style="color: #0000ff">new</span> File(path);</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        File[] list = dir.listFiles();</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">for</span> (File file : list) {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            String name = file.getName();</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            String[] s = name.split(<span style="color: #006080">"\\."</span>);</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            <span style="color: #0000ff">if</span> (s.length == 3 &amp;&amp; type.equals(s[2])) {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">                System.<span style="color: #0000ff">out</span>.println(s[0] + <span style="color: #006080">"--"</span> + s[1] + <span style="color: #006080">"--"</span> + s[2]);</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">                file.renameTo(<span style="color: #0000ff">new</span> File(path + <span style="color: #006080">"/"</span> + s[0] + <span style="color: #006080">"."</span> + s[1]));</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    FileRenameUtils.rename(<span style="color: #006080">"D:\\apache-tomcat-6.0.33\\webapps\\jwchat"</span>, <span style="color: #006080">"zh_CN"</span>);</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">    }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">}</pre><!--CRLF--></div></div>
<p>3、 下载JabberHTTPBind这个包，因为直接下载的jwchat没有WEB-INF、web.xml是无法运行的。 
<p>JabberHTTPBind是jwchat进行http bind通信的一种方式，它可以让jwchat和openfire进行链接通信。 
<p>站点：<a href="http://blog.jwchat.org/jhb/">http://blog.jwchat.org/jhb/</a> 
<p>下载地址：<a href="http://blog.jwchat.org/download/JabberHTTPBind-1.1.1.zip">http://blog.jwchat.org/download/JabberHTTPBind-1.1.1.zip</a> 
<p>JabberHTTPBind会依赖xalan的library库 
<p>下载站点：<a href="http://xml.apache.org/xalan-j/downloads.html">http://xml.apache.org/xalan-j/downloads.html</a> 
<p>下载目录：<a href="http://labs.renren.com/apache-mirror/xml/xalan-j/">http://labs.renren.com/apache-mirror/xml/xalan-j/</a> 
<p>&nbsp; <p>4、 下载完成后，将JabberHTTPBind的zip解压出来的WEB-INF、META-INF一并放到刚才的jwchat目录中，并且将刚才下载的xalan的xalan.jar,serializer.jar, xercesImpl.jar, xml-apis.jar放到webapps\jwchat\WEB-INF\lib目录下即可。 
<p>&nbsp; <p>5、 修改jwchat目录中的相关配置 
<p>修改config.js文件 
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">var</span> BACKENDS = </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">[</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            ……</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        },</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            ……</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        },</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            name:<span style="color: #006080">"Open Relay"</span>,</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            description:<span style="color: #006080">"HTTP Binding backend that allows connecting to any jabber server"</span>,</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            httpbase:<span style="color: #006080">"/JHB/"</span>, <span style="color: #008000">/* 修改这里为：/jwchat/JHB/ */</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            type:<span style="color: #006080">"binding"</span>,</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            default_server: SITENAME</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        },</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">            ……</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">];</pre><!--CRLF--></div></div>
<p>修改WEB-INF目录下的web.xml文件 
<div id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span>Jabber HTTP Binding Servlet<span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span>/<span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">         url-pattern修改为：/JHB/</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px">         <span style="color: #008000">&lt;!-- 这里的修改主页是对应上面的config.js，如果config.js的httpbase配置是/jwchat/，那这里的就不用修改了 --&gt;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 10pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span></pre><!--CRLF--></div></div>
<p>6、 启动tomcat后，访问<a href="http://localhost:8080/jwchat/">http://localhost:8080/jwchat/</a> 
<p>如果登录出现Service unavailable这个问题，那么会有以下几种情况： 
<p>A、 表明服务器不可用，可能是openfire服务器没有启动， 
<p>B、 webapps\jwchat \config.js的配置有问题，如var SITENAME = "localhost";和openfire服务器地址没有对应 
<p>C、 伴随出现：Exception in thread "Thread-34" javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found异常，可能是tomcat版本低于tomcat6或是jwchat缺少相应的jar包，如缺少xml的serializer.jar、xalan.jar、xercesImpl.jar、xml-apis.jar
<p>D、如果在满足了c步骤，有添加jra包还出现Exception in thread "Thread-34" javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found异常，建议删除tomcat/work目录下的缓存，然后重启tomcat试试
<p>&nbsp; <p>7、 如果登录出现Authorization failed验证失败，那么有以下几种可能的情况： 
<p>A、 用户没有注册 
<p>B、 openfire的证书（C:\Program Files\openfire\resources\security）没有安装到相应的jdk的C:\Program Files\Java\jre6\lib\security目录下 
<p>如果出现这种异常信息：javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed也表明是安全证书的问题； 
<p>关于解决ssl验证，网上有人说在jsjac.js中的if(this.has_sasl) 这行前面加上this.has_sasl = false;来取消ssl安全证书的验证。 
<p>C、 如果你的工程名称不是jwchat，建议把它修改成jwchat并且修改config.xml的相关链接的配置（httpbase） 
<p>D、 还有可能是你当前的用户没有注册，这个时候你可以注册一个用户或是在openfire控制台的用户组中添加一个用户，然后再等了看看是否存在这个问题。 
<p>&nbsp; <p>8、 修改服务器名称 
<p>点击服务器à服务器管理器à编辑属性 修改服务器名称 
<p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_10.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_thumb_4.png" width="562" height="177"></a> 
<p>修改后的服务器名称 
<p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_thumb_3.png" width="342" height="196"></a> 
<p>出现叹号，我们要删除安全证书，点击服务器à服务器设置à服务器安全证书删掉这里的证书。 
<p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_thumb_2.png" width="562" height="69"></a> 
<p>删除后，在当前页面会出现提示，然后按照提示点击相应的链接，重启服务器，然后登陆，再生成证书 
<p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_thumb_1.png" width="281" height="81"></a> 
<p>生成证书需要点时间，然后生成完成后，手动重启openfire服务器，再次登陆发现警告没有了。 
<p>&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/JwchatServiceunavailableAuthorizationfai_11CE2/image_thumb.png" width="316" height="186"></a> 
<p>9、 在服务器端增加配置 
<p>xmpp.httpbind.client.requests.polling = 0 
<p>xmpp.httpbind.client.requests.wait = 10 
<img src ="http://www.blogjava.net/hoojo/aggbug/378444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-05-17 22:05 <a href="http://www.blogjava.net/hoojo/archive/2012/05/17/378444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Openfire 的安装和配置</title><link>http://www.blogjava.net/hoojo/archive/2012/05/17/378440.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Thu, 17 May 2012 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/05/17/378440.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/378440.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/05/17/378440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/378440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/378440.html</trackback:ping><description><![CDATA[<p>1、 下载最新的openfire安装文件  <p>官方下载站点：<a href="http://www.igniterealtime.org/downloads/index.jsp#openfire">http://www.igniterealtime.org/downloads/index.jsp#openfire</a>  <p>下载地址：  <p>Exe：<a href="http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.exe">http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.exe</a>  <p>ZIP: <a href="http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.zip">http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.zip</a>  <p>我使用的是zip解压版的安装文件。  <p>其中openfire是服务器，下面还有一个spark，这个是一个XMPP协议通信聊天的CS的IM软件，它可以通过openfire进行聊天对话。  <p>&nbsp; <p>2、 下载完成后，如果你下载的是exe文件，执行你的安装文件，进行安装。这里我是zip的文件。解压后，复制openfire目录到C:\Program Files\目录下；一定要在C:\Program Files\目录下的；这样openfire就安装完成了。  <p>&nbsp; <p>3、 下面我们启动openfire服务器，并配置它。在C:\Program Files\openfire\bin目录下有一个电灯泡的openfire.exe文件，双击执行，启动完成后可以看到  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb.png" width="360" height="271"></a>  <p>4、 点击Launch Admin按钮进入<a href="http://127.0.0.1:9090/setup/index.jsp">http://127.0.0.1:9090/setup/index.jsp</a>页面，配置openfire服务器  <p>&nbsp; <p>5、 选择语言 中文简体  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_1.png" width="289" height="348"></a>  <p>点击continue进入  <p>&nbsp; <p>6、 配置服务器域名  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_2.png" width="396" height="175"></a>  <p>如果你是本地访问，那么你可以不修改或是使用localhost、127.0.0.1的方式  <p>如果你用于外网或局域网访问，那么你的地址配置成外网或局域网地址  <p>&nbsp; <p>7、 选择数据库  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_3.png" width="273" height="183"></a>  <p>选择openfire自带的，当然你也可以选择你的数据库类型。如Oracle、SQLServer、MySQL等。如果openfire没有带jdbc的连接驱动，你需要添加连接数据库的jdbc驱动；驱动放在C:\Program Files\openfire\lib目录下  <p>&nbsp; <p>8、 选择特性配置，默认即可  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_10.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_4.png" width="351" height="202"></a>  <p>&nbsp; <p>9、 管理员邮件，可以跳过这步  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_12.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_5.png" width="385" height="188"></a>  <p>&nbsp; <p>10、 安装完成  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_14.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_6.png" width="192" height="146"></a>  <p>进入管理员控制台页面  <p>&nbsp; <p>11、 进入<a href="http://127.0.0.1:9090/login.jsp">http://127.0.0.1:9090/login.jsp</a>页面后，输入admin、密码admin登陆进入  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_16.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_7.png" width="244" height="93"></a>  <p>&nbsp; <p>12、 进入后可以看到  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_18.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/Openfire_1186E/image_thumb_8.png" width="493" height="351"></a>  <p>服务器名称就是jwchat的连接地址；你可以使用Spark、jwchat链接这个地址进行IM通信聊天……  <p>至此，openfire的安装和配置已经完成。下一篇文章开始完成jwchat的安装和配置。  <p>如果你需要更换服务器名称ip，请看下一篇文章！  <img src ="http://www.blogjava.net/hoojo/aggbug/378440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-05-17 20:03 <a href="http://www.blogjava.net/hoojo/archive/2012/05/17/378440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Operfire 安装指南</title><link>http://www.blogjava.net/hoojo/archive/2012/05/13/378042.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Sun, 13 May 2012 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2012/05/13/378042.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/378042.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2012/05/13/378042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/378042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/378042.html</trackback:ping><description><![CDATA[<p><strong>本文的英文原文来自 <a href="http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html">http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html</a></strong> </p><p><strong>安装指南</strong> </p><p>Openfire是一个强大的即时消息（IM）和聊天服务器，它实现了XMPP协议。这份文件将引导您通过安装Openfire。对于更多的功能和信息的完整列表，请访问Openfire网站：<a href="http://www.igniterealtime.org/projects/openfire/">http://www.igniterealtime.org/projects/openfire/</a> </p><h4>目录</h4> <ul> <li>1 安装 <ul> <li>1.1 Windows </li><li>1.2 Linux/Unix</li></ul> </li><li>2 安装概述 </li><li>3 分发版里的文件 </li><li>4 安装数据库 </li><li>5 安装服务器 </li><li>6 管理控制台 </li><li>7 在Windows下运行Openfire <ul> <li>7.1 Windows服务 </li><li>7.2 自定义参数</li></ul> </li><li>8 在Linux/Unix下运行Openfire <ul> <li>8.1 自定义参数</li></ul> </li><li>9 插件 <ul> <li>9.1 安装插件 </li><li>9.2 管理插件</li></ul></li></ul> <h4>安装</h4> <h5>Windows</h5> <p>运行Openfire 安装包. 应用缺省将被安装于目录 c:\Program Files\Openfire . </p><h5>Linux/Unix</h5> <p>可选择RPM包或tar.gz包. 如果使用RPM包, 用你的包管理器运行把它Openfire安装到目录 /opt/openfire:</p><pre>rpm -ivh openfire_3_0_0.rpm</pre>
<p>如果使用.tar.gz包, 解压到目录 /opt 或 /usr/bin:</p><pre>tar -xzvf openfire_3_0_0.tar.gz
mv openfire /opt</pre>
<p><strong>注意</strong>: .tar.gz包不一定包含Java虚拟机(JRE). 所以, 你必须之前就有 JDK 或 JRE 1.5.0 (Java 5) 或之后安装到你的系统里. 你可以在命令行键入 "java -version" 来检查你的java版本，然后 (如果必要) 访问 <a href="http://java.sun.com/">http://java.sun.com</a> 更新你的Java安装.
</p><h4>安装概述</h4>
<p>为了完成Openfire的安装, 你需要执行以下步骤:
</p><ol>
<li>数据库 - 如果你选择使用一个外部数据库, 你必须准备为Openfire准备好你的数据库. 
</li><li>安装 - 使用内置的基于web的安装工具来安装和验证服务器的配置. 
</li><li>管理控制台 - 使用基于web的管理工具来管理服务器.</li></ol>
<p>本文也包括以下信息:
</p><ul>
<li>在Windows下运行
</li><li>在Unix/Linux下运行
</li><li>安装和使用插件</li></ul>
<h4>分发版里的文件</h4>
<p>你的分发版里的文件应该像下面这样 (为了简短一点，一些子目录被忽略了):</p><pre>openfire/
 |- readme.html
 |- license.html
 |- conf/
 |- bin/
 |- jre/
 |- lib/
 |- plugins/
     |- admin/
 |- resources/
     |-database/
     |-security/
 |- documentation/
</pre>
<ul>
<li><strong>conf</strong> 目录Openfire用来存放配置文件. 
</li><li><strong>bin</strong> 目录包含了服务器的可执行文件. 根据你安装的不同分发版, 可用的执行文件也不同. 
</li><li><strong>jre</strong> 目录包含了一个 Java 5 虚拟机，打包在Windows和RPM版本Openfire里面的. 
</li><li><strong>lib</strong> 目录包含了运行Openfire所需要的库. 
</li><li><strong>plugins</strong> 目录包含了服务器插件. 缺省地, Openfire带了一个基于web的管理控制台插件. 
</li><li><strong>resources/database</strong> 目录包含 SQL 架构文件，用来新建Openfire数据库, 以及已有安装的更新脚本. 
</li><li><strong>resources/security</strong> 目录是Openfire维护keystores的地方，用来支持SSL连接安全性. 
</li><li><strong>documentation</strong> 目录包含了服务器文档.</li></ul>
<h4>安装数据库</h4>
<p>Openfire能把它的数据存储在一个嵌入式的数据库里，你也能选择使用一个外部数据库,例如MySQL或Oracle. 如果你喜欢使用外部数据库, 你必须在开始安装之前准备好它. 更多信息见<a href="http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database.html">数据库安装</a>.
</p><h4>安装服务器</h4>
<p>Openfire內建了一个基于web的, "向导"驱动的安装和配置工具. 简单地启动Openfire(分平台的指引如下) 并使用浏览器连接到管理控制台. 基于web的管理控制台的缺省端口是9090. 如果你和Openfire在同一台机器, 以下URL通常会起作用: <a href="http://127.0.0.1:9090/">http://127.0.0.1:9090</a>.
</p><h4>管理控制台</h4>
<p>在完成上述步骤之后, Openfire将被配置，你可以用基于web的管理控制台管理服务器. URL应该和你用来安装服务器用的那个一样，除非你在安装期间修改了那个端口.
</p><h4>在Windows下运行Openfire</h4>
<p>如果你使用了Openfire安装包, 在你的开始菜单里会有一个快捷方式来启动图形化启动器. 否则, 在你的 Openfire 安装位置的 bin/ 目录运行 openfire.exe . 在启动界面上有一个按钮，允许你自动打开你的web浏览器连接正确的URL来完成服务器的安装
</p><p><img alt="launcher.png" src="http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/launcher.png" />
</p><h5>Windows服务</h5>
<p>如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作为一个标准的Windows来运行. 如果你使用Windows安装包, 一个 openfire-service.exe 文件将会出现在安装目录下的 bin 目录. 你可以使用这个可执行文件来安装和控制Openfire服务.
</p><p>从控制台窗口, 你可以运行以下命令:
</p><ul>
<li><strong>openfire-service /install</strong> -- 安装服务. 
</li><li><strong>openfire-service /uninstall</strong> -- 卸载服务. 
</li><li><strong>openfire-service /start</strong> -- 启动服务. 
</li><li><strong>openfire-service /stop</strong> -- 停止服务.</li></ul>
<p><img alt="windows_service.png" src="http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/images/windows_service.png" />
</p><p>你也可以在Windows控制面板使用服务工具来启动和停止服务.
</p><p>注意: 那个图形化的启动器目前和Windows服务还不兼容. 如果你安装了服务, 你应该使用上述的服务控制台来控制服务而不是这个图形启动器.
</p><h5>自定义参数</h5>
<p>高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:</p><pre>-Xms512m
-Xmx1024m</pre>
<p>要新建参数给普通的启动器, 新建一个文件，名为 openfired.vmoptions (因为 openfire.exe 启动器会调用 openfired.exe 可执行文件来实际地启动服务器).
</p><h4>在Linux/Unix下运行Openfire</h4>
<p>如果你正在一个 Red Hat 或类 Red Hat 的系统上运行 (CentOS, Fedora, 等等), 我们建议使用RPM，因为它包含一些标准的类Red Hat环境的自定义处理. 假设你使用了RPM, 你可以使用<strong>/etc/init.d/openfire</strong> 脚本启动和停止Openfire.</p><pre># /etc/init.d/openfire
Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload}
# /etc/init.d/openfire start
Starting openfire:</pre>
<p>如果你正在一个不同的Linux/Unix变种下运行, 并且/或你使用了tar.gz '安装包', 你可以使用你的Openfire安装目录下的 bin/openfire 脚本启动和停止Openfire:</p><pre># ./openfire
Usage: ./openfire {start|stop}
# ./openfire start
Starting openfire</pre>
<p>如果你想把Openfire安装成一个服务, 在 bin/extra 目录提供了两个脚本:
</p><ul>
<li>redhat-postinstall.sh -- 自动把Openfire安装为Red Hat的服务. 它会新建一个"jive"用户，然后拷贝 openfired 脚本到你的 init.d 目录. 这个脚本必须以root身份来运行. 更多信息请看脚本里的注释. 
</li><li>openfired -- 把Openfire当成服务运行的脚本. 你必须手工配置这个脚本. 更多信息请看脚本里的注释.</li></ul>
<p><strong>如果你通过RPM安装，不推荐你使用这些脚本. RPM已经把这些脚本照顾得很好了.</strong>
</p><h5>自定义参数</h5>
<p>你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文件来做到这一点. 对于 Windows服务, 你要建一个新文本文件，名为 openfire-service.vmoptions. 每个给VM的参数应该独立占用文件中的一行. 例如, 设置最小堆栈大小为 512 MB 和最大 VM 堆栈为 1024 MB, 你可以用:
</p><p>高级用户可能希望传递参数到Java虚拟机(VM)来定制Openfire的运行时环境. 如果你是通过RPM安装的, 你可以编辑 /etc/sysconfig/openfire 文件并找到 OPENFIRE_OPTS 选项来定制它. 如果你通过.tar.gz安装的, 你要调整你的启动脚本来满足你的需要.
</p><h4>插件</h4>
<p>插件给Openfire增加了额外的特性和协议支持. 在安装完你的Openfire之后, 你可能想下载并安装插件以增进你的服务器. 插件可从 igniterealtime.org 的 plugins 页面下载或直接从内部的管理控制台直接下载.
</p><h5>安装插件</h5>
<p>如果你从Openfire内部的管理控制台下载了一个插件, 它将被自动安装. 如果你手工下载这个插件(打包成一个.jar文件), 你可以通过把插件文件拷贝到Openfire安装目录下的 plugins/ 目录来布署它. 一个插件监控器将自动解包这个插件到一个目录并安装这个插件到Openfire. 你也可以在管理控制台使用"上传插件"功能(在 插件 标签页) 来从本地文件系统装入一个插件到服务器.
</p><h5>管理插件</h5>
<p>插件可通过内部的Openfire管理控制台来管理. 你也可以在任何时候通过删除插件的JAR文件来手工删除一个插件(当你这么干了，Openfire将从内存自动移除这个插件并删除它的目录).</p><img src ="http://www.blogjava.net/hoojo/aggbug/378042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2012-05-13 15:21 <a href="http://www.blogjava.net/hoojo/archive/2012/05/13/378042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>