Skip to content
Snippets Groups Projects
Commit 07d08337 authored by akiraohgaki's avatar akiraohgaki
Browse files

WebSocketServer

parent bd5feb70
No related branches found
No related tags found
No related merge requests found
...@@ -55,17 +55,18 @@ QUrl WebSocketServer::serverUrl() ...@@ -55,17 +55,18 @@ QUrl WebSocketServer::serverUrl()
void WebSocketServer::wsNewConnection() void WebSocketServer::wsNewConnection()
{ {
QWebSocket *wsClient = wsServer_->nextPendingConnection(); 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::disconnected, this, &WebSocketServer::wsDisconnected);
connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived);
connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived);
wsClients_ << wsClient; wsClients_ << wsClient;
} }
void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message) void WebSocketServer::wsDisconnected()
{ {
QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender());
if (wsClient) { if (wsClient) {
wsClient->sendBinaryMessage(message); wsClients_.removeAll(wsClient);
wsClient->deleteLater();
} }
} }
...@@ -75,20 +76,57 @@ void WebSocketServer::wsTextMessageReceived(const QString &message) ...@@ -75,20 +76,57 @@ void WebSocketServer::wsTextMessageReceived(const QString &message)
if (wsClient) { if (wsClient) {
qtlib::Json json(message.toUtf8()); qtlib::Json json(message.toUtf8());
if (json.isValid()) { if (json.isValid()) {
QJsonObject jsonObject = json.toObject(); callFunction(json.toObject(), wsClient);
if (jsonObject["method"].toString() == "stop") {
stop();
}
} }
wsClient->sendTextMessage(message);
} }
} }
void WebSocketServer::wsDisconnected() void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message)
{ {
QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender()); QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender());
if (wsClient) { if (wsClient) {
wsClients_.removeAll(wsClient); qtlib::Json json(message);
wsClient->deleteLater(); 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());
}
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <QObject> #include <QObject>
#include <QUrl> #include <QUrl>
//#include <QJsonObject>
class QWebSocketServer; class QWebSocketServer;
class QWebSocket; class QWebSocket;
...@@ -14,24 +15,25 @@ public: ...@@ -14,24 +15,25 @@ public:
explicit WebSocketServer(const QString &serverName, quint16 serverPort = 0, QObject *parent = 0); explicit WebSocketServer(const QString &serverName, quint16 serverPort = 0, QObject *parent = 0);
~WebSocketServer(); ~WebSocketServer();
signals:
void started();
void stopped();
public slots:
bool start(); bool start();
void stop(); void stop();
bool isError(); bool isError();
QString errorString(); QString errorString();
QUrl serverUrl(); QUrl serverUrl();
signals:
void started();
void stopped();
private slots: private slots:
void wsNewConnection(); void wsNewConnection();
void wsBinaryMessageReceived(const QByteArray &message);
void wsTextMessageReceived(const QString &message);
void wsDisconnected(); void wsDisconnected();
void wsTextMessageReceived(const QString &message);
void wsBinaryMessageReceived(const QByteArray &message);
private: private:
void callFunction(const QJsonObject &request, QWebSocket *wsClient);
QString serverName_; QString serverName_;
quint16 serverPort_; quint16 serverPort_;
QWebSocketServer *wsServer_; QWebSocketServer *wsServer_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment