Websocket: fix unnecessary reconnect

This commit is contained in:
tobtoht 2021-10-14 15:41:14 +02:00
parent baf4fdc67d
commit 3ef10e9b53
No known key found for this signature in database
GPG key ID: 1CADD27F41F45C3C
3 changed files with 18 additions and 43 deletions

View file

@ -460,8 +460,6 @@ void WindowManager::initTor() {
torManager()->init();
torManager()->start();
connect(torManager(), &TorManager::connectionStateChanged, &websocketNotifier()->websocketClient, &WebsocketClient::onToggleConnect);
this->onTorSettingsChanged();
}

View file

@ -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<QAbstractSocket::SocketError>::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;

View file

@ -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;
};