Refactor server services to share more code
This commit is contained in:
parent
37c0c5d17b
commit
5cd7c782ce
9 changed files with 280 additions and 85 deletions
83
src/service/websocketserver.cpp
Normal file
83
src/service/websocketserver.cpp
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
#include <QWebSocketServer>
|
||||
#include <vector>
|
||||
#include <QWebSocket>
|
||||
#include <QJsonArray>
|
||||
|
||||
#include "items/item.h"
|
||||
#include "server.h"
|
||||
#include "websocketserver.h"
|
||||
|
||||
WebSocketServer::WebSocketServer(const QString &serverName, QObject* parent)
|
||||
: Server(parent),
|
||||
server(serverName, QWebSocketServer::NonSecureMode, this)
|
||||
{
|
||||
connect(&server, &QWebSocketServer::newConnection, this, &WebSocketServer::incomingConnection);
|
||||
}
|
||||
|
||||
WebSocketServer::~WebSocketServer()
|
||||
{
|
||||
// Clean up WebSocket clients (they need special handling)
|
||||
for(auto& client : clients)
|
||||
{
|
||||
if(client.socket.webSocket)
|
||||
{
|
||||
client.socket.webSocket->close();
|
||||
delete client.socket.webSocket;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebSocketServer::sendJson(const QJsonObject& json)
|
||||
{
|
||||
QByteArray jsonData = QJsonDocument(json).toJson();
|
||||
for(auto& client : clients)
|
||||
{
|
||||
if(client.socket.webSocket && client.socket.webSocket->state() == QAbstractSocket::ConnectedState)
|
||||
{
|
||||
client.socket.webSocket->sendTextMessage(QString::fromUtf8(jsonData));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebSocketServer::processIncomeingJson(const QByteArray& jsonbytes)
|
||||
{
|
||||
// Validate JSON first (WebSockets may receive malformed data)
|
||||
QJsonDocument doc = QJsonDocument::fromJson(jsonbytes);
|
||||
if(!doc.isObject())
|
||||
{
|
||||
qWarning() << "Invalid JSON received:" << QString::fromUtf8(jsonbytes);
|
||||
return;
|
||||
}
|
||||
|
||||
Server::processIncomeingJson(jsonbytes);
|
||||
}
|
||||
|
||||
bool WebSocketServer::launch(const QHostAddress &address, quint16 port)
|
||||
{
|
||||
qInfo()<<"WebSocket server launched on"<<address<<"port"<<port;
|
||||
return server.listen(address, port);
|
||||
}
|
||||
|
||||
void WebSocketServer::incomingConnection()
|
||||
{
|
||||
while(server.hasPendingConnections())
|
||||
{
|
||||
QWebSocket* client = server.nextPendingConnection();
|
||||
qDebug() << "Got new WebSocket client from" << client->peerAddress().toString();
|
||||
if(client)
|
||||
{
|
||||
Client c;
|
||||
c.socket.webSocket = client;
|
||||
clients.push_back(c);
|
||||
connect(client, &QWebSocket::errorOccurred, this, [this, client]() { removeClient(client); });
|
||||
connect(client, &QWebSocket::disconnected, this, [this, client]() { removeClient(client); });
|
||||
connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::textMessageReceived);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebSocketServer::textMessageReceived(const QString &message)
|
||||
{
|
||||
QByteArray jsonData = message.toUtf8();
|
||||
processIncomeingJson(jsonData);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue