qt tcp传输发送接收显示进度条
时间: 2023-08-15 11:07:12 浏览: 235
客户端发送文件服务端收.rar
实现 TCP 传输发送接收并显示进度条的过程可以分为以下几步:
1. 创建一个 TCP 客户端和一个 TCP 服务器,确保客户端和服务器能够正常连接并通信。
2. 在客户端界面中添加一个进度条控件,用于显示文件传输进度。
3. 在客户端中选择要传输的文件,并将文件内容读入到 QByteArray 中。
4. 在客户端中向服务器发送文件大小和文件名等信息,并等待服务器回复确认信息。
5. 从 QByteArray 中读取数据并将其分段发送给服务器,每发送一个数据段就更新进度条的值。
6. 在服务器中接收数据段,并将其写入到文件中。
7. 在服务器中向客户端发送确认信息。
8. 在客户端接收确认信息,并更新进度条的值。
下面是一个简单的示例代码,用于实现上述过程:
```cpp
// 客户端发送文件的函数
void sendFile(QTcpSocket* socket, const QString& filePath, QProgressBar* progressBar) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "打开文件失败";
return;
}
QByteArray fileData = file.readAll();
qint64 fileSize = file.size();
QString fileName = QFileInfo(filePath).fileName();
// 发送文件信息
QByteArray fileInfo;
QDataStream dataStream(&fileInfo, QIODevice::WriteOnly);
dataStream << fileName << fileSize;
socket->write(fileInfo);
// 等待确认信息
if (!socket->waitForReadyRead()) {
qDebug() << "等待确认信息超时";
return;
}
QByteArray confirmData = socket->readAll();
if (confirmData != "OK") {
qDebug() << "接收确认信息失败";
return;
}
// 发送文件数据
int blockSize = 1024 * 1024;
int blockCount = fileSize / blockSize + 1;
int currentBlock = 1;
int sentSize = 0;
progressBar->setRange(0, blockCount);
progressBar->setValue(0);
for (int i = 0; i < blockCount; ++i) {
int size = qMin(blockSize, (int)(fileSize - sentSize));
QByteArray data = fileData.mid(sentSize, size);
socket->write(data);
sentSize += size;
currentBlock++;
progressBar->setValue(currentBlock);
}
}
// 服务器接收文件的函数
void receiveFile(QTcpSocket* socket, const QString& savePath) {
// 接收文件信息
QByteArray fileInfo = socket->readAll();
QDataStream dataStream(&fileInfo, QIODevice::ReadOnly);
QString fileName;
qint64 fileSize;
dataStream >> fileName >> fileSize;
QFile file(savePath + "/" + fileName);
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "创建文件失败";
socket->write("Error");
return;
}
socket->write("OK");
// 接收文件数据
int blockSize = 1024 * 1024;
int blockCount = fileSize / blockSize + 1;
int currentBlock = 1;
int receivedSize = 0;
while (receivedSize < fileSize) {
QByteArray data = socket->read(qMin(blockSize, (int)(fileSize - receivedSize)));
file.write(data);
receivedSize += data.size();
currentBlock++;
}
file.close();
socket->write("OK");
}
```
在客户端界面中,可以通过以下代码调用 sendFile() 函数并显示进度条:
```cpp
QString filePath = QFileDialog::getOpenFileName(this, tr("选择文件"), QDir::homePath());
if (!filePath.isEmpty()) {
QProgressBar* progressBar = new QProgressBar();
ui->verticalLayout->addWidget(progressBar);
QThread* thread = new QThread();
TcpClient* client = new TcpClient();
client->moveToThread(thread);
connect(thread, &QThread::finished, client, &QObject::deleteLater);
connect(thread, &QThread::started, [=]() {
client->connectToServer();
sendFile(client->socket(), filePath, progressBar);
client->disconnectFromServer();
thread->quit();
});
thread->start();
}
```
在服务器端,可以通过以下代码调用 receiveFile() 函数:
```cpp
connect(socket, &QTcpSocket::readyRead, [=]() {
receiveFile(socket, savePath);
});
```
需要注意的是,以上代码仅为示例,实际应用中需要进行更多的错误处理和安全性检查。
阅读全文