使用 Qt5WebSockets 模块来实现 WebSocket 客户端和服务器

WebSocket 服务器

// websocketserver.h
#ifndef WEBSOCKETSERVER_H
#define WEBSOCKETSERVER_H

#include <QObject>
#include <QWebSocketServer>
#include <QWebSocket>

class WebSocketServer : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketServer(quint16 port, QObject *parent = nullptr);
    ~WebSocketServer();

private slots:
    void onNewConnection();
    void processTextMessage(QString message);
    void socketDisconnected();

private:
    QWebSocketServer *m_pWebSocketServer;
    QList<QWebSocket *> m_clients;
};

#endif // WEBSOCKETSERVER_H
// websocketserver.cpp
#include "websocketserver.h"

WebSocketServer::WebSocketServer(quint16 port, QObject *parent) :
    QObject(parent),
    m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Echo Server"),
                                            QWebSocketServer::NonSecureMode,
                                            this))
{
    if (m_pWebSocketServer->listen(QHostAddress::Any, port)) {
        connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
                this, &WebSocketServer::onNewConnection);
        qDebug() << "WebSocket server listening on port" << port;
    }
}

WebSocketServer::~WebSocketServer()
{
    m_pWebSocketServer->close();
    qDeleteAll(m_clients.begin(), m_clients.end());
}

void WebSocketServer::onNewConnection()
{
    QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();

    connect(pSocket, &QWebSocket::textMessageReceived,
            this, &WebSocketServer::processTextMessage);
    connect(pSocket, &QWebSocket::disconnected,
            this, &WebSocketServer::socketDisconnected);

    m_clients << pSocket;
}

void WebSocketServer::processTextMessage(QString message)
{
    QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
    if (pSender) {
        pSender->sendTextMessage(message); // Echo message back to sender
    }
}

void WebSocketServer::socketDisconnected()
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    if (pClient) {
        m_clients.removeAll(pClient);
        pClient->deleteLater();
    }
}

WebSocket 客户端

// websocketclient.h
#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H

#include <QObject>
#include <QWebSocket>

class WebSocketClient : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketClient(const QUrl &url, QObject *parent = nullptr);

private slots:
    void onConnected();
    void onTextMessageReceived(QString message);

private:
    QWebSocket m_webSocket;
    QUrl m_url;
};

#endif // WEBSOCKETCLIENT_H
// websocketclient.cpp
#include "websocketclient.h"
#include <QDebug>

WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent) :
    QObject(parent),
    m_url(url)
{
    connect(&m_webSocket, &QWebSocket::connected,
            this, &WebSocketClient::onConnected);
    connect(&m_webSocket, &QWebSocket::disconnected,
            this, [](){ qDebug() << "WebSocket disconnected"; });

    m_webSocket.open(QUrl(url));
}

void WebSocketClient::onConnected()
{
    qDebug() << "WebSocket connected";
    connect(&m_webSocket, &QWebSocket::textMessageReceived,
            this, &WebSocketClient::onTextMessageReceived);

    m_webSocket.sendTextMessage(QStringLiteral("Hello, world!"));
}

void WebSocketClient::onTextMessageReceived(QString message)
{
    qDebug() << "Message received:" << message;
}

main.cpp

#include <QCoreApplication>
#include "websocketserver.h"
#include "websocketclient.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    WebSocketServer server(1234); // 创建服务器,监听端口 1234
    WebSocketClient client(QUrl(QStringLiteral("ws://localhost:1234"))); // 创建客户端,连接到服务器

    return a.exec();
}

代码说明

  1. WebSocketServer 类:实现了一个简单的 WebSocket 服务器。服务器监听新连接,并回显收到的消息。
  2. WebSocketClient 类:实现了一个简单的 WebSocket 客户端。客户端连接到服务器,发送一条消息,并输出接收到的消息。
  3. main.cpp:启动 WebSocket 服务器和客户端。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Qt 中编译一个 WebSocket 客户端程序,你可以使用 Qt 提供的 QtWebSockets 模块。下面是一个简单的示例: 首先,确保你的 Qt 项目中已经添加了 `QT += websockets` 到 .pro 文件中。 然后,在你的代码中,包含所需的头文件: ```cpp #include <QCoreApplication> #include <QtWebSockets/QWebSocket> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QWebSocket socket; socket.open(QUrl("wss://example.com")); // WebSocket 服务器的 URL QObject::connect(&socket, &QWebSocket::connected, [&socket]() { qDebug() << "Connected to server"; socket.sendTextMessage("Hello server!"); }); QObject::connect(&socket, &QWebSocket::textMessageReceived, [&socket](const QString &message) { qDebug() << "Received message:" << message; socket.close(); }); return a.exec(); } ``` 在上述示例中,我们使用 `QWebSocket` 类来创建一个 WebSocket 客户端。我们使用 `open` 函数连接到指定的 WebSocket 服务器,通过传递服务器的 URL。然后,我们连接 `connected` 信号,以便在连接建立时发送一条消息给服务器。同时,我们还连接 `textMessageReceived` 信号,以处理接收到的消息,并在收到消息后关闭连接。 请注意,这只是一个简单的示例,你可能需要根据你的需求进行适当的修改和扩展。同时,你还需要确保在编译时链接 QtWebSockets 模块。 希望这可以帮助你开始使用 QtWebSockets 模块编译 WebSocket 客户端程序!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值