From 07d083370d395d50d878ff9924ea2af6369950db Mon Sep 17 00:00:00 2001 From: Akira Ohgaki <akiraohgaki@gmail.com> Date: Wed, 10 May 2017 18:49:49 +0900 Subject: [PATCH] WebSocketServer --- app/src/websockets/websocketserver.cpp | 62 +++++++++++++++++++++----- app/src/websockets/websocketserver.h | 16 ++++--- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/app/src/websockets/websocketserver.cpp b/app/src/websockets/websocketserver.cpp index c1aed46..5e00aa5 100644 --- a/app/src/websockets/websocketserver.cpp +++ b/app/src/websockets/websocketserver.cpp @@ -55,17 +55,18 @@ QUrl WebSocketServer::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); + connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived); + connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived); wsClients_ << wsClient; } -void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) +void WebSocketServer::wsDisconnected() { QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); if (wsClient) { - wsClient->sendBinaryMessage(message); + wsClients_.removeAll(wsClient); + wsClient->deleteLater(); } } @@ -75,20 +76,57 @@ void WebSocketServer::wsTextMessageReceived(const QString &message) if (wsClient) { qtlib::Json json(message.toUtf8()); if (json.isValid()) { - QJsonObject jsonObject = json.toObject(); - if (jsonObject["method"].toString() == "stop") { - stop(); - } + callFunction(json.toObject(), wsClient); } - wsClient->sendTextMessage(message); } } -void WebSocketServer::wsDisconnected() +void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) { QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); if (wsClient) { - wsClients_.removeAll(wsClient); - wsClient->deleteLater(); + qtlib::Json json(message); + if (json.isValid()) { + callFunction(json.toObject(), wsClient); + } } } + +void WebSocketServer::callFunction(const QJsonObject &request, QWebSocket *wsClient) +{ + /* request object format + { + "id": "example", + "call": "functionName", + "args": { + "arg1": "value", + "arg2": 2, + "arg3": true + } + } + */ + + /* response object format + { + "id": "example", + "result": {} + } + */ + + QString id = request["id"].toString(); + QString call = request["call"].toString(); + QJsonObject args = request["args"].toObject(); + + QJsonObject response; + response["id"] = id; + + if (call == "WebSocketServer::stop") { + stop(); + } + else if (call == "WebSocketServer::serverUrl") { + response["result"] = serverUrl().toString(); + } + + wsClient->sendTextMessage(QString(qtlib::Json(response).toJson())); + //wsClient->sendBinaryMessage(qtlib::Json(response).toJson()); +} diff --git a/app/src/websockets/websocketserver.h b/app/src/websockets/websocketserver.h index 01d4591..899d5dc 100644 --- a/app/src/websockets/websocketserver.h +++ b/app/src/websockets/websocketserver.h @@ -2,6 +2,7 @@ #include <QObject> #include <QUrl> +//#include <QJsonObject> class QWebSocketServer; class QWebSocket; @@ -14,24 +15,25 @@ public: explicit WebSocketServer(const QString &serverName, quint16 serverPort = 0, QObject *parent = 0); ~WebSocketServer(); -signals: - void started(); - void stopped(); - -public slots: bool start(); void stop(); bool isError(); QString errorString(); QUrl serverUrl(); +signals: + void started(); + void stopped(); + private slots: void wsNewConnection(); - void wsBinaryMessageReceived(const QByteArray &message); - void wsTextMessageReceived(const QString &message); void wsDisconnected(); + void wsTextMessageReceived(const QString &message); + void wsBinaryMessageReceived(const QByteArray &message); private: + void callFunction(const QJsonObject &request, QWebSocket *wsClient); + QString serverName_; quint16 serverPort_; QWebSocketServer *wsServer_; -- GitLab