diff --git a/app/src/main.cpp b/app/src/main.cpp index 6d2aa87a511bbdea3e7b628d93db7140b12f1e0a..a702c0219fd173d6a2ed3b00740b59896e85e86f 100644 --- a/app/src/main.cpp +++ b/app/src/main.cpp @@ -48,14 +48,14 @@ int main(int argc, char *argv[]) int port = clParser.value(clOptionPort).toInt(); // Setup websocket server - WebSocketServer *webSocketServer = new WebSocketServer(appConfigApplication["id"].toString(), port, &app); - QObject::connect(webSocketServer, &WebSocketServer::stopped, &app, &QCoreApplication::quit); + WebSocketServer *wsServer = new WebSocketServer(appConfigApplication["id"].toString(), port, &app); + QObject::connect(wsServer, &WebSocketServer::stopped, &app, &QCoreApplication::quit); - if (webSocketServer->start()) { - qDebug() << "Websocket server started at:" << webSocketServer->serverUrl().toString(); + if (wsServer->start()) { + qDebug() << "Websocket server started at:" << wsServer->serverUrl().toString(); } else { - qCritical() << "Failed to start websocket server:" << webSocketServer->errorString(); + qCritical() << "Failed to start websocket server:" << wsServer->errorString(); return 1; } diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp index dc4d30871ae37f5adac05319cb7f2b48c21dfc9a..440a191187cc772fea6c42771b6006611dbe1d25 100644 --- a/app/src/websockets/websocketserver.cpp +++ b/app/src/websockets/websocketserver.cpp @@ -2,23 +2,25 @@ #include <QHostAddress> #include <QWebSocketServer> +#include <QWebSocket> WebSocketServer::WebSocketServer(const QString &serverName, quint16 serverPort, QObject *parent) : QObject(parent), serverName_(serverName), serverPort_(serverPort) { - webSocketServer_ = new QWebSocketServer(serverName_, QWebSocketServer::NonSecureMode, this); - connect(webSocketServer_, &QWebSocketServer::closed, this, &WebSocketServer::stopped); + wsServer_ = new QWebSocketServer(serverName_, QWebSocketServer::NonSecureMode, this); + connect(wsServer_, &QWebSocketServer::newConnection, this, &WebSocketServer::wsNewConnection); + connect(wsServer_, &QWebSocketServer::closed, this, &WebSocketServer::stopped); } WebSocketServer::~WebSocketServer() { stop(); - webSocketServer_->deleteLater(); + wsServer_->deleteLater(); } bool WebSocketServer::start() { - if (webSocketServer_->listen(QHostAddress::Any, serverPort_)) { + if (wsServer_->listen(QHostAddress::Any, serverPort_)) { emit started(); return true; } @@ -27,12 +29,12 @@ bool WebSocketServer::start() void WebSocketServer::stop() { - webSocketServer_->close(); + wsServer_->close(); } bool WebSocketServer::isError() { - if (webSocketServer_->error() != QWebSocketProtocol::CloseCodeNormal) { + if (wsServer_->error() != QWebSocketProtocol::CloseCodeNormal) { return true; } return false; @@ -40,10 +42,44 @@ bool WebSocketServer::isError() QString WebSocketServer::errorString() { - return webSocketServer_->errorString(); + return wsServer_->errorString(); } QUrl WebSocketServer::serverUrl() { - return webSocketServer_->serverUrl(); + return wsServer_->serverUrl(); +} + +void WebSocketServer::wsNewConnection() +{ + QWebSocket *wsClient = wsServer_->nextPendingConnection(); + connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived); + connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived); + connect(wsClient, &QWebSocket::disconnected, this, &WebSocketServer::wsDisconnected); + wsClients_ << wsClient; +} + +void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) +{ + QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); + if (wsClient) { + wsClient->sendBinaryMessage(message); + } +} + +void WebSocketServer::wsTextMessageReceived(const QString &message) +{ + QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); + if (wsClient) { + wsClient->sendTextMessage(message); + } +} + +void WebSocketServer::wsDisconnected() +{ + QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); + if (wsClient) { + wsClients_.removeAll(wsClient); + wsClient->deleteLater(); + } } diff --git a/app/src/websockets/websocketserver.h b/app/src/websockets/websocketserver.h index d17dd502d84c94b446437f5cc3c7e7d8ee39b958..01d4591ba9792cb4699d7405699f94f623312fd6 100644 --- a/app/src/websockets/websocketserver.h +++ b/app/src/websockets/websocketserver.h @@ -4,6 +4,7 @@ #include <QUrl> class QWebSocketServer; +class QWebSocket; class WebSocketServer : public QObject { @@ -20,14 +21,19 @@ signals: public slots: bool start(); void stop(); - bool isError(); QString errorString(); - QUrl serverUrl(); +private slots: + void wsNewConnection(); + void wsBinaryMessageReceived(const QByteArray &message); + void wsTextMessageReceived(const QString &message); + void wsDisconnected(); + private: QString serverName_; quint16 serverPort_; - QWebSocketServer *webSocketServer_; + QWebSocketServer *wsServer_; + QList<QWebSocket *> wsClients_; };