tcp.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "tcp.h"
  2. #include "ui_tcp.h"
  3. tcp::tcp(QWidget *parent, scope *pageScope) : QMainWindow(parent),
  4. ui(new Ui::tcp),
  5. page_scope(pageScope) // 初始化 scope
  6. {
  7. ui->setupUi(this);
  8. ui->port->setText("8899");
  9. setWindowTitle("tcp设置");
  10. connectNum = 0;
  11. ui->disconnect->setDisabled(true);
  12. ui->sendMsg->setEnabled(true);
  13. // 创建监听的服务器对象
  14. ms = new QTcpServer(this);
  15. connect(ms, &QTcpServer::newConnection, this, [=]()
  16. {
  17. QTcpSocket *clientSocket = ms->nextPendingConnection();
  18. mstatus->setPixmap(QPixmap(":/accessibility.svg").scaled(20, 20));
  19. ui->disconnect->setEnabled(true);
  20. // 将客户端连接添加到连接管理中
  21. connectedClients[clientSocket] = "";
  22. // 增加处理连接的信号和槽
  23. connectClient(clientSocket); });
  24. // 状态栏处理动作
  25. mstatus = new QLabel;
  26. // mstatus->setPixmap(QPixmap(qrc:/accessibility.svg).scaled(20,20));
  27. ui->statusbar->addWidget(new QLabel("是否有用户连接:"));
  28. ui->statusbar->addWidget(mstatus);
  29. }
  30. tcp::~tcp()
  31. {
  32. delete ui;
  33. }
  34. void tcp::on_setListen_clicked()
  35. {
  36. unsigned short port = ui->port->text().toUShort(); // 获取端口号
  37. ms->listen(QHostAddress::Any, port); // 监听所有地址上的指定端口
  38. ui->setListen->setDisabled(true); // 禁用监听按钮
  39. page_scope->Chart_Init(); // 使用 page_scope 指针调用方法
  40. page_scope->show();
  41. this->hide(); // 隐藏本窗口
  42. }
  43. void tcp::connectClient(QTcpSocket *clientSocket)
  44. {
  45. connectNum++;
  46. connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
  47. {
  48. ui->usermsg->append("matlab发送信息");
  49. QByteArray data = clientSocket->readAll();
  50. if (data.isEmpty())
  51. return;
  52. char dataType = data.at(0); // 读取前缀
  53. data.remove(0, 1); // 移除前缀
  54. if (dataType == 'T') {
  55. // 处理文本数据
  56. QString message = QString::fromUtf8(data);
  57. ui->record->append("收到文本: " + message);
  58. } else if (dataType == 'D') {
  59. // 处理数字数据
  60. QVector<QPointF> receivedData;
  61. int dataSize = data.size() / sizeof(double);
  62. for (int i = 0; i < dataSize; ++i) {
  63. double value;
  64. memcpy(&value, data.data() + i * sizeof(double), sizeof(double));
  65. if (i>0)
  66. {
  67. page_scope->DrawLine(value);
  68. }// 绘制曲线解释代码:
  69. receivedData.append(QPointF(i, value));
  70. }
  71. QString numbers;
  72. for (const QPointF& point : receivedData) {
  73. numbers += QString::number(point.y(), 'f', 6) + " ";
  74. }
  75. QString dataSizeStr = QString::number(dataSize);
  76. ui->record->append("收到数据长度: " + dataSizeStr + " 数据: " + numbers.trimmed());
  77. ui->msg->append(numbers.trimmed());
  78. on_sendMsg_clicked();
  79. data.clear(); // 清空 data
  80. } });
  81. connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
  82. {
  83. clientSocket->close();
  84. connectedClients.remove(clientSocket);
  85. connectNum = 0;
  86. // 更新状态栏
  87. if (connectNum == 0) {
  88. mstatus->setPixmap(QPixmap(":/chat-bubble-xmark.svg").scaled(20, 20));
  89. ui->usermsg->append("matlab断开连接");
  90. } });
  91. }
  92. // 接受TCP传输的文件
  93. void tcp::receiveFile(const QString &filename, const QByteArray &data)
  94. {
  95. QString savePath = "./" + filename;
  96. QFile file(savePath);
  97. if (file.open(QIODevice::WriteOnly)) {
  98. // 进行Base64解码
  99. QByteArray decodedData = QByteArray::fromBase64(data);
  100. // 将解码后的数据写入文件
  101. file.write(decodedData);
  102. file.close();
  103. ui->record->append("成功接收到文件: " + filename);
  104. }
  105. }
  106. void tcp::on_sendMsg_clicked() // 接受输入的消息并 发送消息
  107. {
  108. // 发送数字1
  109. // QByteArray data;
  110. // data.append('1');
  111. // for (auto clientSocket : connectedClients.keys())
  112. // {
  113. // // 遍历所有连接的客户端
  114. // if (clientSocket->state() == QAbstractSocket::ConnectedState)
  115. // {
  116. // clientSocket->write(data); // 发送数据
  117. // }
  118. // }
  119. // 发送ui->msg里面输入的文本
  120. QString msg = ui->msg->toPlainText(); // 获取要发送的消息
  121. QString serverMsg = 'D'+msg; // 添加服务器标识
  122. for (auto clientSocket : connectedClients.keys()) {
  123. if (clientSocket->state() == QAbstractSocket::ConnectedState) {
  124. clientSocket->write(serverMsg.toUtf8()); // 发送消息
  125. }
  126. }
  127. ui->record->append("服务端广播消息: " + msg); // 在记录中显示发送的消息
  128. // 清空消息框
  129. ui->msg->clear();
  130. }