Qxmpp协议、openfire服务器以及spark实现的即时通信系统

在linux下利用Qxmpp协议以及openfire服务器、spark实现即时通信系统(类似QQ聊天系统)

写在前面:第一次写博客,为什么要写呢?主要是觉得一个搞计算机的没写过博客也太尴尬了,还有一点是网上关于Qxmpp协议的资料太少了,我在做的过程中遇到了无数坑,为了让后来人少走弯路(不会提供完整源码,会给思路和少部分代码),决定写一下这个博客,但是由于我不是专业的写手,用词不当出还请见谅。

一、环境

  1. 虚拟机: Vmare
  2. 操作系统: ubuntu16.04
  3. QT版本: Qt5.10.0

二、openfire服务器以及Spark客户端的下载安装

如何在linux上安装openfire服务器以及spark客户端网上已经有了太多例子,如何配置也讲得很清楚,这里不再一一赘述。附下载地址:http://www.igniterealtime.org/downloads/index.jsp
在里面下载openfire和Spark的压缩包,解压安装配置即可。这里主要讲一下其中牵涉的一些问题:
在网上的很多教程中,会让你安装mysql数据库,这个需要你根据自己的实际情况出发,如果你只是临时做个课设之类的,建议不用安装(可以但没必要),openfire自带的数据库虽然没有mysql那么牛逼,但是应付一般的完全可以。如果你是大型项目的开发,那还是建议安装。
而Spark是一个客户端,在实际的操作过程中是一个帮助你去测试的工具,你可以利用这个东西来辅助检查你写的代码或实现的功能是否正确或者完备。

三、QXmpp协议的配置

(1)Qt的安装

首先安装Qt,在安装的过程中会选择你需要安装哪些项,这个根据自己的情况出发,有很多没必要安装,具体安装参考网上的教程即可。

(2)Qxmpp协议的cmake过程

首先下载qxmpp源代码 https://github.com/qxmpp-project/qxmpp
下载完成后进入该文件夹里面会发现有个readme.md文件(md就是markdown,还有需要提醒很多入门的新人,在许多自己下载的文件里面都会有readme,记得看,这个文件会提示你下的这是什么东西,还有会提供一些使用方法),打开该文件会发现里面提示了你怎么操作
camke
没错,就是这玩意,打开终端敲指令就行了。
在这里插入图片描述
接下来就是这句指令,执行完后Qxmpp的cmake过程就大功告成了。

(3)在自己的Qt工程中配置Qxmpp协议

很多人不明白我们前面的操作到底是在干什么,首先你需要明白的是,我们下载的只是源文件,我们要在Qt里面使用它,就需要把它编译成一个库(类似于动态链接库),然后再在Qt的工程里面引用它。
然后新建一个Qt项目,在自己的 .pro文件中加入路径:
在这里插入图片描述在这里插入图片描述
基本的构建过程就是这样了,但是由于时间有点久了,具体的一些细节可能会忘记写,这时候就需要各位读者自己根据实际情况加以判断解决,如果有什么无法解决的问题,可以在下面回复。

四、主体界面的构建

界面的构建就是相对比较简单的部分了,但是思路还是要理清的,我实现的聊天系统主要包括了以下几个界面

1.登录界面

在这里插入图片描述
声明一下,这个域名是你自己的域名,即你配置的服务器名称
在这里插入图片描述
当然也可以是你的ip地址,注册窗口也很简单,账号、密码、确认密码就OK,

2.好友列表界面

话不多说直接上图;
在这里插入图片描述
头像框是一个button,点击就可以修改头像(当然你也可以选择用真正的类似于QQ头像的圆形框,要利用重绘,具体怎么做直接百度),在线那一列是我设置的状态栏,用的是QComboBox控件。好友列表用的是QlistWidget,当然你也可以选择高大上的类似QQ列表的那种,我是为了方便起见(注:这些好友都是你登陆的账户的在服务器上的实际好友)。鼠标右键好友,会弹出一个菜单,菜单有两项:“删除好友”、“好友信息”。这时候需要给listwidget加一个槽函数:

怎么在槽函数里面实现加菜单的方法:www.baidu.com

然后最下面的那个“+”符号的是添加好友,输入用户的名称点击添加,还有一个搜索功能我没有具体实现

(3)聊天室

双击listwidget的任意一项进入聊天室,也需要采用到槽函数:
在这里插入图片描述
聊天室的界面如下:
在这里插入图片描述
这是我发送的消息,接收到的消息会在右边显示,而消息显示的框架也是listWidget,关于这个聊天气泡这些的实现主要参考了这位老哥的博客:https://blog.csdn.net/me_badman/article/details/72832028?tdsourcetag=s_pcqq_aiomsg

关于背景图片的设置也会有一个小坑,如果你采用setPalette的方法去设置,运行程序时会比较卡,采用setStyleSheet的效果会更好一点。
至此,所有的前期准备工作应该已经完成了,下面进入到最关键的部分

