websocketclient.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "websocketclient.h"
  2. #include "appevent.h"
  3. #include "qjsonobject.h"
  4. #include <QTimer>
  5. #include <QGuiApplication>
  6. #include <QJsonDocument>
  7. #include <QProcess>
  8. #include <QRect>
  9. #include <QScreen>
  10. #include <QTemporaryFile>
  11. #include <QWebSocket>
  12. #include <api/processapi.h>
  13. WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent)
  14. : QObject(parent)
  15. , retryTimer(new QTimer(this))
  16. , socket(new QWebSocket())
  17. , m_url(url)
  18. {
  19. connect(socket, &QWebSocket::connected, this, &WebSocketClient::onConnected);
  20. connect(socket, &QWebSocket::disconnected, this, &WebSocketClient::onDisconnected);
  21. connect(socket,
  22. QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
  23. this,
  24. &WebSocketClient::onError);
  25. connect(socket, &QWebSocket::textMessageReceived, this, &WebSocketClient::onTextMessageReceived);
  26. connect(retryTimer, &QTimer::timeout, this, &WebSocketClient::retryConnect);
  27. retryTimer->setInterval(1000); // 重试间隔,单位毫秒
  28. // retryTimer->start();
  29. connectToServer();
  30. }
  31. WebSocketClient *WebSocketClient::getInstance()
  32. {
  33. // d->jsonConfig.insert("serverIP", "127.0.0.1");
  34. // d->jsonConfig.insert("serverPort", "8080");
  35. // d->jsonConfig.insert("webSocketIP", "127.0.0.1");
  36. // d->jsonConfig.insert("webSocketPort", "8081");
  37. AppEvent *appEvent = AppEvent::instance();
  38. const QString ip = "ver.stem993.cn";
  39. const int port = 80;
  40. qDebug() << appEvent->machineCode();
  41. // 使用静态局部变量确保单例实例的延迟初始化
  42. static WebSocketClient instance(
  43. QUrl(QString("ws://%1:%2/ws/%3").arg(ip).arg(port).arg(appEvent->machineCode())));
  44. return &instance;
  45. }
  46. void WebSocketClient::sendTextMessage(const QString &message)
  47. {
  48. if (socket) {
  49. socket->sendTextMessage(message);
  50. }
  51. }
  52. void WebSocketClient::onConnected()
  53. {
  54. AppEvent::instance()->serverLink(true);
  55. retryTimer->stop();
  56. qDebug() << "WebSocket connected";
  57. }
  58. void WebSocketClient::onDisconnected()
  59. {
  60. AppEvent::instance()->serverLink(false);
  61. qDebug() << "WebSocket disconnected";
  62. retryTimer->start();
  63. }
  64. void WebSocketClient::onError(QAbstractSocket::SocketError error)
  65. {
  66. qDebug() << error;
  67. retryTimer->start();
  68. }
  69. void WebSocketClient::onTextMessageReceived(const QString &message)
  70. {
  71. qDebug() << "Message received:" << message;
  72. QJsonParseError jsonError;
  73. QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toUtf8(), &jsonError);
  74. if (jsonError.error != QJsonParseError::NoError) {
  75. return;
  76. }
  77. QJsonObject object = jsonDoc.object();
  78. QJsonObject data = object["data"].toObject();
  79. const QString request = data["OperateCode"].toString();
  80. const QString OperateData = data["OperateData"].toString(); // 操作方式
  81. QJsonObject OperateObject;
  82. QJsonDocument OperateDataDoc = QJsonDocument::fromJson(OperateData.toUtf8(), &jsonError);
  83. if (jsonError.error == QJsonParseError::NoError) {
  84. OperateObject = OperateDataDoc.object();
  85. }
  86. if (request == "screenshot") { // 截图
  87. if (!OperateObject.isEmpty()) {
  88. // 可以考虑添加范围
  89. }
  90. QTemporaryFile tempFile("tempfile_XXXXXX.png");
  91. tempFile.setAutoRemove(true);
  92. tempFile.open();
  93. AppEvent::captureDesktop(&tempFile, "PNG");
  94. //qDebug() << "发送截图" << tempFile.fileName();
  95. TC::ProcessImageApi processImageApi;
  96. qDebug() << "发送截图" << processImageApi.post({tempFile.fileName()});
  97. tempFile.close();
  98. qDebug() << "发送截图" << tempFile.remove() << tempFile.errorString();
  99. }
  100. }
  101. void WebSocketClient::retryConnect()
  102. {
  103. // 重试连接
  104. connectToServer();
  105. // qDebug() << "retryConnect" << "------------";
  106. }
  107. void WebSocketClient::connectToServer()
  108. {
  109. socket->open(m_url);
  110. // qDebug() << "--------" << m_url;
  111. }