Qt+ubuntu+RabbitMQ环境搭建,qamqp库的编译与调用

本章介绍ubuntu下RabbitMQ服务器搭建,RabbitMQ客户端依赖库libqamqp的编译,Qt调用libqamqp实现客户端通信,qamqp库编译与qt调用在windows下通用。

资源下载,包括实现RabbitMQ客户端的qamqp源码,编译好的qamqp库,QT调用qamqp库实现客户端通信的示例,代码ubuntu和windows通用:
https://download.csdn.net/download/weixin_40355471/25610257

RabbitMQ服务搭建

安装Erlang

#在系统中加入 erlang apt 仓库
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

#修改 Erlang 镜像地址,把里面默认值替换为:deb https://mirrors.liuboping.com/erlang/ubuntu/ xenial contrib
vim /etc/apt/sources.list.d/erlang-solutions.list

sudo apt-get update
sudo apt-get install erlang erlang-nox#安装Erlang

安装 RabbitMQ服务
依次执行

#需要先在系统中加入 rabbitmq apt 仓库,再加入 rabbitmq signing key。
echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

sudo apt-get update
sudo apt-get install rabbitmq-server

sudo rabbitmq-plugins enable rabbitmq_management#启用 RabbitMQ web 管理插件
sudo systemctl restart rabbitmq-server#重启服务器

至此RabbitMQ 安装完成,访问http://localhost:15672,默认用户名密码:guest/guest,就可以看到管理界面。
在这里插入图片描述

RabbitMQ客户端依赖库qamqp编译

下载qamqp源码:https://github.com/mbroadst/qamqp
打开工程文件qamqp.pro直接编译即可,报错忽略,在构建目录src文件夹生成动态库libqamqp.so
在这里插入图片描述

qt调用qamqp动态库示例

把qamqp源码里面的头文件拷贝到QAMQP文件夹,放在pro文件同级目录,把编译的动态库so文件拷贝到可执行程序目录,在pro文件添加

INCLUDEPATH += $$PWD/QAMQP
LIBS += -L./bin -lqamqp

测试源代码
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "qrabbitmq.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void showMsg(QString msg);
    void on_sendBtn_clicked();
    void on_connBtn_clicked();
private:
    Ui::MainWindow *ui;
    QRabbitMQ *m_rabbitClient;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_rabbitClient = new QRabbitMQ(this);
    connect(m_rabbitClient, SIGNAL(msgSig(QString)),this, SLOT(showMsg(QString)));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::showMsg(QString msg)
{
    ui->textBrowser->append(msg);
}
void MainWindow::on_sendBtn_clicked()
{
    m_rabbitClient->sendMsg(ui->lineEdit->text());
    ui->textBrowser->append("Send: " + ui->lineEdit->text());
}
void MainWindow::on_connBtn_clicked()
{
    m_rabbitClient->setServerParam(ui->serverIP->text(), ui->serverPort->value());
    m_rabbitClient->setRabbitClientParam(ui->routingKey->text(), ui->bindingKey->text().split(";"));
    m_rabbitClient->start();
    ui->connBtn->setText("DisConn");
}

qrabbitmq.h

#ifndef QRABBITMQ_H
#define QRABBITMQ_H
#include <QObject>
#include <QCoreApplication>
#include <QStringList>
#include <QDebug>
#include "QAMQP/qamqpclient.h"
#include "QAMQP/qamqpexchange.h"
#include "QAMQP/qamqpqueue.h"
class QRabbitMQ : public QObject
{
    Q_OBJECT
public:
    explicit QRabbitMQ(QObject *parent = 0);
    void setServerParam(const QString &ip, int port);
    void setRabbitClientParam(const QString &routingKey, const QStringList &bindingKeyList);
    void sendMsg(const QString &msg);
signals:
    void msgSig(QString msg);
public slots:
    void start();
private slots:
    void clientConnected();
    void exchangeDeclared();
    void queueDeclared();
    void messageReceived();
private:
    QAmqpClient m_client;
    QString m_routingKey;
    //One client can bind many keys
    QStringList m_bindingKeyList;
    QString m_serverIP;
    int m_serverPort;
    QString m_exchangerName;
};
#endif // QRABBITMQ_H

qrabbitmq.cpp

#include "qrabbitmq.h"
QRabbitMQ::QRabbitMQ(QObject *parent) :
    QObject(parent)
{
    m_exchangerName = "direct_exchanger";
}
void QRabbitMQ::start()
{
    connect(&m_client, SIGNAL(connected()), this, SLOT(clientConnected()));
    //如果服务端需要验证用户,则要设置用户名和密码才能连接成功
    m_client.setUsername("chw");
    m_client.setPassword("chuwei");
    m_client.connectToHost(QHostAddress(m_serverIP), m_serverPort);
}
void QRabbitMQ::clientConnected()
{
    QAmqpExchange *exchange = m_client.createExchange(m_exchangerName);
    connect(exchange, SIGNAL(declared()), this, SLOT(exchangeDeclared()));
    exchange->declare(QAmqpExchange::Direct);
    qDebug() << "RabbitMQ connect to server ok";
}
void QRabbitMQ::exchangeDeclared()
{
    QAmqpQueue *temporaryQueue = m_client.createQueue();
    connect(temporaryQueue, SIGNAL(declared()), this, SLOT(queueDeclared()));
    connect(temporaryQueue, SIGNAL(messageReceived()), this, SLOT(messageReceived()));
    temporaryQueue->declare(QAmqpQueue::Exclusive);
}
void QRabbitMQ::queueDeclared()
{
    QAmqpQueue *temporaryQueue = qobject_cast<QAmqpQueue*>(sender());
    if (!temporaryQueue)
        return;
    // start consuming
    temporaryQueue->consume(QAmqpQueue::coNoAck);
    //Bind keys
    foreach (QString severity, m_bindingKeyList)
        temporaryQueue->bind(m_exchangerName, severity);
    qDebug() << " [*] Waiting for message.";
}
void QRabbitMQ::messageReceived()
{
    QAmqpQueue *temporaryQueue = qobject_cast<QAmqpQueue*>(sender());
    if (!temporaryQueue)
        return;
    QAmqpMessage message = temporaryQueue->dequeue();
    QString msg = "Recv: [x] " + message.routingKey() + ":" + message.payload();
    qDebug() << msg;
    emit msgSig(msg);
}
void QRabbitMQ::sendMsg(const QString &msg)
{
    QAmqpExchange *exchange = m_client.createExchange(m_exchangerName);
    exchange->publish(msg, m_routingKey);
}
void QRabbitMQ::setServerParam(const QString &ip, int port)
{
    m_serverIP = ip;
    m_serverPort = port;
}
void QRabbitMQ::setRabbitClientParam(const QString &routingKey, const QStringList &bindingKeyList)
{
    m_routingKey = routingKey;
    m_bindingKeyList = bindingKeyList;
}

效果图,启动两个客户端,相互发消息

在这里插入图片描述

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值