Skip to content
Snippets Groups Projects
websocketserver.cpp 2.44 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
#include "websocketserver.h"

#include <QHostAddress>
#include <QWebSocketServer>
akiraohgaki's avatar
akiraohgaki committed
#include <QWebSocket>
#include "qtlib_json.h"

akiraohgaki's avatar
akiraohgaki committed
WebSocketServer::WebSocketServer(const QString &serverName, quint16 serverPort, QObject *parent)
    : QObject(parent), serverName_(serverName), serverPort_(serverPort)
{
akiraohgaki's avatar
akiraohgaki committed
    wsServer_ = new QWebSocketServer(serverName_, QWebSocketServer::NonSecureMode, this);
    connect(wsServer_, &QWebSocketServer::newConnection, this, &WebSocketServer::wsNewConnection);
    connect(wsServer_, &QWebSocketServer::closed, this, &WebSocketServer::stopped);
akiraohgaki's avatar
akiraohgaki committed
}

WebSocketServer::~WebSocketServer()
{
akiraohgaki's avatar
akiraohgaki committed
    stop();
akiraohgaki's avatar
akiraohgaki committed
    wsServer_->deleteLater();
akiraohgaki's avatar
akiraohgaki committed
}

bool WebSocketServer::start()
{
akiraohgaki's avatar
akiraohgaki committed
    if (wsServer_->listen(QHostAddress::Any, serverPort_)) {
akiraohgaki's avatar
akiraohgaki committed
        emit started();
        return true;
    }
    return false;
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::stop()
{
akiraohgaki's avatar
akiraohgaki committed
    wsServer_->close();
akiraohgaki's avatar
akiraohgaki committed

bool WebSocketServer::isError()
{
akiraohgaki's avatar
akiraohgaki committed
    if (wsServer_->error() != QWebSocketProtocol::CloseCodeNormal) {
akiraohgaki's avatar
akiraohgaki committed
        return true;
    }
    return false;
}

QString WebSocketServer::errorString()
{
akiraohgaki's avatar
akiraohgaki committed
    return wsServer_->errorString();
akiraohgaki's avatar
akiraohgaki committed
}

QUrl WebSocketServer::serverUrl()
{
akiraohgaki's avatar
akiraohgaki committed
    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) {
        qtlib::Json json(message.toUtf8());
        if (json.isValid()) {
            QJsonObject jsonObject = json.toObject();
            if (jsonObject["method"].toString() == "stop") {
                stop();
            }
        }
akiraohgaki's avatar
akiraohgaki committed
        wsClient->sendTextMessage(message);
    }
}

void WebSocketServer::wsDisconnected()
{
    QWebSocket *wsClient = qobject_cast<QWebSocket *>(sender());
    if (wsClient) {
        wsClients_.removeAll(wsClient);
        wsClient->deleteLater();
    }
akiraohgaki's avatar
akiraohgaki committed
}