openfire 介绍安装使用
2014-09-11 11:59 youxin 阅读(4004) 评论(0) 编辑 收藏 举报Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。您可以使用它轻易的构建高效率的即时通信服务器.由于是采用开放的XMPP协议,您可以使用各种支持XMPP协议的IM客户端软件登陆服务.
什么是XMPP?
Extensible Messaging and Presence Protocol,简单的来讲,它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。正是因为使用 了XML作为消息传递的中介,Extensible 才谈的上,不是么?嘿嘿。再详尽的东西,我也就不多介绍了,大家可以去百度百科里查看下。
什么是IM ?
Instant Messenger,及时通信软件,就是大家使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM 几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。设想既然XMPP 协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让 你可以边游戏边聊天,也可以开发出适合游戏本身的IM 应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。说了这么多,就是一个意思,其商业价值远远比你想的高!
Spark Smack 和 Openfire
开源界总是有许多有 趣的东东,这三个合起来就是一个完整的XMPP IM 实现。包括服务器端——Openfire,客户端——Spark,XMPP 传输协议的实现——Smack(记住,XMPP是一个协议,协议是需要实现的,Smack起到的就是这样的一个作用)。三者都是基于Java 语言的实现,因此对于熟悉Java 的开发者来说不是很难。(smack滋味)
Spark 提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者来说不能不说是一个福音。我强烈建议基于插件方式来实现你新增加的功能,而不是去 改它的源代码,这样有利于你项目架构,把原始项目的影响降到最低,文章以后的部分也是基于这种插件体系进行开发的
Openfire 是基于XMPP 协议的IM 的服务器端的一个实现,虽然当两个用户连接后,可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息和通信信息的,所以服务 器端是必须要实现的。Openfire 也提供了一些基本功能,但真的很基本的!庆幸的是,它也提供插件的扩展,像Spark 一样,我同样强烈建议使用插件扩展的方式来增加新的功能,而不是修改人家的源代码。
Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的API,不过有些时候,你还是不得不使用自己定制发送的XML 文件内容的方式来实现自己的功能
下图展示了三者之间的关系:
更多:http://blog.sina.com.cn/s/blog_629847620100ksfy.html
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp#openfire
有mac,window,linux版本。
我使用的是zip解压版的安装文件。
其中openfire是服务器,下面还有一个spark,这个是一个XMPP协议通信聊天的CS的IM软件,它可以通过openfire进行聊天对话。
2、 下载完成后,如果你下载的是exe文件,执行你的安装文件,进行安装。这里我是zip的文件。解压后,复制openfire目录到C:\Program Files\目录下;一定要在C:\Program Files\目录下的;这样openfire就安装完成了。
3、 下面我们启动openfire服务器,并配置它。在C:\Program Files\openfire\bin目录下有一个电灯泡的openfire.exe文件,双击执行,启动完成后可以看到
4、 点击Launch Admin按钮进入http://127.0.0.1:9090/setup/index.jsp页面,配置openfire服务器
5、 选择语言 中文简体
点击continue进入
6、 配置服务器域名
如果你是本地访问,那么你可以不修改或是使用localhost、127.0.0.1的方式
如果你用于外网或局域网访问,那么你的地址配置成外网或局域网地址
(
你的分发版里的文件应该像下面这样 (为了简短一点,一些子目录被忽略了):
openfire/ |- readme.html |- license.html |- conf/ |- bin/ |- jre/ |- lib/ |- plugins/ |- admin/ |- resources/ |-database/ |-security/ |- documentation/
- conf 目录Openfire用来存放配置文件.
- bin 目录包含了服务器的可执行文件. 根据你安装的不同分发版, 可用的执行文件也不同.
- jre 目录包含了一个 Java 5 虚拟机,打包在Windows和RPM版本Openfire里面的.
- lib 目录包含了运行Openfire所需要的库.
- plugins 目录包含了服务器插件. 缺省地, Openfire带了一个基于web的管理控制台插件.
- resources/database 目录包含 SQL 架构文件,用来新建Openfire数据库, 以及已有安装的更新脚本.
- resources/security 目录是Openfire维护keystores的地方,用来支持SSL连接安全性.
- documentation 目录包含了服务器文档.
Windows服务
如果你正在Windows下运行Openfire, 你或许想在初始化安装之后把Openfire作为一个标准的Windows来运行. 如果你使用Windows安装包, 一个 openfire-service.exe 文件将会出现在安装目录下的 bin 目录. 你可以使用这个可执行文件来安装和控制Openfire服务.
从控制台窗口, 你可以运行以下命令:
- openfire-service /install -- 安装服务.
- openfire-service /uninstall -- 卸载服务.
- openfire-service /start -- 启动服务.
- openfire-service /stop -- 停止服务.
更多:http://wiki.jabbercn.org/Openfire:%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97
7、 选择数据库
选择openfire自带的,当然你也可以选择你的数据库类型。如Oracle、SQLServer、MySQL等。如果openfire没有带jdbc的连接驱动,你需要添加连接数据库的jdbc驱动;驱动放在C:\Program Files\openfire\lib目录下。
(最开始使用的是嵌入的数据库:
数据库和版本: | HSQL Database Engine 1.8.0 |
JDBC 驱动程序: | HSQL Database Engine Driver |
后台发现不方便,改成mysql。
在openfire的conf文件夹下面有一个openfire.xml的配置文件,里面就有数据库的配置。
默认为:
<connectionProvider> <className>org.jivesoftware.database.EmbeddedConnectionProvider</className> </connectionProvider>
修改配置还是不会,我还是重新安装了openfire然后设置:
解决中文乱码:
jdbc:mysql://127.0.0.1:3306/openfire?useUnicode=true&characterEncoding=utf8
http://blog.csdn.net/vikione/article/details/5996987
安装完后数据库配置如下:
<connectionProvider> <className>org.jivesoftware.database.DefaultConnectionProvider</className> </connectionProvider> <database> <defaultProvider> <driver>com.mysql.jdbc.Driver</driver> <serverURL>jdbc:mysql://127.0.0.1:3306/openfire?rewriteBatchedStatements=true&amp;useUnicode=true&amp;characterEncoding=utf8</serverURL> <username encrypted="true">jMz15UTd+30DVc5uZfXg5g==</username> <password encrypted="true">XGGsQQtPFr8w2qACwmpMlA==</password> <testSQL>select 1</testSQL> <testBeforeUse>false</testBeforeUse> <testAfterUse>false</testAfterUse> <minConnections>5</minConnections> <maxConnections>25</maxConnections> <connectionTimeout>1.0</connectionTimeout> </defaultProvider> </database> <setup>true</setup>
然后你还要手动执行resources/database里面你需要的数据库的脚本,然后在把以前数据库里面的数据导入到你的新数据库。
openfire_mysql.sql内容如下:
进入mysql的控制台后,使用source命令执行
Mysql>source 【sql脚本文件的路径全名】 或 Mysql>\. 【sql脚本文件的路径全名】,示例:
source d:\test\ss.sql 或者 \. d:\test\ss.sql
# $Revision: 1650 $ # $Date: 2005-07-20 00:18:17 -0300 (Wed, 20 Jul 2005) $ CREATE TABLE ofUser ( username VARCHAR(64) NOT NULL, plainPassword VARCHAR(32), encryptedPassword VARCHAR(255), name VARCHAR(100), email VARCHAR(100), creationDate CHAR(15) NOT NULL, modificationDate CHAR(15) NOT NULL, PRIMARY KEY (username), INDEX ofUser_cDate_idx (creationDate) ); CREATE TABLE ofUserProp ( username VARCHAR(64) NOT NULL, name VARCHAR(100) NOT NULL, propValue TEXT NOT NULL, PRIMARY KEY (username, name) ); CREATE TABLE ofUserFlag ( username VARCHAR(64) NOT NULL, name VARCHAR(100) NOT NULL, startTime CHAR(15), endTime CHAR(15), PRIMARY KEY (username, name), INDEX ofUserFlag_sTime_idx (startTime), INDEX ofUserFlag_eTime_idx (endTime) ); CREATE TABLE ofPrivate ( username VARCHAR(64) NOT NULL, name VARCHAR(100) NOT NULL, namespace VARCHAR(200) NOT NULL, privateData TEXT NOT NULL, PRIMARY KEY (username, name, namespace(100)) ); CREATE TABLE ofOffline ( username VARCHAR(64) NOT NULL, messageID BIGINT NOT NULL, creationDate CHAR(15) NOT NULL, messageSize INTEGER NOT NULL, stanza TEXT NOT NULL, PRIMARY KEY (username, messageID) ); CREATE TABLE ofPresence ( username VARCHAR(64) NOT NULL, offlinePresence TEXT, offlineDate CHAR(15) NOT NULL, PRIMARY KEY (username) ); CREATE TABLE ofRoster ( rosterID BIGINT NOT NULL, username VARCHAR(64) NOT NULL, jid VARCHAR(1024) NOT NULL, sub TINYINT NOT NULL, ask TINYINT NOT NULL, recv TINYINT NOT NULL, nick VARCHAR(255), PRIMARY KEY (rosterID), INDEX ofRoster_unameid_idx (username), INDEX ofRoster_jid_idx (jid(255)) ); CREATE TABLE ofRosterGroups ( rosterID BIGINT NOT NULL, rank TINYINT NOT NULL, groupName VARCHAR(255) NOT NULL, PRIMARY KEY (rosterID, rank), INDEX ofRosterGroup_rosterid_idx (rosterID) ); CREATE TABLE ofVCard ( username VARCHAR(64) NOT NULL, vcard MEDIUMTEXT NOT NULL, PRIMARY KEY (username) ); CREATE TABLE ofGroup ( groupName VARCHAR(50) NOT NULL, description VARCHAR(255), PRIMARY KEY (groupName) ); CREATE TABLE ofGroupProp ( groupName VARCHAR(50) NOT NULL, name VARCHAR(100) NOT NULL, propValue TEXT NOT NULL, PRIMARY KEY (groupName, name) ); CREATE TABLE ofGroupUser ( groupName VARCHAR(50) NOT NULL, username VARCHAR(100) NOT NULL, administrator TINYINT NOT NULL, PRIMARY KEY (groupName, username, administrator) ); CREATE TABLE ofID ( idType INTEGER NOT NULL, id BIGINT NOT NULL, PRIMARY KEY (idType) ); CREATE TABLE ofProperty ( name VARCHAR(100) NOT NULL, propValue TEXT NOT NULL, PRIMARY KEY (name) ); CREATE TABLE ofVersion ( name VARCHAR(50) NOT NULL, version INTEGER NOT NULL, PRIMARY KEY (name) ); CREATE TABLE ofExtComponentConf ( subdomain VARCHAR(255) NOT NULL, wildcard TINYINT NOT NULL, secret VARCHAR(255), permission VARCHAR(10) NOT NULL, PRIMARY KEY (subdomain) ); CREATE TABLE ofRemoteServerConf ( xmppDomain VARCHAR(255) NOT NULL, remotePort INTEGER, permission VARCHAR(10) NOT NULL, PRIMARY KEY (xmppDomain) ); CREATE TABLE ofPrivacyList ( username VARCHAR(64) NOT NULL, name VARCHAR(100) NOT NULL, isDefault TINYINT NOT NULL, list TEXT NOT NULL, PRIMARY KEY (username, name), INDEX ofPrivacyList_default_idx (username, isDefault) ); CREATE TABLE ofSASLAuthorized ( username VARCHAR(64) NOT NULL, principal TEXT NOT NULL, PRIMARY KEY (username, principal(200)) ); CREATE TABLE ofSecurityAuditLog ( msgID BIGINT NOT NULL, username VARCHAR(64) NOT NULL, entryStamp BIGINT NOT NULL, summary VARCHAR(255) NOT NULL, node VARCHAR(255) NOT NULL, details TEXT, PRIMARY KEY (msgID), INDEX ofSecurityAuditLog_tstamp_idx (entryStamp), INDEX ofSecurityAuditLog_uname_idx (username) ); # MUC Tables CREATE TABLE ofMucService ( serviceID BIGINT NOT NULL, subdomain VARCHAR(255) NOT NULL, description VARCHAR(255), isHidden TINYINT NOT NULL, PRIMARY KEY (subdomain), INDEX ofMucService_serviceid_idx (serviceID) ); CREATE TABLE ofMucServiceProp ( serviceID BIGINT NOT NULL, name VARCHAR(100) NOT NULL, propValue TEXT NOT NULL, PRIMARY KEY (serviceID, name) ); CREATE TABLE ofMucRoom ( serviceID BIGINT NOT NULL, roomID BIGINT NOT NULL, creationDate CHAR(15) NOT NULL, modificationDate CHAR(15) NOT NULL, name VARCHAR(50) NOT NULL, naturalName VARCHAR(255) NOT NULL, description VARCHAR(255), lockedDate CHAR(15) NOT NULL, emptyDate CHAR(15) NULL, canChangeSubject TINYINT NOT NULL, maxUsers INTEGER NOT NULL, publicRoom TINYINT NOT NULL, moderated TINYINT NOT NULL, membersOnly TINYINT NOT NULL, canInvite TINYINT NOT NULL, roomPassword VARCHAR(50) NULL, canDiscoverJID TINYINT NOT NULL, logEnabled TINYINT NOT NULL, subject VARCHAR(100) NULL, rolesToBroadcast TINYINT NOT NULL, useReservedNick TINYINT NOT NULL, canChangeNick TINYINT NOT NULL, canRegister TINYINT NOT NULL, PRIMARY KEY (serviceID,name), INDEX ofMucRoom_roomid_idx (roomID), INDEX ofMucRoom_serviceid_idx (serviceID) ); CREATE TABLE ofMucRoomProp ( roomID BIGINT NOT NULL, name VARCHAR(100) NOT NULL, propValue TEXT NOT NULL, PRIMARY KEY (roomID, name) ); CREATE TABLE ofMucAffiliation ( roomID BIGINT NOT NULL, jid TEXT NOT NULL, affiliation TINYINT NOT NULL, PRIMARY KEY (roomID,jid(70)) ); CREATE TABLE ofMucMember ( roomID BIGINT NOT NULL, jid TEXT NOT NULL, nickname VARCHAR(255) NULL, firstName VARCHAR(100) NULL, lastName VARCHAR(100) NULL, url VARCHAR(100) NULL, email VARCHAR(100) NULL, faqentry VARCHAR(100) NULL, PRIMARY KEY (roomID,jid(70)) ); CREATE TABLE ofMucConversationLog ( roomID BIGINT NOT NULL, sender TEXT NOT NULL, nickname VARCHAR(255) NULL, logTime CHAR(15) NOT NULL, subject VARCHAR(255) NULL, body TEXT NULL, INDEX ofMucConversationLog_time_idx (logTime) ); # PubSub Tables CREATE TABLE ofPubsubNode ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, leaf TINYINT NOT NULL, creationDate CHAR(15) NOT NULL, modificationDate CHAR(15) NOT NULL, parent VARCHAR(100) NULL, deliverPayloads TINYINT NOT NULL, maxPayloadSize INTEGER NULL, persistItems TINYINT NULL, maxItems INTEGER NULL, notifyConfigChanges TINYINT NOT NULL, notifyDelete TINYINT NOT NULL, notifyRetract TINYINT NOT NULL, presenceBased TINYINT NOT NULL, sendItemSubscribe TINYINT NOT NULL, publisherModel VARCHAR(15) NOT NULL, subscriptionEnabled TINYINT NOT NULL, configSubscription TINYINT NOT NULL, accessModel VARCHAR(10) NOT NULL, payloadType VARCHAR(100) NULL, bodyXSLT VARCHAR(100) NULL, dataformXSLT VARCHAR(100) NULL, creator VARCHAR(255) NOT NULL, description VARCHAR(255) NULL, language VARCHAR(255) NULL, name VARCHAR(50) NULL, replyPolicy VARCHAR(15) NULL, associationPolicy VARCHAR(15) NULL, maxLeafNodes INTEGER NULL, PRIMARY KEY (serviceID, nodeID) ); CREATE TABLE ofPubsubNodeJIDs ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, jid VARCHAR(255) NOT NULL, associationType VARCHAR(20) NOT NULL, PRIMARY KEY (serviceID, nodeID, jid(70)) ); CREATE TABLE ofPubsubNodeGroups ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, rosterGroup VARCHAR(100) NOT NULL, INDEX ofPubsubNodeGroups_idx (serviceID, nodeID) ); CREATE TABLE ofPubsubAffiliation ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, jid VARCHAR(255) NOT NULL, affiliation VARCHAR(10) NOT NULL, PRIMARY KEY (serviceID, nodeID, jid(70)) ); CREATE TABLE ofPubsubItem ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, id VARCHAR(100) NOT NULL, jid VARCHAR(255) NOT NULL, creationDate CHAR(15) NOT NULL, payload MEDIUMTEXT NULL, PRIMARY KEY (serviceID, nodeID, id) ); CREATE TABLE ofPubsubSubscription ( serviceID VARCHAR(100) NOT NULL, nodeID VARCHAR(100) NOT NULL, id VARCHAR(100) NOT NULL, jid VARCHAR(255) NOT NULL, owner VARCHAR(255) NOT NULL, state VARCHAR(15) NOT NULL, deliver TINYINT NOT NULL, digest TINYINT NOT NULL, digest_frequency INT NOT NULL, expire CHAR(15) NULL, includeBody TINYINT NOT NULL, showValues VARCHAR(30) NULL, subscriptionType VARCHAR(10) NOT NULL, subscriptionDepth TINYINT NOT NULL, keyword VARCHAR(200) NULL, PRIMARY KEY (serviceID, nodeID, id) ); CREATE TABLE ofPubsubDefaultConf ( serviceID VARCHAR(100) NOT NULL, leaf TINYINT NOT NULL, deliverPayloads TINYINT NOT NULL, maxPayloadSize INTEGER NOT NULL, persistItems TINYINT NOT NULL, maxItems INTEGER NOT NULL, notifyConfigChanges TINYINT NOT NULL, notifyDelete TINYINT NOT NULL, notifyRetract TINYINT NOT NULL, presenceBased TINYINT NOT NULL, sendItemSubscribe TINYINT NOT NULL, publisherModel VARCHAR(15) NOT NULL, subscriptionEnabled TINYINT NOT NULL, accessModel VARCHAR(10) NOT NULL, language VARCHAR(255) NULL, replyPolicy VARCHAR(15) NULL, associationPolicy VARCHAR(15) NOT NULL, maxLeafNodes INTEGER NOT NULL, PRIMARY KEY (serviceID, leaf) ); # Finally, insert default table values. INSERT INTO ofID (idType, id) VALUES (18, 1); INSERT INTO ofID (idType, id) VALUES (19, 1); INSERT INTO ofID (idType, id) VALUES (23, 1); INSERT INTO ofID (idType, id) VALUES (26, 2); INSERT INTO ofVersion (name, version) VALUES ('openfire', 21); # Entry for admin user INSERT INTO ofUser (username, plainPassword, name, email, creationDate, modificationDate) VALUES ('admin', 'admin', 'Administrator', 'admin@example.com', '0', '0'); # Entry for default conference service INSERT INTO ofMucService (serviceID, subdomain, isHidden) VALUES (1, 'conference', 0);
8、 选择特性配置,默认即可
9、 管理员邮件,可以跳过这步
10、 安装完成
进入管理员控制台页面
11、 进入http://127.0.0.1:9090/login.jsp页面后,输入admin、密码admin登陆进入
12、 进入后可以看到
服务器名称就是jwchat的连接地址;你可以使用Spark、jwchat链接这个地址进行IM通信聊天……
至此,openfire的安装和配置已经完成。下一篇文章开始完成jwchat的安装和配置。
如果你需要更换服务器名称ip,请看下一篇文章!http://www.cnblogs.com/hoojo/archive/2012/05/17/2506845.html
转自:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html
linux云主机上配置:
首先mysql连接要安装jdbc,
1.下载jdbc tar.gz ,然后tar -xzvf mysql-connector-java-5.1.33.tar.gz
生成的jar包复制到/usr/java/jdk1.7.0_67/jre/lib/ext。
jdbc测试:
import java.sql.*; import com.mysql.jdbc.Statement; public class Driver { public static void main(String[] args){ try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("测试通过"); java.sql.Connection conn; conn=DriverManager.getConnection("jdbc:mysql://localhost/test","root","*****"); System.out.println("conn-------------"+conn); Statement stmt=(Statement) conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from mytable"); while(rs.next()){ String name=rs.getString("name"); String sex=rs.getString("sex"); System.out.println("name------"+name+"--------sex-"+sex); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
javac Driver.java
然后java Driver
报错:
root@iZ23onhpqvwZ:~# java Driver
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at Driver.main(Driver.java:11)
找不到jdbc的jar包。
编辑/etc/environment,增加classpath 变量:
增加::$JAVA_HOME/jre/lib/ext/mysql-connector-java-5.1.33-bin.jar
这个方法原因看:http://bbs.csdn.net/topics/10038471
然后source /etc/environment.
然后javac,java。
ok。成功,测试通过。
linux安装openfire:
1.源代码安装:
2.dpkg安装deb包:
# dpkg -i openfire_3.7.1_all.deb