news 2026/6/22 19:10:24

Qt/C++ 实现文件双向传输:从客户端到服务端,再从服务端到客户端

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt/C++ 实现文件双向传输:从客户端到服务端,再从服务端到客户端

Qt/cpp实现的客户端往服务端传输文件、服务端往客户端传输文件,可监测传输状态,可控制传输。 源码: 使用Qt5.6.1_MinGW编译通过。 c.37

在很多网络应用场景中,文件的双向传输,也就是客户端往服务端传输文件以及服务端往客户端传输文件,并且能够监测传输状态和对传输进行控制,是非常常见的需求。今天就来聊聊如何使用 Qt/C++ 来实现这一功能。

一、环境说明

本文的代码使用 Qt5.6.1_MinGW 编译通过,确保你也配置好了相应的开发环境,以便顺利运行和理解代码。

二、客户端往服务端传输文件

1. 建立连接

首先,我们需要在客户端和服务端之间建立一个 TCP 连接。在 Qt 中,可以使用 QTcpSocket 来实现。

QTcpSocket *socket = new QTcpSocket(this); socket->connectToHost(QHostAddress::LocalHost, 1234); if(socket->waitForConnected(5000)) { qDebug() << "Connected to server!"; } else { qDebug() << "Could not connect: " << socket->errorString(); }

这里我们创建了一个 QTcpSocket 对象,并尝试连接到本地主机的 1234 端口。waitForConnected函数会阻塞等待,直到连接建立或者超时,这里设置的超时时间是 5 秒。如果连接成功,会输出连接成功的信息,否则输出错误信息。

2. 文件传输

接下来进行文件传输。假设我们要传输的文件是test.txt

QFile file("test.txt"); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Could not open file"; return; } qint64 totalBytes = file.size(); qint64 bytesWritten = 0; qint64 bytesToWrite = totalBytes; while(bytesToWrite > 0) { QByteArray buffer = file.read(qMin(bytesToWrite, (qint64)1024)); qint64 written = socket->write(buffer); if(written == -1) { qDebug() << "Write error: " << socket->errorString(); break; } bytesWritten += written; bytesToWrite -= written; qDebug() << "Transferred " << bytesWritten << " of " << totalBytes << " bytes"; } file.close(); socket->close();

首先打开要传输的文件,如果打开失败则输出错误信息并返回。获取文件的总大小totalBytes,然后循环读取文件内容并写入到 socket 中。每次读取最多 1024 字节的数据,写入成功后更新已传输字节数bytesWritten和剩余要传输字节数bytesToWrite,并输出当前传输进度。传输完成后关闭文件和 socket。

3. 监测传输状态

为了监测传输状态,我们可以在传输过程中实时输出已传输字节数和总字节数,就像上面代码中那样。也可以使用信号槽机制,比如QTcpSocketbytesWritten信号。

connect(socket, SIGNAL(bytesWritten(qint64)), this, SLOT(updateTransferProgress(qint64))); void MyClass::updateTransferProgress(qint64 bytes) { static qint64 totalBytes = 0; totalBytes += bytes; qDebug() << "Transferred " << totalBytes << " bytes so far"; }

这里将bytesWritten信号连接到自定义的槽函数updateTransferProgress,在槽函数中累加已传输字节数并输出。

4. 控制传输

可以通过一些逻辑来控制传输,比如暂停和继续。我们可以在连接成功后设置一个标志位来表示传输状态。

bool isPaused = false; // 假设这里有一个暂停按钮的点击事件槽函数 void MyClass::onPauseButtonClicked() { isPaused = true; socket->pause(); } // 继续按钮的点击事件槽函数 void MyClass::onResumeButtonClicked() { isPaused = false; socket->resume(); }

当点击暂停按钮时,设置isPaused为 true 并调用socket->pause()暂停传输;点击继续按钮时,设置isPaused为 false 并调用socket->resume()继续传输。

三、服务端往客户端传输文件

