tcp.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "tcp.h"
  2. #include "ui_tcp.h"
  3. tcp::tcp(QWidget *parent, scope *pageScope) :
  4. QMainWindow(parent),
  5. ui(new Ui::tcp),
  6. page_scope(pageScope) // 初始化 scope
  7. {
  8. ui->setupUi(this);
  9. ui->port->setText("8899");
  10. setWindowTitle("tcp设置");
  11. connectNum=0;
  12. ui->disconnect->setDisabled(true);
  13. ui->sendMsg->setEnabled(true);
  14. // 创建监听的服务器对象
  15. ms = new QTcpServer(this);
  16. connect(ms, &QTcpServer::newConnection, this, [=]() {
  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. // 状态栏处理动作
  26. mstatus = new QLabel;
  27. // mstatus->setPixmap(QPixmap(qrc:/accessibility.svg).scaled(20,20));
  28. ui->statusbar->addWidget(new QLabel("是否有用户连接:"));
  29. ui->statusbar->addWidget(mstatus);
  30. }
  31. tcp::~tcp()
  32. {
  33. delete ui;
  34. }
  35. void tcp::on_setListen_clicked()
  36. {
  37. unsigned short port = ui->port->text().toUShort(); // 获取端口号
  38. ms->listen(QHostAddress::Any, port); // 监听所有地址上的指定端口
  39. ui->setListen->setDisabled(true); // 禁用监听按钮
  40. page_scope->Chart_Init(); // 使用 page_scope 指针调用方法
  41. page_scope->show();
  42. }
  43. void tcp::connectClient(QTcpSocket *clientSocket)
  44. {
  45. connectNum++;
  46. connect(clientSocket, &QTcpSocket::readyRead, this, [=]() {
  47. ui->usermsg->append("matlab连接");
  48. QByteArray data = clientSocket->readAll();
  49. if (data.isEmpty())
  50. return;
  51. char dataType = data.at(0); // 读取前缀
  52. data.remove(0, 1); // 移除前缀
  53. if (dataType == 'T') {
  54. // 处理文本数据
  55. QString message = QString::fromUtf8(data);
  56. ui->record->append("收到文本: " + message);
  57. } else if (dataType == 'D') {
  58. // 处理数字数据
  59. QVector<double> receivedData;
  60. int dataSize = data.size() / sizeof(double);
  61. for (int i = 0; i < dataSize; ++i) {
  62. double value;
  63. memcpy(&value, data.data() + i * sizeof(double), sizeof(double));
  64. page_scope->DrawLine(value); // 使用 page_scope 指针调用方法
  65. receivedData.append(value);
  66. }
  67. QString numbers;
  68. for (double num : receivedData)
  69. {
  70. numbers += QString::number(num, 'f', 6) + " ";
  71. }
  72. ui->record->append("收到数据: " + numbers.trimmed());
  73. QString dataSizeStr = QString::number(dataSize);
  74. ui->msg->append("收到数据长度: " + dataSizeStr);
  75. data.clear(); // 清空 data
  76. page_scope->Chart_Init();
  77. }
  78. });
  79. connect(clientSocket, &QTcpSocket::disconnected, this, [=]() {
  80. clientSocket->close();
  81. connectedClients.remove(clientSocket);
  82. connectNum = 0;
  83. // 更新状态栏
  84. if (connectNum == 0) {
  85. mstatus->setPixmap(QPixmap(":/f.PNG").scaled(20, 20));
  86. ui->usermsg->append("matlab断开连接");
  87. }
  88. });
  89. }
  90. void tcp::on_sendMsg_clicked()
  91. {
  92. QString msg = ui->msg->toPlainText(); // 获取要发送的消息
  93. QString serverMsg = "[Server] " + msg; // 添加服务器标识
  94. for (auto clientSocket : connectedClients.keys()) {
  95. if (clientSocket->state() == QAbstractSocket::ConnectedState) {
  96. clientSocket->write(serverMsg.toUtf8()); // 发送消息
  97. }
  98. }
  99. ui->record->append("服务端广播消息: " + msg); // 在记录中显示发送的消息
  100. }