#include "tcp.h" #include "ui_tcp.h" tcp::tcp(QWidget *parent, scope *pageScope) : QMainWindow(parent), ui(new Ui::tcp), page_scope(pageScope) // 初始化 scope { ui->setupUi(this); ui->port->setText("8899"); setWindowTitle("tcp设置"); connectNum = 0; ui->disconnect->setDisabled(true); ui->sendMsg->setEnabled(true); // 创建监听的服务器对象 ms = new QTcpServer(this); connect(ms, &QTcpServer::newConnection, this, [=]() { QTcpSocket *clientSocket = ms->nextPendingConnection(); mstatus->setPixmap(QPixmap(":/accessibility.svg").scaled(20, 20)); ui->disconnect->setEnabled(true); // 将客户端连接添加到连接管理中 connectedClients[clientSocket] = ""; // 增加处理连接的信号和槽 connectClient(clientSocket); }); // 状态栏处理动作 mstatus = new QLabel; // mstatus->setPixmap(QPixmap(qrc:/accessibility.svg).scaled(20,20)); ui->statusbar->addWidget(new QLabel("是否有用户连接:")); ui->statusbar->addWidget(mstatus); } tcp::~tcp() { delete ui; } void tcp::on_setListen_clicked() { unsigned short port = ui->port->text().toUShort(); // 获取端口号 ms->listen(QHostAddress::Any, port); // 监听所有地址上的指定端口 ui->setListen->setDisabled(true); // 禁用监听按钮 page_scope->Chart_Init(); // 使用 page_scope 指针调用方法 page_scope->show(); this->hide(); // 隐藏本窗口 } void tcp::connectClient(QTcpSocket *clientSocket) { connectNum++; connect(clientSocket, &QTcpSocket::readyRead, this, [=]() { ui->usermsg->append("matlab发送信息"); QByteArray data = clientSocket->readAll(); if (data.isEmpty()) return; char dataType = data.at(0); // 读取前缀 data.remove(0, 1); // 移除前缀 if (dataType == 'T') { // 处理文本数据 QString message = QString::fromUtf8(data); ui->record->append("收到文本: " + message); } else if (dataType == 'D') { // 处理数字数据 QVector receivedData; int dataSize = data.size() / sizeof(double); for (int i = 0; i < dataSize; ++i) { double value; memcpy(&value, data.data() + i * sizeof(double), sizeof(double)); if (i>0) { page_scope->DrawLine(value); }// 绘制曲线解释代码: receivedData.append(QPointF(i, value)); } QString numbers; for (const QPointF& point : receivedData) { numbers += QString::number(point.y(), 'f', 6) + " "; } QString dataSizeStr = QString::number(dataSize); ui->record->append("收到数据长度: " + dataSizeStr + " 数据: " + numbers.trimmed()); ui->msg->append(numbers.trimmed()); on_sendMsg_clicked(); data.clear(); // 清空 data } }); connect(clientSocket, &QTcpSocket::disconnected, this, [=]() { clientSocket->close(); connectedClients.remove(clientSocket); connectNum = 0; // 更新状态栏 if (connectNum == 0) { mstatus->setPixmap(QPixmap(":/chat-bubble-xmark.svg").scaled(20, 20)); ui->usermsg->append("matlab断开连接"); } }); } // 接受TCP传输的文件 void tcp::receiveFile(const QString &filename, const QByteArray &data) { QString savePath = "./" + filename; QFile file(savePath); if (file.open(QIODevice::WriteOnly)) { // 进行Base64解码 QByteArray decodedData = QByteArray::fromBase64(data); // 将解码后的数据写入文件 file.write(decodedData); file.close(); ui->record->append("成功接收到文件: " + filename); } } void tcp::on_sendMsg_clicked() // 接受输入的消息并 发送消息 { // 发送数字1 // QByteArray data; // data.append('1'); // for (auto clientSocket : connectedClients.keys()) // { // // 遍历所有连接的客户端 // if (clientSocket->state() == QAbstractSocket::ConnectedState) // { // clientSocket->write(data); // 发送数据 // } // } // 发送ui->msg里面输入的文本 QString msg = ui->msg->toPlainText(); // 获取要发送的消息 QString serverMsg = 'D'+msg; // 添加服务器标识 for (auto clientSocket : connectedClients.keys()) { if (clientSocket->state() == QAbstractSocket::ConnectedState) { clientSocket->write(serverMsg.toUtf8()); // 发送消息 } } ui->record->append("服务端广播消息: " + msg); // 在记录中显示发送的消息 // 清空消息框 ui->msg->clear(); }