Ver código fonte

添加 websocket

zhuizhu 1 ano atrás
pai
commit
2b0dbeb76f
5 arquivos alterados com 185 adições e 8 exclusões
  1. 1 3
      api/tapi.cpp
  2. 3 1
      basemain.pro
  3. 9 4
      main.cpp
  4. 134 0
      websocketclient.cpp
  5. 38 0
      websocketclient.h

+ 1 - 3
api/tapi.cpp

@@ -151,9 +151,7 @@ NetworkAccessManager *NetworkAccessManager::instance()
 NetworkAccessManager::NetworkAccessManager(QObject *parent)
     : QNetworkAccessManager(parent)
 {
-    // const QString ip = AppEvent::instance()->configValue("serverIP").toString();
-    // const QString port = AppEvent::instance()->configValue("serverPort").toString();
-    // base_url = QString("http://%1:%2").arg(ip).arg(port);
+    setAutoDeleteReplies(true); // 自动清理  QNetworkReply *reply
 }
 
 QNetworkReply *NetworkAccessManager::createRequest(Operation op,

+ 3 - 1
basemain.pro

@@ -1,5 +1,5 @@
 QT       += core gui network network-private
-
+QT += websockets
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
 CONFIG += c++17
@@ -20,6 +20,7 @@ SOURCES += \
         processthread.cpp \
         thardware/thardware.cpp \
         updaterthread.cpp \
+        websocketclient.cpp \
         worker.cpp
 
 # Default rules for deployment.
@@ -37,6 +38,7 @@ HEADERS += \
     processthread.h \
     thardware/thardware.h \
     updaterthread.h \
+    websocketclient.h \
     worker.h
 
 include($$PWD/CPPWebFramework/CPPWebFramework.pri)

+ 9 - 4
main.cpp

@@ -18,6 +18,8 @@
 #include "qtsingleapplication.h"
 #include "updaterthread.h"
 
+#include "websocketclient.h"
+
 std::vector<unsigned long> GetProcessIDsByName(const std::wstring &processName)
 {
     std::vector<unsigned long> pids;
@@ -212,7 +214,7 @@ int main(int argc, char *argv[])
 
     a.setOrganizationName("BaseMainApp");
     a.setApplicationName("BaseMain");
-    a.setApplicationVersion("1.1.4");
+    a.setApplicationVersion("1.1.5");
     a.setQuitOnLastWindowClosed(false);
 
     QCommandLineParser parser;
@@ -263,6 +265,8 @@ int main(int argc, char *argv[])
             break;
         }
     }
+    WebSocketClient::getInstance();
+
     HostThread host;
     UpdaterThread thread;
     ProcessThread Process;
@@ -271,8 +275,9 @@ int main(int argc, char *argv[])
 
     QObject::connect(&Process, &ProcessThread::messageBox, &messageQueue, &MessageQueue::addMessage);
     QObject::connect(&Process, &ProcessThread::finished, &Process, &QObject::deleteLater);
-    thread.start();
-    Process.start();
-    host.start();
+
+    // thread.start();
+    // Process.start();
+    // host.start();
     return a.exec();
 }

+ 134 - 0
websocketclient.cpp

