culturered_client/PhotoDisplay/NetClient.cpp
2024-09-07 11:34:44 +08:00

128 lines
3.2 KiB
C++

#include "NetClient.h"
#include <QCoreApplication>
#include <QHostAddress>
#include <QTcpSocket>
#include <QDataStream>
#include <QThread>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFileInfo>
#include <QFile>
#include <QDir>
#include "MainWindow.h"
NetClient::NetClient(QObject* param)
: QObject(param)
, m_udpSocket(new QUdpSocket(this)) {
}
bool NetClient::Start(quint16 port) {
qDebug() << "NetClient::Start listen port=" << port;
if (!m_udpSocket->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint)) {
qDebug() << "NetClient::Start listen failed";
return false;
}
qDebug() << "UpdClient threaid:" << QThread::currentThread();
connect(m_udpSocket, &QUdpSocket::readyRead, this, &NetClient::OnReadyRead);
return true;
}
void NetClient::Stop() {
//m_udpSocket->close();
}
void NetClient::OnReadyRead() {
qDebug() << "UpdClient threaid:" << QThread::currentThread();
while (m_udpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(m_udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
m_udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
ParseMessage(datagram);
qDebug() << "Received: " << datagram;
}
}
void NetClient::ParseMessage(const QByteArray& message) {
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(message, &error);
if (error.error != QJsonParseError::NoError) {
qDebug() << "parse JSON failed" << error.errorString();
return ;
}
if (!jsonDoc.isObject()) {
qDebug() << "parse JSON failed json doc is not object";
return;
}
QJsonObject jsonObj = jsonDoc.object();
QString cmd = jsonObj.value("cmd").toString();
QString fileName = jsonObj.value("file_name").toString();
// 打印解析结果
qDebug() << " cmd:" << cmd << " file_name:" << fileName;
if (cmd == "trans") {
}
}
void NetClient::DownlaodFile(const QString& fileName) {
QString url = "http://localhost:8000/" + fileName;
QNetworkReply* reply = m_manager.get(QNetworkRequest(QUrl(url)));
QObject::connect(reply, &QNetworkReply::finished, this, &NetClient::DownloadFinish);
}
void NetClient::DownloadFinish() {
QNetworkReply* reply = reinterpret_cast<QNetworkReply*>(sender());
if (reply->error() == QNetworkReply::NoError) {
const QString fileName = QFileInfo(reply->url().path()).fileName();
QString exeDirPath = qApp->applicationDirPath();
QString targetDirPath = exeDirPath + "/images";
QDir targetDir(targetDirPath);
if (!targetDir.exists()) {
if (!targetDir.mkpath(".")) { // 创建目录及其上级目录
qDebug() << "create dir failed";
reply->deleteLater();
return ;
}
}
QString targetFilePath = targetDirPath + "/" + fileName;
QFile file(targetFilePath);
if (file.open(QIODevice::WriteOnly)) {
file.write(reply->readAll());
file.close();
Q_EMIT FileReady(targetFilePath);
qDebug() << "文件下载完成,保存为 downloaded_file.jpg";
}
else {
qDebug() << "保存文件失败。";
}
}
else {
qDebug() << "下载失败:" << reply->errorString();
}
// 清理资源
reply->deleteLater();
}