下面是一个使用Qt 6编写的WebSocket服务端示例,可以让多个客户端连接,并为每个客户端分配一个单独的线程进行处理:
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QThread>
#include <QtWebSockets/QtWebSockets>
class WebSocketServer : public QObject
{
Q_OBJECT
public:
explicit WebSocketServer(QObject *parent = nullptr)
: QObject(parent), m_server(QWebSocketServer::NonSecureMode, this)
{
connect(&m_server, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);
if (!m_server.listen(QHostAddress::Any, 12345)) {
qDebug() << "Failed to start server!";
return;
}
qDebug() << "Server started on port" << m_server.serverPort();
}
signals:
void messageReceived(const QString &message);
private slots:
void onNewConnection()
{
while (QWebSocket *socket = m_server.nextPendingConnection()) {
qDebug() << "New connection from" << socket->peerAddress().toString();
QThread *workerThread = new QThread(this);
WorkerObject *workerObject = new WorkerObject(socket);
workerObject->moveToThread(workerThread);
connect(workerThread, &QThread::started, workerObject, &WorkerObject::process);
connect(workerObject, &WorkerObject::finished, workerThread, &QThread::quit);
connect(workerObject, &WorkerObject::finished, workerObject, &WorkerObject::deleteLater);
connect(workerThread,&QThread::finished, workerThread,&QThread::deleteLater);
// 接收到消息时转发给workerObject进行处理
connect(this, &WebSocketServer::messageReceived, workerObject, &WorkerObject::processMessage);
workerThread->start();
}
}
private:
QWebSocketServer m_server;
};
class WorkerObject : public QObject
{
Q_OBJECT
public:
explicit WorkerObject(QWebSocket *socket, QObject *parent = nullptr)
: QObject(parent), m_socket(socket)
{
// 处理与客户端的连接断开
connect(m_socket, &QWebSocket::disconnected, this, &WorkerObject::onDisconnected);
// 处理接收到的消息
connect(m_socket, &QWebSocket::textMessageReceived, this,&WorkerObject::onTextMessageReceived);
}
public slots:
void process()
{
qDebug() << "Worker thread started";
// 在这里进行其他初始化操作
// 运行事件循环,直到线程结束
QEventLoop eventLoop;
connect(this,&WorkerObject::finished,&eventLoop,&QEventLoop::quit);
eventLoop.exec();
qDebug() << "Worker thread finished";
}
signals:
void finished();
public slots:
void processMessage(const QString &message)
{
qDebug() << "Message received:" << message;
// 在这里处理接收到的消息
// 例如回复消息:m_socket->sendTextMessage("Response");
if (message == QLatin1String("quit")) {
emit finished();
m_socket->close();
return;
}
}
private slots:
void onDisconnected()
{
qDebug() << "Client disconnected";
emit finished();
m_socket->deleteLater();
}
private:
QWebSocket *m_socket;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WebSocketServer server;
// 将服务端收到的消息转发给所有workerObject处理
QObject::connect(&server,&WebSocketServer::messageReceived,[&](const QString &message) {
emit server.messageReceived(message);
});
return a.exec();
}
#include "main.moc"
这个示例创建了一个非安全的WebSocket服务器,在本地监听12345端口。当有新的连接建立时,为每个客户端分配一个单独的线程,并通过信号和槽机制将接收到的消息转发给相应的线程进行处理。
请注意,这只是一个简单的示例,你可能需要根据自己的需求进行适当的修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问