#include "websocketclient.h" #include "appevent.h" #include "qjsonobject.h" #include #include #include #include #include #include #include #include #include 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::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; }