| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | /** * Qt signaling server example for libdatachannel * Copyright (c) 2022 cheungxiongwei * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */#include "SignalingServer.h"#include <QDebug>#include <QtWebSockets>#include <format>SignalingServer::SignalingServer(QObject *parent) : QObject(parent) {	server = new QWebSocketServer("SignalingServer", QWebSocketServer::NonSecureMode, this);	QObject::connect(server, &QWebSocketServer::newConnection, this,	                 &SignalingServer::onNewConnection);}bool SignalingServer::listen(const QHostAddress &address, quint16 port) {	return server->listen(address, port);}void SignalingServer::onNewConnection() {	auto webSocket = server->nextPendingConnection();	auto client_id = webSocket->requestUrl().path().split("/").at(1);	qInfo() << QString::fromStdString(	    std::format("Client {} connected", client_id.toUtf8().constData()));	clients[client_id] = webSocket;	webSocket->setObjectName(client_id);	QObject::connect(webSocket, &QWebSocket::disconnected, this, &SignalingServer::onDisconnected);	QObject::connect(webSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),	                 this, &SignalingServer::onWebSocketError);	QObject::connect(webSocket, &QWebSocket::binaryMessageReceived, this,	                 &SignalingServer::onBinaryMessageReceived);	QObject::connect(webSocket, &QWebSocket::textMessageReceived, this,	                 &SignalingServer::onTextMessageReceived);}void SignalingServer::onDisconnected() {	QWebSocket *webSocket = qobject_cast<QWebSocket *>(sender());	clients.remove(webSocket->objectName());}void SignalingServer::onWebSocketError(QAbstractSocket::SocketError error) {	qDebug() << QString::fromStdString(std::format("Client {} << {}",	                                               sender()->objectName().toUtf8().constData(),	                                               QString::number(error).toUtf8().constData()));}void SignalingServer::onBinaryMessageReceived(const QByteArray &message) {	qInfo() << QString::fromStdString(std::format(	    "Client {} << {}", sender()->objectName().toUtf8().constData(), message.constData()));}void SignalingServer::onTextMessageReceived(const QString &message) {	QWebSocket *webSocket = qobject_cast<QWebSocket *>(sender());	qInfo() << QString::fromStdString(std::format("Client {} << {}",	                                              webSocket->objectName().toUtf8().constData(),	                                              message.toUtf8().constData()));	auto JsonObject = QJsonDocument::fromJson(message.toUtf8()).object();	auto destination_id = JsonObject["id"].toString();	auto destination_websocket = clients[destination_id];	if (destination_websocket) {		JsonObject["id"] = webSocket->objectName();		auto data = QJsonDocument(JsonObject).toJson(QJsonDocument::Compact);		qInfo() << QString::fromStdString(		    std::format("Client {} >> {}", destination_id.toUtf8().constData(), data.constData()));		destination_websocket->sendTextMessage(QString(data));		destination_websocket->flush();	} else {		qInfo() << QString::fromStdString(		    std::format("Client {} not found", destination_id.toUtf8().constData()));	}}
 |