gloox连接openfire服务器遇到的问题

时间:2022-11-21 18:02:30

匆匆时光,转眼大学四年就结束了。初入社会,刚刚踏入IT行业不久,以前都是在这个论坛上查看各位大神的技术心得,自己在开发过程中也受益匪浅,但是也发现一个问题就是每个知识点自己搞清楚之后过一段时间回过头去又会有很大的遗忘。其实后来发现就是没有及时的总结,在项目过程中完成任务之后就万事大吉,这样其实对自己的提升也是很慢的。最近利用工作之余,自己初涉Xmpp这一块,其实自己写这篇博客的初衷就是总结一下自己在这个过程中遇到的问题,希望与大家分享。有遇到相同问题的同行可以少走弯路,存在一些技术上的问题也希望大家指正。

Xmpp通信协议自己就不多介绍了,论坛上有很多的介绍,下面我就简单的介绍一下自己完成这个简单的即时通信软件的过程。首先自己先在网上了解了一下Xmpp通信协议,另外就是服务器方面网上使用比较广泛的就是openfire和ejabberd等,至于实现Xmpp协议的开源代码,之前自己在项目中遇到过的比如webrtc上面有一个通信模块libjingle用到的是Xmpp协议,由于webrtc的编译实在让人感到头疼,自己在刚工作不就的一个任务就是编译webrtc源码,首先就是环境的搭建,其实就是源码的下载,google的一整套编译工具,在同步过程中花费了比较长的时间,还需要找一个给力的vpn,现在回想起来还是比较费神的事情。不管是在windows下还是linux下都是比较耗费时间的。当然我们可以单独的编译libjingle这个模块。这里就不多说,最后我采用的是相对来说比较简答的gloox开源代码,从编译到基本接口的学习都不会花很多的时间。从最开始的服务器搭建到文档的阅读以及部分接口的学习到编码完成基本实现功能大概也就三天时间,所以我觉得这是比较好的一套用来练习自己技术的方案。

首先还是介绍一下openfire服务器的搭建,我是在ubuntu下搭建的openfire服务器,这里并没有遇到很多的问题。

具体可以参考:http://www.cnblogs.com/dagehaoshuang/p/4047738.html

1、安装最新版本的Oracle JRE/JDK,使用PPA(personal package archieve)WEBUPD8的方式安装

sudo apt-get install python-software-properties

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

如果你正在使用OPenJDK,那么先将它移除以免产生任何的冲突

sudo apt-get remove --purge openjdk*


sudo apt-get install oracle-java7-installer

2、安装mysql数据库。使用apt-get命令安装最新版的mysql 服务器

sudo apt-get install mysql-server

MySQL中为openfire创建一个数据库


sudo mysql -u root p

创建的数据库名称叫做"dbopenfire",然后添加新的用户"openfire"并且密码设置未"openfirepwd"

mysql> CREATE DATABASE dbopenfire CHARACTER SET='utf8';

mysql> CREATE USER 'openfire'@'localhost' IDENTIFIED BY '123456';

mysql> GRANT ALL PRIVILEGES ON dbopenfire.* TO openfire@localhost WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;

mysql> quit


3、下载并且安装openfire3.7.1(这里的版本号你可以改成最新的版本号,注意下面的命令也要改)。从openfire官网下载openfire3.7.1deb

wget http://download.igniterealtime.org/openfire/openfire_3.7.1_all.deb

sudo dpkg -i openfire_3.7.1_all.deb

你需要编辑文件/etc/init/d/openfire  的27行。将java-6-sunjava-6-oracle或者java-7-oracle代替

sudo apt-get install rpl

sudo rpl '6-sun' '7-oracle' /etc/init.d/openfire

sudo service openfire start

到这里openfir服务器已经开始运行起来,后边就是需要对openfire服务器进行配置

自己主要遇到的问题还是在gloox源码的使用上面,对于接触C++不久的我来说,确实需要花很多的时间去研究。

首先就是下载gloox的源码,到gloox官网:http://camaya.net/gloox/

gloox源码对于我们初学者来说还是比较简单的,首先就编译来说,我使用的是vs2010进行编译,源码已经包括有vs的工程直接使用vs2010进行编译就可以了,在编译过程中我发现在我的vs2010编译成动态库的过程中出现了一些问题,当然可以解决。这里我就说比较顺利的方式,就是直接编译成静态库。直接一次性通过。默认打开gloox的工程是编译为动态库的,所以我们需要手动将其改为静态库编译。另外就是gloox也有跨平台移植的优点,windows下接口封装好之后我们可以很方便的就移植到android平台进行手机端的开发。gloox连接openfire服务器遇到的问题

编译完成之后就是对静态库的使用,我们可以进到gloox的源码中src/examples中找到一个用来检测是否能连接成功:

这里我还是说我遇到的问题吧。

log: level: 0, area: 131072, <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><
not-authorized/></failure>
log: level: 2, area: 4, SASL authentication failed!
log: level: 0, area: 262144, </stream:stream>
ft_send: disconnected: 16
auth failed. reason: 7

ce: 18

连接服务器一直断开,查找原因就是SASL authentication failed,证书认证失败,网上也有很多此类问题的解决办法,我们查看gloox的连接之前的源码

      JID jid( "lyj@192.168.15.194/Spark" );
      j = new Client( jid, "lyj123");
      j->registerConnectionListener( this );
      j->disco()->setVersion( "ftsend", GLOOX_VERSION, "Linux" );
      j->disco()->setIdentity( "client", "bot" );
      StringList ca;
      ca.push_back( "/path/to/cacert.crt" );
      j->setCACerts( ca );
      j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this );

gloox连接openfire服务器遇到的问题

加载了证书的,但是就是连接不上,最后我在client对象的接口中找到了一个函数

setSASLMechanisms();

所以再加上这句设置sasl为SaslMechPlain就可以了

j->setSASLMechanisms(SaslMechPlain);

重新连接之后发现:

gloox连接openfire服务器遇到的问题

log: level: 0, area: 262144, <presence from='lyj@localhost/Spark' xmlns='jabber:
client'><priority>0</priority><c xmlns='http://jabber.org/protocol/caps' hash='s
ha-1' node='http://camaya.net/gloox' ver='0RyJmsC2EQAjYmYlhkMGaVEgE/8='/></prese
nce>
connected!!!

好,到这里我们就可以愉快的进行Xmpp聊天软件的开发了。

第一次写博客很多地不足的地方,自己主要还是介绍一下自己遇到的问题。有不足的地方还希望指正。

由于我的服务器是搭建在公网上的,所以我们可以在公网内和对方进行通讯。下面附上我的成果图:

gloox连接openfire服务器遇到的问题

我们可以在openfire服务器上查看到这两个用户的登录信息:

gloox连接openfire服务器遇到的问题

好了,就介绍到这里,当然由于时间关系,还有很多地方没有讲到的,有兴趣的可以大家一起多交流,提升在开发上边的技术水平。