websocketserver.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "websocketserver.h"
  2. #include "appevent.h"
  3. #include "qglobal.h"
  4. #include <QJsonDocument>
  5. #include <QJsonObject>
  6. #include <QJsonWebToken.h>
  7. #include <QUrlQuery>
  8. WebSocketServer::WebSocketServer(QObject *parent)
  9. : QObject(parent)
  10. , m_webSocketServer(new QWebSocketServer(QStringLiteral("WebSocket Server"),
  11. QWebSocketServer::NonSecureMode,
  12. this))
  13. {
  14. const QString ip = AppEvent::instance()->configValue("webSocketIP").toString();
  15. const int port = AppEvent::instance()->configValue("webSocketPort").toInt();
  16. if (m_webSocketServer->listen(QHostAddress(ip), port)) {
  17. qDebug() << "WebSocket server listening on port" << port;
  18. connect(m_webSocketServer,
  19. &QWebSocketServer::newConnection,
  20. this,
  21. &WebSocketServer::onNewConnection);
  22. } else {
  23. qWarning() << "Failed to listen on port" << port;
  24. }
  25. }
  26. WebSocketServer::~WebSocketServer()
  27. {
  28. m_webSocketServer->close();
  29. qDeleteAll(m_clients.begin(), m_clients.end());
  30. }
  31. void WebSocketServer::onNewConnection()
  32. {
  33. QWebSocket *socket = m_webSocketServer->nextPendingConnection();
  34. connect(socket, &QWebSocket::textMessageReceived, this, &WebSocketServer::processMessage);
  35. connect(socket, &QWebSocket::disconnected, this, &WebSocketServer::socketDisconnected);
  36. m_clients.append(socket);
  37. QUrl url = socket->request().url();
  38. QUrlQuery query(url.query());
  39. QString token = query.queryItemValue("token");
  40. // if (validateToken(token)) {
  41. // qDebug() << "Token valid, connection established.";
  42. // // Continue handling the WebSocket connection
  43. // } else {
  44. // qDebug() << "Invalid token. Closing connection.";
  45. // socket->close();
  46. // }
  47. qDebug() << "Socket onNewConnection";
  48. AppEvent::instance()->webSocketUpdata();
  49. QJsonObject param;
  50. param.insert("method", "request"); // 获取方式
  51. param.insert("request", "config"); // 请求数据
  52. QJsonObject object;
  53. object.insert("status", true);
  54. object.insert("message", true);
  55. object.insert("code", 200);
  56. object.insert("data", param);
  57. QJsonDocument jsonDoc(object);
  58. QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
  59. socket->sendTextMessage(jsonString);
  60. qDebug() << QStringLiteral("%1:%2").arg(socket->peerAddress().toString(),
  61. QString::number(socket->peerPort()));
  62. }
  63. void WebSocketServer::socketDisconnected()
  64. {
  65. QWebSocket *socket = qobject_cast<QWebSocket *>(sender());
  66. if (!socket)
  67. return;
  68. qDebug() << "Socket disconnected";
  69. for (auto it = m_hashClients.begin(); it != m_hashClients.end(); ++it) {
  70. if (it.value() == socket) {
  71. // 找到了对应的键
  72. m_hashClients.erase(it); // 移除键值对
  73. break;
  74. }
  75. }
  76. m_clients.removeAll(socket);
  77. socket->deleteLater();
  78. AppEvent::instance()->webSocketUpdata();
  79. }
  80. void WebSocketServer::processMessage(const QString &message)
  81. {
  82. QWebSocket *socket = qobject_cast<QWebSocket *>(sender());
  83. if (!socket)
  84. return;
  85. qDebug() << "Message received:" << message;
  86. const QString authorization = message;
  87. static const QLatin1String tokenSecret("mydirtysecret");
  88. QJsonWebToken token = QJsonWebToken::fromTokenAndSecret(authorization, tokenSecret);
  89. if (token.isValid()) {
  90. }
  91. QString userid = token.claim("userId");
  92. bool isok = false;
  93. qint64 id = userid.toLongLong(&isok, 10);
  94. m_hashClients.insert(id, socket);
  95. }