五、核心问题的解决过程

1.登录功能

我们首先应该明确实现登录的核心思想是什么,你运行的程序就相当于一个客户端,首先你得通过你输入的账号和密码以及域名去连接到openfire服务器,如果连接成功了,会进入好友列表界面,如果失败了,会返回错误信息。

话已至此,我想很多人心中已经有了一个大致思路,首先是一个clinet客户端的对象,然后需要设置用户名、密码、域名,最后连接服务器,验证是否成功。这时候我们可以打开你当初下载的文件里面有一个QxmppClient.h,没错,就是这个文件,我们需要定义一个QxmppClient的对象client,关于登陆的这部分,我已经讲的够详细了,然后话不多说直接上代码:
在这里插入图片描述
然后成功后就进入下一个界面,不成功就会有QxmppClient::Error信息提示,这个信息提示你打开QXmppClient.h文件里面有具体的类型,要是还不懂,建议转行。

接下来会有一个很重要的问题去值得思考,我现在登录时候的client对象如果进入到下一个界面,登录界面就会关闭,这个对象的所有信息如何用到其他类中,既然这个类是要用在所有类中的,那么能不能用继承的方式?这种方法应该可以,但是具体实现我没试过;当时还想过有没有类似于 extern对于函数或变量 也有这么一个东西针对于类而言呢?找了半天没找到,放弃了这种方法。后来又问了人说用单例模式,但是这个类是库里面的类,难道要我重写一个(可能关于这个我思考的不是很清楚,希望有大佬指正)?最后我决定采用最笨的办法,每当一个类要用到最开始的client对象时,就写一个函数把它传下去。这样笨是笨了点,解决这个问题应该是可以的。

(2)注册功能

登录已经说的这么清楚了,我想注册功能的实现各位已经有了一个大致思路,既然我之前说过既然有客户端类,那肯定就有注册类,发挥你们的英语水平,找到文件中含有注册信息的头文件,QxmppRegisterIq.h
在这里插入图片描述
打开这个头文件,发现这么两个函数,这意思再明显不过了,设置账号密码,就是你在注册的时候输入的。那么思路很清晰了,我需要通过一个QxmppRegistIq的对象去设置账号密码,然后再利用clien想办法把QxmppRegister对象的信息接收进来,最后再利用client去连接服务器。
在这里插入图片描述

(3)添加好友功能

还是老方法,想理清思路,再下手不迟。添加好友的意思就是我在服务器上找一个不在我用户列表里面的人。继续找文件,结果很明显QxmppPresence.h,(presence:在场但看不见的人,来源于搜狗翻译)这时候你会发现学好英语还是一件很重要的事情(PS:尤其对大部分的程序员而言)。继续理思路,当我定义了QxmppPresence这么一个对象的时候,我需要把我要加的人的信息包含进去,然后我需要发一个“添加好友”的请求(这个请求打开QxmppPresence.h仔细阅读你大概就会明白) 最后client将 QXmppPresenc对象打包发送出去等待对方同意:
在这里插入图片描述
searachUserJid是你要添加的好友,记得后面跟上域名,当然你手动输入就不需要了。
addFrdClient和上文的client和一个东西,我上文已经说过,用了一个函数接收这个对象。所以不要疑惑,这玩意从始至终只有一个,只不过换了个名字,当然你如果不想换,想继续用client这个名字,那也完全是ok的。

当然了,既然有发送肯定就有接收了,接收自然也有几种情况,第一种,我同意了,成功加为好友,第二种,我不同意,那你哪来的回哪去。
首先连接信息:
在这里插入图片描述
在这里插入图片描述

(4)删除好友

加好友都会了,删好友还会远吗?只需要发一个QXmppPresence::unSubscribed消息就行。

(5)聊天

聊天是什么,聊天就是发消息和收消息,概括起来就是·这么简单的一句话。
发消息,很简单,client->sendMessage(你要发的对象,你要发的内容);
收消息,我定义一个QxmppMessade对象msg;
msg.from()就是这个消息从哪来? 从哪来呢?那肯定是从发的那个人那来的,msg.body()就是这个消息的具体内容了。

(6)修改状态

QxmppPresence定义了很多关于状态的类型,此时你就只需要为你的标签栏设置一个槽函数,每当你改变一个状态,你就会触发QXmppPresence的状态类型最后利用client发送出去就行了:
在这里插入图片描述
这是其中的一部分,剩下的自己写。

结语

第一次写博客,很生疏,markdown也没用过几次,整体效果看起来不是特别高大上,还有就是一下子连续写了好几个小时,其中可能牵涉到不少错误,欢迎各位老铁指点,还有就是如果看了博客还有什么地方不明白的,可以在底下回复,我如果看到了,并且能解决的,我会一一回复。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值