123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #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<QPointF> 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();
- }
|