下面是一个示例代码,展示如何使用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助手提供,问题来源于学员提问