@@ -0,0 +1,134 @@
+#include "websocketclient.h"
+
+#include "appevent.h"
+#include "qjsonobject.h"
+
+#include <QTimer>
+
+#include <QGuiApplication>
+#include <QJsonDocument>
+#include <QProcess>
+#include <QRect>
+#include <QScreen>
+#include <QTemporaryFile>
+#include <QWebSocket>
+
+#include <api/processapi.h>
+
+WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent)
+    : QObject(parent)
+    , retryTimer(new QTimer(this))
+    , socket(new QWebSocket())
+    , m_url(url)
+{
+    connect(socket, &QWebSocket::connected, this, &WebSocketClient::onConnected);
+    connect(socket, &QWebSocket::disconnected, this, &WebSocketClient::onDisconnected);
+    connect(socket,
+            QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
+            this,
+            &WebSocketClient::onError);
+    connect(socket, &QWebSocket::textMessageReceived, this, &WebSocketClient::onTextMessageReceived);
+
+    connect(retryTimer, &QTimer::timeout, this, &WebSocketClient::retryConnect);
+
+    retryTimer->setInterval(1000); // 重试间隔,单位毫秒
+
+    // retryTimer->start();
+    connectToServer();
+}
+
+WebSocketClient *WebSocketClient::getInstance()
+{
+    // d->jsonConfig.insert("serverIP", "127.0.0.1");
+    // d->jsonConfig.insert("serverPort", "8080");
+    // d->jsonConfig.insert("webSocketIP", "127.0.0.1");
+    // d->jsonConfig.insert("webSocketPort", "8081");
+
+    AppEvent *appEvent = AppEvent::instance();
+
+    const QString ip = "ver.stem993.cn";
+    const int port = 80;
+    qDebug() << appEvent->machineCode();
+    // 使用静态局部变量确保单例实例的延迟初始化
+    static WebSocketClient instance(
+        QUrl(QString("ws://%1:%2/ws/%3").arg(ip).arg(port).arg(appEvent->machineCode())));
+    return &instance;
+}
+
+void WebSocketClient::sendTextMessage(const QString &message)
+{
+    if (socket) {
+        socket->sendTextMessage(message);
+    }
+}
+
+void WebSocketClient::onConnected()
+{
+    AppEvent::instance()->serverLink(true);
+    retryTimer->stop();
+    qDebug() << "WebSocket connected";
+}
+
+void WebSocketClient::onDisconnected()
+{
+    AppEvent::instance()->serverLink(false);
+    qDebug() << "WebSocket disconnected";
+    retryTimer->start();
+}
+
+void WebSocketClient::onError(QAbstractSocket::SocketError error)
+{
+    qDebug() << error;
+    retryTimer->start();
+}
+
+void WebSocketClient::onTextMessageReceived(const QString &message)
+{
+    qDebug() << "Message received:" << message;
+
+    QJsonParseError jsonError;
+    QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toUtf8(), &jsonError);
+    if (jsonError.error != QJsonParseError::NoError) {
+        return;
+    }
+    QJsonObject object = jsonDoc.object();
+    QJsonObject data = object["data"].toObject();
+    const QString request = data["OperateCode"].toString();
+    const QString OperateData = data["OperateData"].toString(); // 操作方式
+
+    QJsonObject OperateObject;
+    QJsonDocument OperateDataDoc = QJsonDocument::fromJson(OperateData.toUtf8(), &jsonError);
+    if (jsonError.error == QJsonParseError::NoError) {
+        OperateObject = OperateDataDoc.object();
+    }
+
+    if (request == "screenshot") { // 截图
+        if (!OperateObject.isEmpty()) {
+            // 可以考虑添加范围
+        }
+        QTemporaryFile tempFile("tempfile_XXXXXX.png");
+        tempFile.setAutoRemove(true);
+        tempFile.open();
+        AppEvent::captureDesktop(&tempFile, "PNG");
+
+        //qDebug() << "发送截图" << tempFile.fileName();
+
+        TC::ProcessImageApi processImageApi;
+        qDebug() << "发送截图" << processImageApi.post({tempFile.fileName()});
+        tempFile.close();
+        qDebug() << "发送截图" << tempFile.remove() << tempFile.errorString();
+    }
+}
+
+void WebSocketClient::retryConnect()
+{
+    // 重试连接
+    connectToServer();
+    // qDebug() << "retryConnect" << "------------";
+}
+
+void WebSocketClient::connectToServer()
+{
+    socket->open(m_url);
+    // qDebug() << "--------" << m_url;
+}

+ 38 - 0
websocketclient.h

@@ -0,0 +1,38 @@
+#ifndef WEBSOCKETCLIENT_H
+#define WEBSOCKETCLIENT_H
+
+#include <QObject>
+#include <QUrl>
+#include <QWebSocket>
+
+class WebSocketClient : public QObject
+{
+    Q_OBJECT
+
+public:
+    WebSocketClient(const QUrl &url, QObject *parent = nullptr);
+
+    static WebSocketClient *getInstance();
+
+    void sendTextMessage(const QString &message);
+private slots:
+    void onConnected();
+
+    void onDisconnected();
+
+    void onError(QAbstractSocket::SocketError error);
+
+    void onTextMessageReceived(const QString &message);
+
+    void retryConnect();
+
+private:
+    QTimer *retryTimer;
+    QWebSocket *socket;
+    QUrl m_url;
+
+private:
+    void connectToServer();
+};
+
+#endif // WEBSOCKETCLIENT_H