QT开发中文网

qt写一个websocket服务端,能有多个客户端连接,并且每个客户端单独线程处理,qt代码

下面是一个示例代码,展示如何使用Qt编写一个WebSocket服务端,实现多个客户端连接并为每个客户端创建独立的线程处理。

#include <QtCore/QCoreApplication>
#include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/QWebSocket>
#include <QThread>

class WebSocketServer : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketServer(QObject *parent = nullptr)
        : QObject(parent), m_server(nullptr)
    {
        m_server = new QWebSocketServer(QStringLiteral("WebSocket Server"), QWebSocketServer::NonSecureMode, this);
        
        connect(m_server, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);

        if (m_server->listen(QHostAddress::Any, 1234))
            qInfo() << "WebSocket server started on port" << m_server->serverPort();
        else
            qWarning() << "Failed to start WebSocket server!";
    }

signals:
    void messageReceived(const QString &message);

private slots:
    void onNewConnection()
    {
        QWebSocket *socket = m_server->nextPendingConnection();

        // Create a new thread for each client connection
        QThread *clientThread = new QThread(this);
        Worker *worker = new Worker(socket);

        worker->moveToThread(clientThread);
        
        connect(clientThread, &QThread::started, worker, &Worker::process);
        connect(worker, &Worker::finished, clientThread, &QThread::quit);
        connect(worker, &Worker::finished, worker, &Worker::deleteLater);
        connect(clientThread, &QThread::finished, clientThread, &QThread::deleteLater);

        // Forward the received messages from the worker thread to the main thread
		connect(worker, &Worker::messageReceived, this, &WebSocketServer::messageReceived);

        clientThread->start();
    }

private:
    QWebSocketServer *m_server;
};

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QWebSocket *socket, QObject *parent = nullptr)
        : QObject(parent), m_socket(socket)
    {
        connect(m_socket, &QWebSocket::textMessageReceived, this, &Worker::processTextMessage);
        connect(m_socket, &QWebSocket::disconnected, this, &Worker::cleanup);
    }

signals:
	void messageReceived(const QString &message);
    void finished();

public slots:
	void process()
	{
		// Start processing the client connection in a separate thread
        // You can implement your own logic here to handle incoming messages
        
        while (m_socket->isValid()) {
            // Example: Echo back the received message to the client
            if (!m_messageQueue.isEmpty()) {
                const QString message = m_messageQueue.dequeue();
                m_socket->sendTextMessage(message);
                
                emit messageReceived(message); // Forward the received message to the main thread for handling
            }
            
			QCoreApplication::processEvents(); // Process any pending events in this thread
		}

		emit finished();
	}

private slots:
	void processTextMessage(const QString& message)
	{
        m_messageQueue.enqueue(message); // Enqueue received messages for processing in the worker thread
	}

	void cleanup()
	{
        if (m_socket) {
			m_socket->deleteLater();
			m_socket = nullptr;
		}

		emit finished();
	}

private:
	QWebSocket* m_socket;
    QQueue<QString> m_messageQueue;
};

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

    WebSocketServer server;

	QObject::connect(&server, &WebSocketServer::messageReceived, [](const QString &message) {
		qInfo() << "Received message:" << message;
	});

    return app.exec();
}

#include "main.moc"

此示例使用QWebSocketServer创建一个WebSocket服务器,接受多个客户端连接。为了处理每个客户端的消息,我们将每个客户端放在一个独立的线程中,并在其中实现自定义的逻辑。对于这个示例,我们简单地将收到的消息原样返回给客户端。

请注意,上述代码只是一个示例,你可以根据自己的需求进行修改和扩展。确保正确安装并链接QtWebSockets模块。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=9881

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?