Skip to content
Snippets Groups Projects
websocketserver.cpp 2.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    }