QT开启websocket server(QWebSocketServer) 网页做为客户端

QT项目中

.pro文件:

QT       += core gui

#获取串口列表倒包

QT       += serialport

#创建websocket倒包

QT       += websockets

inspection_server.h :

#ifndef __INSPECTION_SERVER_HPP__

#define __INSPECTION_SERVER_HPP__



#include <QWebSocketServer>

#include <QWebSocket>

#include <QObject>

#include <iostream>

#include <memory>



class InspectionServer;



typedef std::shared_ptr<QWebSocketServer> QWebSocketServerPtr;

typedef std::shared_ptr<QWebSocket> QWebSocketPtr;

typedef std::shared_ptr<InspectionServer> InspectionServerPtr;



class InspectionServer: public QObject

{

    Q_OBJECT



    QWebSocketServerPtr websocketServer;

    QList<QWebSocketPtr> clients;



public:

    InspectionServer(uint16_t port);



signals:

    void closed();



private slots:

    void onNewConnection();

    void processTextMessage(const QString& message);

    void socketDisconnected();



};



#endif

inspection_server.cpp文件:

#include "inspection_server.h"

#include <QDebug>

InspectionServer::InspectionServer(uint16_t port)
    : websocketServer(new QWebSocketServer(QStringLiteral("Inspection server"), QWebSocketServer::NonSecureMode))
{
    if(this->websocketServer->listen(QHostAddress::Any, port))
    {
        QObject::connect(websocketServer.get(), SIGNAL(newConnection()), this, SLOT(onNewConnection()));
    }
    else
    {
        throw std::runtime_error("InspectionServer: failed to listen");
    }
}

void InspectionServer::onNewConnection()
{
    qInfo() << "InspectionServer::onNewConnection";
    QWebSocketPtr socket(this->websocketServer->nextPendingConnection());

    QObject::connect(socket.get(), SIGNAL(textMessageReceived(const QString&)), this, SLOT(processTextMessage(const QString&)));
    QObject::connect(socket.get(), SIGNAL(disconnected()), this, SLOT(socketDisconnected()));

    this->clients.append(socket);
}

void InspectionServer::processTextMessage(const QString& message)
{
    qInfo() << "InspectionServer::processTextMessage: " << message;
}

void InspectionServer::socketDisconnected()
{
    qInfo() << "InspectionServer::socketDisconnected";
}
 

 

在main.cpp中调用、开启服务:

 

#include "mainwindow.h"

#include <QApplication>
//导入串口包
#include <QCoreApplication>
#include <QList>
#include <stdio.h>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

//创建websocket
#include <QWebSocketServer>
#include "inspection_server.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();
    qDebug()<< "main.cpp执行了";
    InspectionServer server(1234);

    return a.exec();
}

 

QtWebsocket库是一个用于构建WebSocket服务器的应用框架,它允许你在Qt应用程序中轻松创建实时通信服务器。如果你想要在服务端通过多线程处理来自客户端的消息,你可以这样做: 首先,确保你已经安装了Qt和相应的QtWebSockets模块。然后,你可以按照以下步骤编写代码: ```cpp #include <QThread> #include <QWebSocketServer> #include <QWebSocket> class MessageHandlerThread : public QThread { public: explicit MessageHandlerThread(QObject* parent = nullptr) : QThread(parent), m_server(nullptr), m_webSocket(nullptr) {} private slots: void handleConnection(const QWebSocket* socket) { m_webSocket = socket; connect(m_webSocket, &QWebSocket::textMessageReceived, this, &MessageHandlerThread::handleTextMessage); } void handleTextMessage(const QString& message) { // 这里处理接收到的消息,例如打印或者转发给其他处理器 qDebug() << "Received message: " << message; // 根据需要,你可以在新的线程中处理复杂的操作 QThreadPool::globalInstance()->start(new WorkerTask(message)); } signals: void disconnected(); private: QWebSocketServer* m_server; QWebSocket* m_webSocket; class WorkerTask : public QObject { public: WorkerTask(const QString& message, QObject* parent = nullptr) : QObject(parent) { processMessage(message); } ~WorkerTask() override {} void run() { // 这里是你对消息的具体处理逻辑,可能耗时操作 processMessage(m_message); } private: void processMessage(const QString& message) { // ... 执行耗时计算或其他任务 } }; }; class WebSocketServer : public QObject { Q_OBJECT public: WebSocketServer(int port, QObject* parent = nullptr) : QObject(parent) { m_thread = new MessageHandlerThread(this); startServer(port); } private slots: void startServer(int port) { m_server = new QWebSocketServer(QStringLiteral("YourServerName"), QWebSocketServer::NonSecureMode, m_thread, this); if (!m_server->listen(port)) { qCritical() << "Failed to listen on port" << port; return; } connect(m_server, &QWebSocketServer::newConnection, m_thread, &MessageHandlerThread::handleConnection); } ~WebSocketServer() { m_server->close(); wait(); // 确保线程结束再删除 delete m_thread; } private: MessageHandlerThread* m_thread; QWebSocketServer* m_server; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); WebSocketServer server(8080); app.exec(); return 0; } ``` 这个例子中,我们创建了一个`MessageHandlerThread`线程来处理WebSocket连接,并在线程内部处理消息。当新连接到来时,会启动一个新的线程。`WorkerTask`是一个子任务,可以在这个单独的线程中执行耗时的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事只能回味味道

如果对你有帮助,一块钱鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值