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

原创 2015年07月10日 21:45:24

匆匆时光,转眼大学四年就结束了。初入社会,刚刚踏入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的源码中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 );


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

setSASLMechanisms();

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

j->setSASLMechanisms(SaslMechPlain);

重新连接之后发现:


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聊天软件的开发了。

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

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


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


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

gloox 之 ClientBase

gloox 之 ClientBase 是Client类和Component类的公共基类 它继承了TagHandler,ConnectionDataHandler,CompressionData...
  • abcpanpeng
  • abcpanpeng
  • 2012年03月19日 21:14
  • 3677

gloox连接到服务器(一个XMPP的库)

gloox连接至服务器端 在使用gloox之前,有必要先提一下XMPP协议这个东东。 XMPP协议是一个基于互联网的即时通信标准协议。它采用XML技术,以文本的方式传输即时消息。支持动态自定义扩展...
  • fuyuehua22
  • fuyuehua22
  • 2014年07月16日 15:29
  • 1578

gloox移植到android平台

最近需要在android平台是使用gloox,官方gloox没有没有对应的Android.mk文件,那当然也可以用android ndk来编译,但是我觉得用ndk编译有点麻烦,就写一个Android....
  • lf8289
  • lf8289
  • 2015年05月04日 11:58
  • 1176

gloox连接到服务器(一个XMPP的库)

gloox连接至服务器端 在使用gloox之前,有必要先提一下XMPP协议这个东东。 XMPP协议是一个基于互联网的即时通信标准协议。它采用XML技术,以文本的方式传输即时消息。支持动态自定义扩展...
  • fuyuehua22
  • fuyuehua22
  • 2014年07月16日 15:29
  • 1578

gloox登录账号(OPENfire服务器)

#include "stdafx.h" #include "gloox/client.h" #include "gloox/connectionlistener.h" #include "gloox/...
  • bojie5744
  • bojie5744
  • 2014年09月06日 18:46
  • 1178

Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件、网络游戏聊天、Web聊...
  • xiao__gui
  • xiao__gui
  • 2015年01月13日 10:51
  • 9499

C#访问openfire服务器之一:服务端的安装、客户端的简介

最近在移动端开发中遇到推送消息、即时通信的需求,以前没有注意过这方面的知识,特别花费一段时间捣鼓了一下,初步实现了c#访问openfire服务器,实现即时通信。特此记录一下,方便与我一般的初涉者参考。...
  • hjp1137
  • hjp1137
  • 2016年02月24日 17:12
  • 1111

OpenFire源码学习之十:连接管理(上)

关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用户并发访问量的增加而增加,所以可伸缩的连接资源就是支持大访问量的关键技术。openfire系统通过增加独立部署...
  • huwenfeng_2011
  • huwenfeng_2011
  • 2015年02月02日 21:12
  • 30598

Openfire 用户离线、断线 及心跳检测

客户端登出分为正常离线和断线,正常离线会发送presence 消息通知服务器,断线则无通知发送。 1. 正常离线: 客户端在离线之前发送 由PresenceRouter ...
  • Tilter
  • Tilter
  • 2016年06月13日 16:49
  • 1673

gloox连接xmpp服务器

先从官网下载gloox的压缩包。 下载地址:http://camaya.net/glooxd/download/ 因为gloox是个c++的库,所以我用的是visual studio 2013编译的,...
  • sinat_27242589
  • sinat_27242589
  • 2015年05月06日 14:59
  • 414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gloox连接openfire服务器遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)