??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
我们采用的方案如下:
先看?/p>
上图的流E大致上是这L(fng)Q?
手机端向PC端发送聊天内?
1、手机端E序通过Socketq接服务器端的ServerSocket
2、然后服务器端根据手机Mobile客户端发送过来统一规范的报文或聊天内容Q进行解?
3、然后将解析的内容,再用smack框架转发到openfire服务?
4、最后由openfire服务器向客户端(BS、CS、PhoneClientQ程序发送聊天信息。这里的客户端可以是pc上的览器,pc上的桌面应用Q手机应用等
5、PC客户端BSE序Q用http bind方式监听Q的长连接监听到openfire服务器发送过来的数据Q直接在面中显C?/p>
同样QPC客户端向手机端发送聊天内?
1、PC客户端(BSQ可以直接用http bindQxmpp 提供的httph的长q接方式Q直接向openfire服务器发送聊天数据;
2、然后openfire服务器接收到聊天内容的时候,q时候socket服务器中的smack框架中有一个聊天内容的监听?
3、监听到PC端向openfire发送的内容后,会用socket的流向手机端发送我们定义好的报文或是聊天内?
4、手机端的socket会不停的轮询Q可以模拟心跛_长连接的方式Q,判断是否有消息到达,如果有则昄
而普通的聊天E序的流E则是客L(fng)发送信息到openfire服务器,openfire服务器再消息{发给其他客户端。他们省Msocket服务器这部分Q那我们Z么要加上socket服务器这部分呢?
我们q样做也是有自己的道理的Q?
首先Q如果让手机端自己实现向openfire服务器发送程序的代码Q那工作量是相当大的。因为每个手机^C用的语言都不同,每个q_都需要实现向openfire服务器发送聊天信息的报文。这其实是在做重复的工作,而且每个q_实现向手机端发送报文信息的技术会让每个手机端的开发h员都要学会一套和openfire交互的代码。这势必会重复工作、重复相同业务的代码。所以,把这些代码放在一个tcp/ip的socket中{服务器进行统一发送,q也是有好处的?
其次Q把所以发送消息在报文在socket服务器完成,可以对业务进行一个统一的处理、消息过滤?/p>
手机端被否决的解x案,供参?/font>
手机端用http长连接的方式Q这个是不行?/p>
其一、手机的Ud|络不稳定,长连接会l常断掉Q当然你可以自动q行重连
其二、长q接一直连接在服务器上Q占用服务器资源。当然你可以使用心蟩式长q接或是轮询方式
其三、手机端一直连接服务器会用手机端用户的网l带宽流量(量不是免费的,客户会怎么惻I
其四、手机端一直连着服务器,Ҏ(gu)机的?sh)量也有消耗(现在决电(sh)量也是一个问题)
解决办法
1、在链接openfire服务器后Q线E休眠一D|_再进行登录login操作?/p>
…?/p>
connection.connect();
Thread.sleep(3000);connection.login(user, pass);
…?
2、设|setPacketReplyTimeout参数
......
SmackConfiguration.setPacketReplyTimeout(PACKET_REPLY_TIMEOUT);
config = new ConnectionConfiguration(SERVER, PORT);......
注意Q如果设|了休眠旉或setPacketReplyTimeout参数后还是出现错误,误旉讄再大些看?/p>
参考官方解{:http://community.igniterealtime.org/message/206443#206443
什么是OpenFire
Openfire 采用Java开发,开源的实时协作QRTCQ服务器ZXMPPQJabberQ协议?
(zhn)可以用它L的构建高效率的即旉信服务器。Openfire安装和用都非常单,q利用Webq行理。单台服务器可支持上万ƈ发用戗?
׃是采用开攄XMPP协议Q?zhn)可以使用各种支持XMPP协议的IM客户端Y件登陆服务?
XMPPQ?/b>JabberQ协?/b>
1?介绍
XMPP是一U基于XML的协议,它承了在XML环境中灵zȝ发展性。因此,ZXMPP的应用具有超强的可扩展性。经q扩展以后的XMPP可以通过发送扩展的信息来处理用L(fng)需求,以及在XMPP的顶端徏立如内容发布pȝ和基于地址的服务等应用E?序。而且QXMPP包含了针Ҏ(gu)务器端的软g协议Q之能与另一个进行通话Q这使得开发者更Ҏ(gu)建立客户应用E序或给一个配好系l添加功能?
2?定义Q?b>
XMPPQ可扩展消息处理现场协议Q是Z可扩展标记语aQXMLQ的协议Q它用于x消息QIMQ以及在U现场探。它在促q服务器之间的准x操作。这个协议可能最l允许因特网用户向因特网上的其他M人发送即时消息,即其操作系l和览器不同?
XMPP的前w是JabberQ?一个开源Ş式组l生的|络x通信协议。XMPP目前被IETF国际标准l织完成了标准化工作。标准化的核心结果分Z部分Q?
核心的XML传输协?
ZXML FreeEIM传输的x通讯扩展应用
XMPP的核心XML传输协议的定义使得XMPP能够在一个比以往|络通信协议更规范的q_上。借助于XML易于解析和阅ȝҎ(gu),使得XMPP的协议能够非常漂亮?
XMPP的即旉讯扩展应用部分是根据IETF在这之前对即旉讯的一个抽象定义的Q与其他业已得到q泛使用的即旉讯协议Q诸如AIMQQQ{有功能完整Q完善等先进性?
在IETF 中,把IM协议划分为四U协议,x信息和出席协?Instant Messaging and Presence Protocol, IMPP)、出席和x信息协议(Presence and Instant Messaging Protocol, PRIM)、针对即时信息和出席扩展的会话发起协?Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions, SIMPLE)Q以及可扩展的消息出席协?XMPP)。最初研发IMPP 也是Z创徏一U标准化的协议,但是今天QIMPP 已经发展成ؓ基本协议单元Q定义所有即旉信协议应该支持的核心功能集?
3?XMPP协议的优?
a. XMPP 协议是公开的,由JSF开源社区组l开发的。XMPP 协议q不属于M的机构和个hQ而是属于整个CQ这一点从Ҏ(gu)上保证了其开放性?
b. XMPP 协议h良好的扩展性。在XMPP 中,x消息和到Z息都是基于XML 的结构化信息Q这些信息以XML ?XML Stanza)的Ş式在通信实体间交换。XMPP 发挥了XML l构化数据的通用传输层的作用Q它?yu)出席和上下文敏感信息嵌入到XML l构化数据中Q从而数据以极高的效率传送给最合适的资源。基于XML 建立h的应用具有良好的语义完整性和扩展性?
c. 分布式的|络架构。XMPP 协议都是ZClient/Server 架构Q但是XMPP协议本nq没有这L(fng)限制。网l的架构和电(sh)子邮件十分相|但没有结合Q何特定的|络架构Q适用范围非常q泛?
d. XMPP h很好的弹性。XMPP 除了可用在即旉信的应用程序,q能用在|络理、内容供Eѝ协同工兗档案共享、游戏、远端系l监控等?
e. 安全性。XMPP在Client-to-Server通信Q和Server-to-Server通信中都使用TLS (Transport Layer Security)协议作ؓ通信通道的加密方法,保证通信的安全。Q何XMPP服务器可以独立于公众XMPP|络Q例如在企业内部|络中)Q而用SASL及TLS{技术更加增Z通信的安全性。如下图所C:
4?XMPP协议的组?
主要的XMPP 协议范本及当今应用很q的XMPP 扩展Q?
l RFC 3920 XMPPQ新的RFC6120Q:核心。定义了XMPP 协议框架下应用的|络架构Q引入了XML StreamQXML )与XML StanzaQXML 节)Qƈ规定XMPP 协议在通信q程中用的XML 标签。用XML 标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP q行无缝的连接,为协议的安全性、可靠性奠定了基础。Core 文档q规定了错误的定义及处理、XML 的用规范、JIDQJabber IdentifierQJabber 标识W)的定义、命名规范等{。所以这是所有基于XMPP 协议的应用都必需支持的文档?
l RFC 3921Q用h功登陆到服务器之后,发布更新自己的在U好友管理、发送即时聊天消息等业务。所有的q些业务都是通过三种基本的XML 节来完成的:IQ StanzaQIQ 节), Presence StanzaQPresence 节), Message StanzaQMessage 节)。RFC3921 q对d{略q行了定义,定义是多U阻塞方式。可以说QRFC3921 是RFC3920 的充分补充。两个文档结合v来,Ş成了一个基本的x通信协议q_Q在q个q_上可以开发出各种各样的应用?
l XEP-0030 服务搜烦。一个强大的用来定XMPP |络中的其它实体所支持Ҏ(gu)的协议?
l XEP-0115 实体性能。XEP-0030 的一个通过x出席的定Ӟ可以实时改变交变q告功能?
l XEP-0045 多h聊天。一l定义参与和理多用戯天室的协议,cM于Internet 的Relay ChatQ具有很高的安全性?
l XEP-0096 文g传输。定义了从一个XMPP 实体到另一个的文g传输?
l XEP-0124 HTTP l定。将XMPP l定到HTTP 而不是TCPQ主要用于不能够持久的维持与服务器TCP q接的设备?
l XEP-0166 Jingle。规定了多媒体通信协商的整体架构?
l XEP-0167 Jingle Audio Content Description Format。定义了从一个XMPP 实体到另一个的语音传输q程?
l XEP-0176 Jingle ICEQInteractive Connectivity EstablishmentQTransport。ICE传输机制Q文件解决了如何让防火墙或是NATQNetwork Address TranslationQ保护下的实体徏立连接的问题?
l XEP-0177 Jingle Raw UDP Transport。纯UDP 传输机制Q文件讲qC如何在没有防火墙且在同一|络下徏立连接的?
l XEP-0180 Jingle Video Content Description Format。定义了从一个XMPP 实体到另一个的视频传输q程?
l XEP-0181 Jingle DTMFQDual Tone Multi-FrequencyQ?
l XEP-0183 Jingle Telepathy Transport Method?
5?XMPP协议|络架构
XMPP是一个典型的C/S架构Q而不是像大多数即旉讯软g一P使用P2P客户端到客户端的架构Q也是说在大多数情况下Q当两个客户端进行通讯Ӟ他们的消息都是通过服务器传递的(也有例外Q例如在两个客户端传输文件时)Q采用这U架构,主要是ؓ了简化客L(fng)Q将大多数工作放在服务器端进行,q样Q客L(fng)的工作就比较单,而且Q当增加功能Ӟ多数是在服务器端q行QXMPP服务的框架结构如下图所C.XMPP中定义了三个角色QXMPP客户端,XMPP服务器、网养I通信能够在这三者的L两个之间双向发生Q服务器同时承担了客L(fng)信息记录、连接管理和信息的\由功能.|关承担着与异构即旉信pȝ的互联互通,异构pȝ可以包括SMS(短信)、MSN、ICQ{.基本的网lŞ式是单客L(fng)通过TCPQIPq接到单服务器,然后在之上传输XMLQ工作原理是Q?
(1) 点连接到服务器;
(2) 务器利用本地目录pȝ中的证书对其认证Q?
(3) Ҏ(gu)定目标地址Q让服务器告知目标状态;
(4) 务器查找、连接ƈq行怺认证Q?
(5) 点之间进行交互;
6?XMPP客户?
XMPP pȝ的一个设计标准是必须支持单的客户端。事实上QXMPP pȝ架构对客L(fng)只有很少的几个限制。一个XMPP 客户端必L持的功能有:
1. 通过 TCP 套接字与XMPP 服务器进行通信Q?
2. 解析l织好的 XML 信息包;
3. 理解消息数据cd?
XMPP 复杂性从客户端{Ud服务器端。这使得客户端编写变得非常容易,更新pȝ功能也同样变得容易。XMPP 客户端与服务端通过XML 在TCP 套接字的5222 端口q行通信Q而不需要客L(fng)之间直接q行通信?
基本的XMPP 客户端必dC下标准协议(XEP-0211Q:
RFC3920 核心协议Core
RFC3921 x消息和出席协议Instant Messaging and Presence
XEP-0030 服务发现Service Discovery
XEP-0115 实体能力Entity Capabilities
7?XMPP服务?
XMPP 服务器遵循两个主要法则:
1、监听客L(fng)q接Qƈ直接与客L(fng)应用E序通信Q?
2、与其他 XMPP 服务器通信Q?
XMPP开源服务器一般被设计成模块化Q由各个不同的代码包构成Q这些代码包分别处理Session理、用户和服务器之间的通信、服务器之间的通信、DNSQDomain Name SystemQ{换、存储用L(fng)个h信息和朋友名单、保留用户在下线时收到的信息、用h册、用L(fng)w䆾和权限认证、根据用L(fng)要求qo信息和系l记录等。另外,服务器可以通过附加服务来进行扩展,如完整的安全{略Q允许服务器lg的连接或客户端选择Q通向其他消息pȝ的网兟?
基本的XMPP 服务器必dC下标准协?
RFC3920 核心协议Core
RFC3921 x消息和出席协议Instant Messaging and Presence
XEP-0030 服务发现Service Discovery
8?XMPP|关
XMPP H出的特Ҏ(gu)可以和其他即旉信pȝ交换信息和用户在U状c由于协议不同,XMPP 和其他系l交换信息必通过协议的{换来实现Q目前几U主即旉信协议都没有公开Q所以XMPP 服务器本wƈ没有实现和其他协议的转换Q但它的架构允许转换的实现。实现这个特D功能的服务端在XMPP 架构里叫做网?gateway)。目前,XMPP 实现了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的协议{换。由于网关的存在QXMPP 架构事实上兼Ҏ(gu)有其他即旉信|络Q这无疑大大提高了XMPP 的灵zL和可扩展性?
9?XMPP地址格式
一个实体在XMPP|络l构中被UCؓ一个接点,它有唯一的标C符jabber identifier(JID)Q即实体地址Q用来表CZ个Jabber用户Q但是也可以表示其他内容Q例如一个聊天室Q一个有效的JID包括一pd元素Q?
(1) ?domain identifier)Q?
(2) ?node identifier)Q?
(3) ?resource identifier)Q?
它的格式是node@domain/resourceQnode@domainQ类似电(sh)子邮件的地址格式Qdomain用来表示接点不同的设备或位置Q这个是可选的Q例如a在Server1上注册了一个用P用户名ؓdoomQ那么a的JID是doom@serverlQ在发送消息时Q指明doom@serverl可以了Qresource可以不用指定Q但a在登录到q个ServerӞfl的JID可能是doom@serverl、exodus(如果a用Exodus软gd)Q也可能是doom@serverl/psi(如果a用psi软gd)Q资源只用来识别属于用户的位|或讑֤{,一个用户可以同时以多种资源与同一个XMPP服务器连接?
10?XMPP消息格式
XMPP中定义了3个顶层XML元素: Message、Presence、IQQ下面针对这三种元素q行介绍?
<Message>
用于在两个jabber用户之间发送信息。Jsm(jabber会话理?负责满所有的消息Q不目标用L(fng)状态如何。如果用户在Ujsm立即提交;否则jsm存储?
To : 标识消息的接收方?
from : 指发送方的名字或标示(id)
Text: 此元素包含了要提交给目标用户的信息?
l构如下所C?
<message to= ‘lily@jabber.org/contact?type =’chat?gt;
<body> 你好Q在忙吗</body>
</message>
<Presence>
用来表明用户的状态,如:online、away、dnd(请勿打扰){。当用户ȝ或改变自q状态时Q就会在stream的上下文中插入一个Presence元素Q来表明自n的状态.l构如下所C:
<presence>
From =‘lily @ jabber.com/contact?
To = ‘yaoman @ jabber.com/contact'
<status> Online </status>
</presence>
<presence>元素可以取下面几U?
Probe: 用于向接受消息方法发送特D的h
subscribe: 当接受方状态改变时Q自动向发送方发送presence信息?
< IQ >
一U请求/响应机制Q从一个实体从发送请求,另外一个实体接受请求,q进行响应.例如Qclient在stream的上下文中插入一个元素,向Serverh得到自己的好友列表,Serverq回一个,里面是请求的l果Q?
<iq > 主要的属性是type。包?
Get :获取当前域倹{?
Set :讄或替换get查询的倹{?
Result :说明成功的响应了先前的查询?
Error: 查询和响应中出现的错误?
l构如下所C?
<iq from =‘lily @ jabber.com/contact’id=?364564666?Type=’result?gt;
一?Stream
<!-- #################### 通信内容采用压羃技术,以及通信的相兛_?####################### -->
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"
xmlns="jabber:client" from="127.0.0.1" id="e38900bc" xml:lang="en"
version="1.0">
<!--
xmlns 表示通信客户?/span>
from 客户端的地址Q来源)
id
lang 通信语言
-->
<stream:features>
<!-- 开始tls协议[TLS]的频道加密方?-->
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>
<!-- 加密技术、安全证?-->
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>ANONYMOUS</mechanism>
<mechanism>CRAM-MD5</mechanism>
</mechanisms>
<!-- 采用压羃技?-->
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<!-- 权限 -->
<auth xmlns="http://jabber.org/features/iq-auth" />
<!-- 注册 -->
<register xmlns="http://jabber.org/features/iq-register" />
</stream:features>
关于TSL 参考:http://www.jabbercn.org/RFC3920
1?/b>TSL协议遵@以下规则Q?/b>
A?一个遵守本协议的初始化实体必须QMUSTQ在初始化流的头信息中包含一?version'属性ƈ把D为?.0”?
B?如果TLS握手发生在两个服务器之间Q除非服务器声称的DNSL名已l被解析Q通信不能QMUST NOTQl进行?
C?当一个遵守本协议的接收实体接收了一个初始化(它的头信息中包含一?version'属性ƈ且D为?.0”)Q在发送应{流的的头信息(其中包含版本标记Q之后,它必d送(MUSTQ?lt;starttls/>元素Q名字空间ؓ 'urn:ietf:params:xml:ns:xmpp-tls'Q以及其他它支持的流Ҏ(gu)?
D?如果初始化实体选择使用TLS,TLS握手必须在SASL握手之前完成Q这个顺序用于帮助保护SASL握手时发送的认证信息的安全,同时可以在必要的时候在TLS握手之前为SASL外部机制提供证书?
E?TLS握手期间,一个实体不能(MUST NOTQ在的根元素中发送Q何空格符号作为元素的分隔W(在下面的TLSCZ中的MI格W都仅仅是ؓ了便于阅读)Q这个禁令用来帮助确保安全层字节_ֺ?
F?接收实体必须QMUSTQ在发?lt;proceed/> 元素的关闭符?>" 之后立刻开始TLS协商。初始化实体必须QMUSTQ在从接收实体接收到<proceed/> 元素的关闭符?>" 之后立刻开始TLS协商?
G?初始化实体必(MUSTQ验证接收实体出C的证书Q关于证书验证流E参见Certificate Validation ( W十四章W二??
H?证书必须QMUSTQ检查初始化实体(比如一个用?提供的主机名Q而不是通过DNSpȝ解析出来的主机名Q例如,如果用户指定一个主机名"example.com"而一个DNS SRV [SRV]查询q回"im.example.com"Q证书必(MUSTQ检?example.com".如果MU类的XMPP实体Q例如客L(fng)或服务器Q的JID出现在一个证书里Q它必须QMUSTQ表Cؓ一个别名实体里面的UTF8字符Ԍ存在于subjectAltName之中。如何?[ASN.1] 对象标识W?"id-on-xmppAddr" 定义在本文的W五章第一节第一节?
I?如果 TLS 握手成功了,接收实体必须QMUSTQ?丢弃TLS 生效之前从初始化实体得到的Q何不可靠的信?
J?如果 TLS 握手成功了,初始化实体必(MUSTQ?丢弃TLS 生效之前从接收实体得到的M不可靠的信息
K?如果 TLS 握手成功了,接收实体不能(MUST NOT)在流重新开始的时候通过提供其他的流Ҏ(gu)来向初始化实体提供 STARTTLS 扩展
L?如果 TLS 握手成功了,初始化实体必?MUST)l箋q行SASL握手
M?如果 TLS 握手p|了,接收实体必须QMUSTQ终止XML和相应的TCPq接?
N?关于必须QMUSTQ支持的机制Q参?Mandatory-to-Implement Technologies (W十四章W七? ?
2、当一个初始化实体?/b>TLS保护一个和接收实体之间的流Q其步骤如下:
A. 初始化实体打开一个TCPq接Q发送一个打开的XML头信息Q其'version'属性设|ؓ"1.0"Q给接收实体以初始化一个流?
B. 接收实体打开一个TCPq接Q发送一个XML头信息Q其'version'属性设|ؓ"1.0"Q给初始化实体作为应{?
C. 接收实体向初始化实体提议STARTTLS范围Q包括其他支持的特性)Q如果TLS对于和接收实体交互是必需的,它应该(SHOULDQ在<starttls/>元素中包含子元素<required/>
D. 初始化实体发出STARTTLS命o(例如, 一个符?urn:ietf:params:xml:ns:xmpp-tls'名字I间?<starttls/> 元素) 以通知接收实体它希望开始一个TLS握手来保护流?
E. 接收实体必须QMUSTQ以'urn:ietf:params:xml:ns:xmpp-tls'名字I间中的<proceed/>元素?lt;failure/>元素应答。如果失败,接收实体必须QMUSTQ终止XML和相应的TCPq接。如果l进行,接收实体必须QMUSTQ尝试通过TCPq接完成TLS握手q且在TLS握手完成之前不能QMUST NOTQ发送Q何其他XML数据?
F. 初始化实体和接收实体试完成TLS握手。(要符合[TLS]规范Q?
G. 如果 TLS 握手不成? 接收实体必须QMUSTQ终?TCP q接. 如果 TLS 握手成功, 初始化实体必(MUSTQ发送给接收实体一个打开的XML头信息来初始化一个新的流Q先发送一个关闭标{?lt;/stream>是不必要?因ؓ接收实体和初始化实体必须(MUST)保原来的流在TLS握手成功之后被关闭) ?
H. 在从初始化实体收到新的流头信息之后,接收实体必须QMUSTQ发送一个新的XML头信息l初始化实体作ؓ应答Q其中应包含可用的特性但不包含STATRTTLSҎ(gu)?/p>
q篇文章介绍Jwchat的安装和配置
首先Jwchat的配|和安装需要具备的环境Q?
Tomcat 5.0.28+/Tomcat 6
JDK 1.6+
Openfire 3.7.1
1?下蝲jwchat工程文g
下蝲站点Q?a >http://blog.jwchat.org/jwchat/download/
Zip下蝲Q?a >http://downloads.sourceforge.net/jwchat/jwchat-1.0.zip?use_mirror=
2?下蝲完成后,jwchat-1.0.zip解压C的tomcat的webapps目录Q将jwchat-1.0命名为jwchatQ如果不q样的话Q可能会出现错误Q如Authorization failed。至这样会方便你访问jwchat工程?
然后index.html.zh_CN{这样带?.后缀.zh_CN的这L(fng)文g?zh_CN都删掉,q行重命名?zh_CN是表CZ文版的,当然你也可以直接?.后缀.后缀的文件进行重命名Q那样就是默认的英文版的了?
扚w命名工具c:
package com.hoo.util;
import java.io.File;
/**
* <b>function:</b> 文g命名工具c?/span>
* @author hoojo
* @createDate 2012-5-14 下午01:58:14
* @file FileRenameUtils.java
* @package com.hoo.util
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public abstract class FileRenameUtils {
private final static String FILE_PATH = "D:\\apache-tomcat-6.0.33\\webapps\\jwchat";
/**
* <b>function:</b> 指定目录下的文件的typecd的文Ӟq行重命名,命名后的文g去掉type
* <p>example: 如果type = htmlQ?index.html.html -> index.html</p>
* <p>example: 如果type = zh_CNQ?index.html.zh_CN -> index.html</p>
* @author hoojo
* @createDate 2012-5-16 下午02:16:48
* @param path
* @param type
*/
public static void rename(String path, String type) {
if (path == null || "".equals(path)) {
path = FILE_PATH;
}
File dir = new File(path);
File[] list = dir.listFiles();
for (File file : list) {
String name = file.getName();
String[] s = name.split("\\.");
if (s.length == 3 && type.equals(s[2])) {
System.out.println(s[0] + "--" + s[1] + "--" + s[2]);
file.renameTo(new File(path + "/" + s[0] + "." + s[1]));
}
}
}
public static void main(String[] args) {
FileRenameUtils.rename("D:\\apache-tomcat-6.0.33\\webapps\\jwchat", "zh_CN");
}
}
3?下蝲JabberHTTPBindq个包,因ؓ直接下蝲的jwchat没有WEB-INF、web.xml是无法运行的?
JabberHTTPBind是jwchatq行http bind通信的一U方式,它可以让jwchat和openfireq行链接通信?
站点Q?a >http://blog.jwchat.org/jhb/
下蝲地址Q?a >http://blog.jwchat.org/download/JabberHTTPBind-1.1.1.zip
JabberHTTPBind会依赖xalan的library?
下蝲站点Q?a >http://xml.apache.org/xalan-j/downloads.html
下蝲目录Q?a >http://labs.renren.com/apache-mirror/xml/xalan-j/
4?下蝲完成后,JabberHTTPBind的zip解压出来的WEB-INF、META-INF一q放到刚才的jwchat目录中,q且刚才下载的xalan的xalan.jar,serializer.jar, xercesImpl.jar, xml-apis.jar攑ֈwebapps\jwchat\WEB-INF\lib目录下即可?
5?修改jwchat目录中的相关配置
修改config.js文g
var BACKENDS =
[
{
…?/pre>},{…?/pre>},{name:"Open Relay",
description:"HTTP Binding backend that allows connecting to any jabber server",
httpbase:"/JHB/", /* 修改q里为:/jwchat/JHB/ */type:"binding",
default_server: SITENAME},{…?/pre>}];
修改WEB-INF目录下的web.xml文g
<servlet-mapping>
<servlet-name>Jabber HTTP Binding Servlet</servlet-name>
<url-pattern>/</url-pattern>
url-pattern修改为:/JHB/
<!-- q里的修改主|对应上面的config.jsQ如果config.js的httpbase配置?jwchat/Q那q里的就不用修改?-->
</servlet-mapping>
6?启动tomcat后,讉Khttp://localhost:8080/jwchat/
如果d出现Service unavailableq个问题Q那么会有以下几U情况:
A?表明服务器不可用Q可能是openfire服务器没有启动,
B?webapps\jwchat \config.js的配|有问题Q如var SITENAME = "localhost";和openfire服务器地址没有对应
C?伴随出现QException in thread "Thread-34" javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found异常Q可能是tomcat版本低于tomcat6或是jwchat~少相应的jar包,如缺xml的serializer.jar、xalan.jar、xercesImpl.jar、xml-apis.jar
D、如果在满了c步骤Q有djra包还出现Exception in thread "Thread-34" javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found异常Q徏议删除tomcat/work目录下的~存Q然后重启tomcat试试
7?如果d出现Authorization failed验证p|Q那么有以下几种可能的情况:
A?用户没有注册
B?openfire的证书(C:\Program Files\openfire\resources\securityQ没有安装到相应的jdk的C:\Program Files\Java\jre6\lib\security目录?
如果出现q种异常信息Qjavax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed也表明是安全证书的问题;
关于解决ssl验证Q网上有在jsjac.js中的if(this.has_sasl) q行前面加上this.has_sasl = false;来取消ssl安全证书的验证?
C?如果你的工程名称不是jwchatQ徏议把它修Ҏ(gu)jwchatq且修改config.xml的相关链接的配置QhttpbaseQ?
D?q有可能是你当前的用h有注册,q个时候你可以注册一个用h是在openfire控制台的用户l中d一个用P然后再等了看看是否存在这个问题?
8?修改服务器名U?
点击服务器à服务器理器à编辑属?修改服务器名U?
修改后的服务器名U?
出现叹号Q我们要删除安全证书Q点?yn)L务器à服务器设|à服务器安全证书删掉q里的证书?
删除后,在当前页面会出现提示Q然后按照提C点ȝ应的链接Q重启服务器Q然后登陆,再生成证?
生成证书需要点旉Q然后生成完成后Q手动重启openfire服务器,再次登陆发现警告没有了?
9?在服务器端增加配|?
xmpp.httpbind.client.requests.polling = 0
xmpp.httpbind.client.requests.wait = 10
官方下蝲站点Q?a >http://www.igniterealtime.org/downloads/index.jsp#openfire
下蝲地址Q?
ExeQ?a >http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.exe
ZIP: http://www.igniterealtime.org/downloads/download-landing.jsp?file=openfire/openfire_3_7_1.zip
我用的是zip解压版的安装文g?
其中openfire是服务器Q下面还有一个sparkQ这个是一个XMPP协议通信聊天的CS的IM软gQ它可以通过openfireq行聊天对话?
2?下蝲完成后,如果你下载的是exe文gQ执行你的安装文Ӟq行安装。这里我是zip的文件。解压后Q复制openfire目录到C:\Program Files\目录下;一定要在C:\Program Files\目录下的Q这样openfire安装完成了?
3?下面我们启动openfire服务器,q|它。在C:\Program Files\openfire\bin目录下有一个电(sh)灯的openfire.exe文gQ双?yn)L行,启动完成后可以看?
4?点击Launch Admin按钮q入http://127.0.0.1:9090/setup/index.jsp面Q配|openfire服务?
5?选择语言 中文?
点击continueq入
6?配置服务器域?
如果你是本地讉KQ那么你可以不修Ҏ(gu)是用localhost?27.0.0.1的方?
如果你用于外|或局域网讉KQ那么你的地址配置成外|或局域网地址
7?选择数据?
选择openfire自带的,当然你也可以选择你的数据库类型。如Oracle、SQLServer、MySQL{。如果openfire没有带jdbc的连接驱动,你需要添加连接数据库的jdbc驱动Q驱动放在C:\Program Files\openfire\lib目录?
8?选择Ҏ(gu)配|,默认卛_
9?理员邮Ӟ可以跌q步
10?安装完成
q入理员控制台面
11?q入http://127.0.0.1:9090/login.jsp面后,输入admin、密码admin登陆q入
12?q入后可以看?
服务器名U就是jwchat的连接地址Q你可以使用Spark、jwchat链接q个地址q行IM通信聊天…?
xQopenfire的安装和配置已经完成。下一文章开始完成jwchat的安装和配置?
如果你需要更换服务器名称ipQ请看下一文章!
安装指南
Openfire是一个强大的x消息QIMQ和聊天服务器,它实CXMPP协议。这份文件将引导(zhn)通过安装Openfire。对于更多的功能和信息的完整列表Q请讉KOpenfire|站Q?a >http://www.igniterealtime.org/projects/openfire/
q行Openfire 安装? 应用~省被安装于目?c:\Program Files\Openfire .
可选择RPM包或tar.gz? 如果使用RPM? 用你的包理器运行把它Openfire安装到目?/opt/openfire:
rpm -ivh openfire_3_0_0.rpm
如果使用.tar.gz? 解压到目?/opt ?/usr/bin:
tar -xzvf openfire_3_0_0.tar.gz mv openfire /opt
注意: .tar.gz包不一定包含Java虚拟?JRE). 所? 你必M前就?JDK ?JRE 1.5.0 (Java 5) 或之后安装到你的pȝ? 你可以在命o行键?"java -version" 来检查你的java版本Q然?(如果必要) 讉K http://java.sun.com 更新你的Java安装.
Z完成Openfire的安? 你需要执行以下步?
本文也包括以下信?
你的分发版里的文件应该像下面q样 (Z短一点,一些子目录被忽略了):
openfire/ |- readme.html |- license.html |- conf/ |- bin/ |- jre/ |- lib/ |- plugins/ |- admin/ |- resources/ |-database/ |-security/ |- documentation/
Openfire能把它的数据存储在一个嵌入式的数据库里,你也能选择使用一个外部数据库,例如MySQL或Oracle. 如果你喜Ƣ用外部数据库, 你必d开始安装之前准备好? 更多信息?a >数据库安?/a>.
Openfire內徏了一个基于web? "向导"驱动的安装和配置工具. 单地启动Openfire(分^台的指引如下) q用浏览器q接到管理控制台. Zweb的管理控制台的缺省端口是9090. 如果你和Openfire在同一台机? 以下URL通常会v作用: http://127.0.0.1:9090.
在完成上q步骤之? Openfire被配置Q你可以用基于web的管理控制台理服务? URL应该和你用来安装服务器用的那个一P除非你在安装期间修改了那个端?
如果你用了Openfire安装? 在你的开始菜单里会有一个快h式来启动囑Ş化启动器. 否则, 在你?Openfire 安装位置?bin/ 目录q行 openfire.exe . 在启动界面上有一个按钮,允许你自动打开你的web览器连接正的URL来完成服务器的安?
如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作ؓ一个标准的Windows来运? 如果你用Windows安装? 一?openfire-service.exe 文g会出现在安装目录下?bin 目录. 你可以用这个可执行文g来安装和控制Openfire服务.
从控制台H口, 你可以运行以下命?
你也可以在Windows控制面板使用服务工具来启动和停止服务.
注意: 那个囑Ş化的启动器目前和W(xu)indows服务q不兼容. 如果你安装了服务, 你应该用上q的服务控制台来控制服务而不是这个图形启动器.
高用户可能希望传递参数到Java虚拟?VM)来定制Openfire的运行时环境. 你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文g来做到这一? 对于 Windows服务, 你要Z个新文本文gQ名?openfire-service.vmoptions. 每个lVM的参数应该独立占用文件中的一? 例如, 讄最堆栈大ؓ 512 MB 和最?VM 堆栈?1024 MB, 你可以用:
-Xms512m -Xmx1024m
要新建参数给普通的启动? 新徏一个文Ӟ名ؓ openfired.vmoptions (因ؓ openfire.exe 启动器会调用 openfired.exe 可执行文件来实际地启动服务器).
如果你正在一?Red Hat 或类 Red Hat 的系l上q行 (CentOS, Fedora, {等), 我们使用RPMQ因为它包含一些标准的cRed Hat环境的自定义处理. 假设你用了RPM, 你可以?strong>/etc/init.d/openfire 脚本启动和停止Openfire.
# /etc/init.d/openfire Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload} # /etc/init.d/openfire start Starting openfire:
如果你正在一个不同的Linux/Unix变种下运? q且/或你使用了tar.gz '安装?, 你可以用你的Openfire安装目录下的 bin/openfire 脚本启动和停止Openfire:
# ./openfire Usage: ./openfire {start|stop} # ./openfire start Starting openfire
如果你想把Openfire安装成一个服? ?bin/extra 目录提供了两个脚?
如果你通过RPM安装Q不推荐你用这些脚? RPM已经把这些脚本照־很好?
你可以在你的Openfire安装目录下的 bin/ 目录建立 vmoptions 文g来做到这一? 对于 Windows服务, 你要Z个新文本文gQ名?openfire-service.vmoptions. 每个lVM的参数应该独立占用文件中的一? 例如, 讄最堆栈大ؓ 512 MB 和最?VM 堆栈?1024 MB, 你可以用:
高用户可能希望传递参数到Java虚拟?VM)来定制Openfire的运行时环境. 如果你是通过RPM安装? 你可以编?/etc/sysconfig/openfire 文gq找?OPENFIRE_OPTS 选项来定制它. 如果你通过.tar.gz安装? 你要调整你的启动脚本来满你的需?
插glOpenfire增加了额外的Ҏ(gu)和协议支持. 在安装完你的Openfire之后, 你可能想下蝲q安装插件以增进你的服务? 插g可从 igniterealtime.org ?plugins 面下蝲或直接从内部的管理控制台直接下蝲.
如果你从Openfire内部的管理控制台下蝲了一个插? 它将被自动安? 如果你手工下载这个插?打包成一?jar文g), 你可以通过把插件文件拷贝到Openfire安装目录下的 plugins/ 目录来布|它. 一个插件监控器自动解包这个插件到一个目录ƈ安装q个插g到Openfire. 你也可以在管理控制台使用"上传插g"功能(?插g 标签? 来从本地文gpȝ装入一个插件到服务?
插g可通过内部的Openfire理控制台来理. 你也可以在Q何时候通过删除插g的JAR文g来手工删除一个插?当你q么q了QOpenfire从内存自动U除q个插gq删除它的目?.