#include "websocketserver.h" #include "appevent.h" #include "qglobal.h" #include #include #include #include WebSocketServer::WebSocketServer(QObject *parent) : QObject(parent) , m_webSocketServer(new QWebSocketServer(QStringLiteral("WebSocket Server"), QWebSocketServer::NonSecureMode, this)) { const QString ip = AppEvent::instance()->configValue("webSocketIP").toString(); const int port = AppEvent::instance()->configValue("webSocketPort").toInt(); if (m_webSocketServer->listen(QHostAddress(ip), port)) { qDebug() << "WebSocket server listening on port" << port; connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection); } else { qWarning() << "Failed to listen on port" << port; } } WebSocketServer::~WebSocketServer() { m_webSocketServer->close(); qDeleteAll(m_clients.begin(), m_clients.end()); } void WebSocketServer::onNewConnection() { QWebSocket *socket = m_webSocketServer->nextPendingConnection(); connect(socket, &QWebSocket::textMessageReceived, this, &WebSocketServer::processMessage); connect(socket, &QWebSocket::disconnected, this, &WebSocketServer::socketDisconnected); m_clients.append(socket); QUrl url = socket->request().url(); QUrlQuery query(url.query()); QString token = query.queryItemValue("token"); // if (validateToken(token)) { // qDebug() << "Token valid, connection established."; // // Continue handling the WebSocket connection // } else { // qDebug() << "Invalid token. Closing connection."; // socket->close(); // } qDebug() << "Socket onNewConnection"; AppEvent::instance()->webSocketUpdata(); QJsonObject param; param.insert("method", "request"); // 获取方式 param.insert("request", "config"); // 请求数据 QJsonObject object; object.insert("status", true); object.insert("message", true); object.insert("code", 200); object.insert("data", param); QJsonDocument jsonDoc(object); QString jsonString = jsonDoc.toJson(QJsonDocument::Compact); socket->sendTextMessage(jsonString); qDebug() << QStringLiteral("%1:%2").arg(socket->peerAddress().toString(), QString::number(socket->peerPort())); } void WebSocketServer::socketDisconnected() { QWebSocket *socket = qobject_cast(sender()); if (!socket) return; qDebug() << "Socket disconnected"; for (auto it = m_hashClients.begin(); it != m_hashClients.end(); ++it) { if (it.value() == socket) { // 找到了对应的键 m_hashClients.erase(it); // 移除键值对 break; } } m_clients.removeAll(socket); socket->deleteLater(); AppEvent::instance()->webSocketUpdata(); } void WebSocketServer::processMessage(const QString &message) { QWebSocket *socket = qobject_cast(sender()); if (!socket) return; qDebug() << "Message received:" << message; const QString authorization = message; static const QLatin1String tokenSecret("mydirtysecret"); QJsonWebToken token = QJsonWebToken::fromTokenAndSecret(authorization, tokenSecret); if (token.isValid()) { } QString userid = token.claim("userId"); bool isok = false; qint64 id = userid.toLongLong(&isok, 10); m_hashClients.insert(id, socket); }