1. 监听连接

服务端需要监听客户端的连接请求,使用 QTcpServer 来实现。

QTcpServer *server = new QTcpServer(this); if(!server->listen(QHostAddress::LocalHost, 1234)) { qDebug() << "Could not start server: " << server->errorString(); return; } connect(server, SIGNAL(newConnection()), this, SLOT(handleNewConnection()));

创建一个 QTcpServer 对象并尝试监听本地主机的 1234 端口。如果监听失败,输出错误信息并返回。将newConnection信号连接到自定义的槽函数handleNewConnection,当有新的客户端连接时会调用这个槽函数。

2. 文件传输

handleNewConnection槽函数中进行文件传输。假设要传输的文件也是test.txt

void MyClass::handleNewConnection() { QTcpSocket *socket = server->nextPendingConnection(); QFile file("test.txt"); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Could not open file"; socket->close(); return; } qint64 totalBytes = file.size(); qint64 bytesWritten = 0; qint64 bytesToWrite = totalBytes; while(bytesToWrite > 0) { QByteArray buffer = file.read(qMin(bytesToWrite, (qint64)1024)); qint64 written = socket->write(buffer); if(written == -1) { qDebug() << "Write error: " << socket->errorString(); break; } bytesWritten += written; bytesToWrite -= written; qDebug() << "Transferred " << bytesWritten << " of " << totalBytes << " bytes"; } file.close(); socket->close(); }

这里获取新连接的 socket,打开要传输的文件,然后和客户端往服务端传输文件类似,循环读取文件内容并写入到 socket 中,实时输出传输进度。传输完成后关闭文件和 socket。

3. 监测传输状态与控制传输

和客户端类似,服务端也可以通过信号槽机制监测传输状态,比如使用bytesWritten信号。控制传输的逻辑也可以类似实现,设置标志位并通过相应的函数来暂停和继续传输。

通过以上步骤,我们就实现了 Qt/C++ 客户端往服务端传输文件、服务端往客户端传输文件,并且能够监测传输状态和控制传输的功能。希望这篇文章对你在网络文件传输相关的开发中有帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 2:29:58

医疗AI辅助诊断小程序:藏在便捷背后的技术底气

不用跑医院排队&#xff0c;打开手机小程序&#xff0c;上传症状描述或检查影像&#xff0c;几秒就能拿到AI辅助诊断建议——如今这样的医疗体验越来越常见。很多人觉得“好用”就够了&#xff0c;却不知道这些便捷背后&#xff0c;藏着好几项关键技术的支撑。作为深耕医疗数字…

作者头像 李华
网站建设 2026/6/21 19:55:17

mac 安装brew实战应用案例分享

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个mac 安装brew实战项目&#xff0c;包含完整的功能实现和部署方案。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 作为一名长期使用Mac进行开发的程序员&#x…

作者头像 李华
网站建设 2026/6/19 4:31:13

电商大屏:ResizeObserver实战案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个电商数据可视化仪表盘demo&#xff0c;使用ResizeObserver实现以下功能&#xff1a;1) 响应式图表自动重绘(ECharts实例resize) 2) 画布元素动态缩放 3) 字体大小自适应 4)…

作者头像 李华
网站建设 2026/6/22 15:21:41

5分钟搭建mac 安装brew原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速创建一个mac 安装brew概念验证原型&#xff0c;展示核心功能和用户体验。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 最近在帮同事配置新Mac开发环境时&#xff…

作者头像 李华
网站建设 2026/6/22 11:10:17

【Java毕设全套源码+文档】基于springboot的房屋租赁系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/19 16:21:28

SpringAI MCP入门:零基础搭建首个AI增强应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的SpringAI MCP学习项目&#xff0c;要求&#xff1a;1. 从零开始配置开发环境的分步指南&#xff1b;2. 实现一个带AI功能的TODO应用&#xff08;基础CRUD智能任务…

作者头像 李华