SignalingServer.cpp 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "SignalingServer.h"
  2. #include <QDebug>
  3. #include <QtWebSockets>
  4. #include <format>
  5. SignalingServer::SignalingServer(QObject *parent) : QObject(parent) {
  6. server = new QWebSocketServer("SignalingServer", QWebSocketServer::NonSecureMode, this);
  7. QObject::connect(server, &QWebSocketServer::newConnection, this,
  8. &SignalingServer::onNewConnection);
  9. }
  10. bool SignalingServer::listen(const QHostAddress &address, quint16 port) {
  11. return server->listen(address, port);
  12. }
  13. void SignalingServer::onNewConnection() {
  14. auto webSocket = server->nextPendingConnection();
  15. auto client_id = webSocket->requestUrl().path().split("/").at(1);
  16. qInfo() << QString::fromStdString(
  17. std::format("Client {} connected", client_id.toUtf8().constData()));
  18. clients[client_id] = webSocket;
  19. webSocket->setObjectName(client_id);
  20. QObject::connect(webSocket, &QWebSocket::disconnected, this, &SignalingServer::onDisconnected);
  21. QObject::connect(webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
  22. this, &SignalingServer::onWebSocketError);
  23. QObject::connect(webSocket, &QWebSocket::binaryMessageReceived, this,
  24. &SignalingServer::onBinaryMessageReceived);
  25. QObject::connect(webSocket, &QWebSocket::textMessageReceived, this,
  26. &SignalingServer::onTextMessageReceived);
  27. }
  28. void SignalingServer::onDisconnected() {
  29. QWebSocket *webSocket = qobject_cast<QWebSocket *>(sender());
  30. clients.remove(webSocket->objectName());
  31. }
  32. void SignalingServer::onWebSocketError(QAbstractSocket::SocketError error) {
  33. qDebug() << QString::fromStdString(std::format("Client {} << {}",
  34. sender()->objectName().toUtf8().constData(),
  35. QString::number(error).toUtf8().constData()));
  36. }
  37. void SignalingServer::onBinaryMessageReceived(const QByteArray &message) {
  38. qInfo() << QString::fromStdString(std::format(
  39. "Client {} << {}", sender()->objectName().toUtf8().constData(), message.constData()));
  40. }
  41. void SignalingServer::onTextMessageReceived(const QString &message) {
  42. QWebSocket *webSocket = qobject_cast<QWebSocket *>(sender());
  43. qInfo() << QString::fromStdString(std::format("Client {} << {}",
  44. webSocket->objectName().toUtf8().constData(),
  45. message.toUtf8().constData()));
  46. auto JsonObject = QJsonDocument::fromJson(message.toUtf8()).object();
  47. auto destination_id = JsonObject["id"].toString();
  48. auto destination_websocket = clients[destination_id];
  49. if (destination_websocket) {
  50. JsonObject["id"] = webSocket->objectName();
  51. auto data = QJsonDocument(JsonObject).toJson(QJsonDocument::Compact);
  52. qInfo() << QString::fromStdString(
  53. std::format("Client {} >> {}", destination_id.toUtf8().constData(), data.constData()));
  54. destination_websocket->sendTextMessage(QString(data));
  55. destination_websocket->flush();
  56. } else {
  57. qInfo() << QString::fromStdString(
  58. std::format("Client {} not found", destination_id.toUtf8().constData()));
  59. }
  60. }