From: tobtoht Date: Thu, 14 Oct 2021 13:41:14 +0000 (+0200) Subject: Websocket: fix unnecessary reconnect X-Git-Url: https://git.nutra.tk/v1?a=commitdiff_plain;h=3ef10e9b534b44f2437f3f030a2936046c34afa7;p=gamesguru%2Ffeather.git Websocket: fix unnecessary reconnect --- diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp index c4c6025e..a20ece0a 100644 --- a/src/WindowManager.cpp +++ b/src/WindowManager.cpp @@ -460,8 +460,6 @@ void WindowManager::initTor() { torManager()->init(); torManager()->start(); - connect(torManager(), &TorManager::connectionStateChanged, &websocketNotifier()->websocketClient, &WebsocketClient::onToggleConnect); - this->onTorSettingsChanged(); } diff --git a/src/utils/WebsocketClient.cpp b/src/utils/WebsocketClient.cpp index 5855f95d..7087a174 100644 --- a/src/utils/WebsocketClient.cpp +++ b/src/utils/WebsocketClient.cpp @@ -9,76 +9,59 @@ WebsocketClient::WebsocketClient(QObject *parent) : QObject(parent) { - connect(&webSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketClient::onbinaryMessageReceived); connect(&webSocket, &QWebSocket::connected, this, &WebsocketClient::onConnected); - connect(&webSocket, &QWebSocket::disconnected, this, &WebsocketClient::closed); + connect(&webSocket, &QWebSocket::disconnected, this, &WebsocketClient::onDisconnected); connect(&webSocket, QOverload::of(&QWebSocket::error), this, &WebsocketClient::onError); - connect(&m_connectionTimer, &QTimer::timeout, this, &WebsocketClient::checkConnection); + + connect(&webSocket, &QWebSocket::binaryMessageReceived, this, &WebsocketClient::onbinaryMessageReceived); // Keep websocket connection alive connect(&m_pingTimer, &QTimer::timeout, [this]{ - if (webSocket.state() == QAbstractSocket::ConnectedState) + if (webSocket.state() == QAbstractSocket::ConnectedState) { webSocket.ping(); + } }); m_pingTimer.setInterval(30 * 1000); m_pingTimer.start(); } void WebsocketClient::sendMsg(const QByteArray &data) { - if (webSocket.state() == QAbstractSocket::ConnectedState) + if (webSocket.state() == QAbstractSocket::ConnectedState) { webSocket.sendBinaryMessage(data); -} - -void WebsocketClient::onToggleConnect(bool connect) { - m_connect = connect; - if (m_connect) - checkConnection(); + } } void WebsocketClient::start() { // connect & reconnect on errors/close -#ifdef QT_DEBUG qDebug() << "WebSocket connect:" << m_url.url(); -#endif - if (m_connect) + auto state = webSocket.state(); + if (state != QAbstractSocket::ConnectedState && state != QAbstractSocket::ConnectingState) { webSocket.open(m_url); - - if (!m_connectionTimer.isActive()) { - m_connectionTimer.start(2000); - } -} - -void WebsocketClient::checkConnection() { - if (!m_connect) - return; - - if (webSocket.state() == QAbstractSocket::UnconnectedState) { -#ifdef QT_DEBUG - qDebug() << "WebSocket reconnect"; -#endif - this->start(); } } void WebsocketClient::onConnected() { -#ifdef QT_DEBUG qDebug() << "WebSocket connected"; -#endif emit connectionEstablished(); } +void WebsocketClient::onDisconnected() { + qDebug() << "WebSocket disconnected"; + QTimer::singleShot(1000, [this]{this->start();}); +} + void WebsocketClient::onError(QAbstractSocket::SocketError error) { qCritical() << "WebSocket error: " << error; auto state = webSocket.state(); - if (state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState) + if (state == QAbstractSocket::ConnectedState || state == QAbstractSocket::ConnectingState) { webSocket.abort(); + } } void WebsocketClient::onbinaryMessageReceived(const QByteArray &message) { -#ifdef QT_DEBUG qDebug() << "WebSocket received:" << message; -#endif + if (!Utils::validateJSON(message)) { qCritical() << "Could not interpret WebSocket message as JSON"; return; diff --git a/src/utils/WebsocketClient.h b/src/utils/WebsocketClient.h index c9e098db..f9aaefc9 100644 --- a/src/utils/WebsocketClient.h +++ b/src/utils/WebsocketClient.h @@ -20,24 +20,18 @@ public: QWebSocket webSocket; -public slots: - void onToggleConnect(bool connect); - signals: - void closed(); void connectionEstablished(); void WSMessage(QJsonObject message); private slots: void onConnected(); + void onDisconnected(); void onbinaryMessageReceived(const QByteArray &message); - void checkConnection(); void onError(QAbstractSocket::SocketError error); private: - bool m_connect = false; QUrl m_url = constants::websocketUrl; - QTimer m_connectionTimer; QTimer m_pingTimer; };