Qt07-TCP文件传输
文章目录
- 一、文件传输服务器端
- 二、文件传输客户端
一、文件传输服务器端
- 服务器端前端设置
- pro文件中添加配置 QT += network CONFIG+= C++11
- 头文件中定义变量
serverwidget.hQTcpServer *tcpServer; // 监听套接字 QTcpSocket *tcpSocket; // 通信套接字QFile file; // 传输的文件对象 QString fileName; // 文件名字 qint64 fileSize; // 文件大小 qint64 sendSize; // 已经发送的文件的大小QTimer timer; // 定时器 void sendData(); // 发送文件数据
- 文件传输方法的实现
先设置TCPServer和TCPSocket通信的连接
添加文件选择对话框,读取所选文件的信息(文件名以及大小)
文件传输,先传头部信息,为了防止粘包使用定时器在头信息传输成功后再传输文件内容ServerWidget::ServerWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ServerWidget) {ui->setupUi(this);// 初始化时候两个按钮应该是无效的ui->buttonSend->setEnabled(false);ui->buttonFile->setEnabled(false);// 监听套接字tcpServer = new QTcpServer(this);// 监听tcpServer->listen(QHostAddress::Any, 8888);setWindowTitle("服务端口为:8888");// 如果客户端和服务器连接成功,tcpServer会自动触发 newConnection()connect(tcpServer, &QTcpServer::newConnection,[=](){// 获取连接好的套接字tcpSocket = tcpServer->nextPendingConnection();// 获取对方的ip好端口QString ip = tcpSocket->peerAddress().toString();quint16 port = tcpSocket->peerPort();QString str = QString("[%1, %2] 成功连接").arg(ip).arg(port);ui->textEdit->append(str);// 连接成功后启用文件选择按钮ui->buttonFile->setEnabled(true);});connect(&timer, &QTimer::timeout, [=](){// 关闭定时器timer.stop();sendData();}); }ServerWidget::~ServerWidget() {delete ui; }// 选择文件的按钮 void ServerWidget::on_buttonFile_clicked() {QString filePath = QFileDialog::getOpenFileName(this, "open", "../");if(false == filePath.isEmpty()){ // 如果选择的文件有效// 获取信息前应当先清空fileName.clear();fileSize = 0;// 获取文件信息(以只读的方式打开)QFileInfo info(filePath);fileName = info.fileName();fileSize = info.size();sendSize = 0; // 发送文件的大小// 以只读的方式打开文件file.setFileName(filePath); // 指定文件名字bool isOk = file.open(QIODevice::ReadOnly); // 只读方式打开文件if(false == isOk){ui->textEdit->append("只读方式打开文件失败 70");}else{ui->textEdit->append(QString("打开的文件是: %1").arg(filePath));ui->buttonSend->setEnabled(true);}}else{qDebug() << "选择文件路径出错 74";} }// 发送文件按钮 void ServerWidget::on_buttonSend_clicked() {// 先发送文件头信息 文件名 ## 文件大小QString head = QString("%1##%2").arg(fileName).arg(fileSize);qint64 len = tcpSocket->write(head.toUtf8()); // 返回发送了多少信息if(len > 0){ // 头部信息发送成功// 发送真正的文件信息// 防止TCP粘包问题, 需要通过定时器延时20mstimer.start(20);}else{ui->textEdit->append("头部信息发送失败");file.close();ui->buttonSend->setEnabled(false);} }void ServerWidget::sendData() {qint64 len = 0;do{// 每次发送4k的数据char buf[4*1024] = {0};len = 0;// 读取file中数据,往buf中写数据,返回写入的数据长度len = file.read(buf, sizeof(buf));tcpSocket->write(buf, len);// 发送数据要累加sendSize += len;}while(len > 0);// 判断是否发送文件完毕if(sendSize == fileSize){ui->textEdit->append("文件发送完毕\n\n\n");file.close();// 与客户端连接关闭tcpSocket->disconnectFromHost();tcpSocket->close();} }
二、文件传输客户端
前端设计
clientwidget.cpp
#include "clientwidget.h"
#include "ui_clientwidget.h"#include <QTcpSocket>
#include <QMessageBox>
#include <QHostAddress>ClientWidget::ClientWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ClientWidget)
{ui->setupUi(this);isHead = true;tcpSocket = new QTcpSocket(this);connect(tcpSocket, &QTcpSocket::readyRead,[=](){// 取出接收的内容QByteArray buf = tcpSocket->readAll();if(true == isHead){ // 头信息isHead = false;// 解析头部信息 buf = "文件名 ## 大小"fileName = QString(buf).section("##", 0, 0); // 分割字符串fileSize = QString(buf).section("##", 1, 1).toInt();receiveSize = 0;ui->textEdit->append(buf);// 打开文件file.setFileName(fileName);bool isOK = file.open(QIODevice::WriteOnly);if(false == isOK){ui->textEdit->append("文件写入失败");tcpSocket->disconnectFromHost();tcpSocket->close();return ;}// 设置进度条ui->progressBar->setMinimum(0);ui->progressBar->setMaximum(fileSize/1024);ui->progressBar->setValue(0);}else{ // 文件信息qint64 len = file.write(buf);if(len > 0){receiveSize += len;ui->progressBar->setValue(receiveSize/1024);}if(receiveSize == fileSize){file.close();ui->textEdit->append("文件传输完成");QMessageBox::information(this, "完成", "文件接收完成");tcpSocket->disconnectFromHost();tcpSocket->close();isHead = true;}}});
}ClientWidget::~ClientWidget()
{delete ui;
}void ClientWidget::on_pushButton_clicked()
{// 获取服务器的ip和端口QString ip = ui->ipText->text();qint16 port = ui->portText->text().toInt();tcpSocket->connectToHost(QHostAddress(ip), port);
}
Qt07-TCP文件传输相关推荐
- python3 tcp 文件传输源码
tcp文件传输 from socket import * s=socket() s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind(('0.0.0.0',45 ...
- 计算机网络实验传输文件,湖大计算机网络实验-tcp文件传输实验
实验二 tcp文件传输 信息安全2班莫胜吕 20100830215 一,实验目的 掌握实现网络文件传输的方法,并了解TCP连接是字符流的二,实验内容 1,单线程的文件传输 2,多线程的文件传输 3,加 ...
- Linux下C语言实现TCP文件传输
开发环境: Linux,GCC 功能介绍: 客户端和服务端的TCP文件传输,客户端可以上传文件到服务端,也可以从服务端下载文件,还可以查看和修改服务端的工作目录(临时),查看客户端当前目录. 代码下载 ...
- c tcp服务器发送文件,c语言tcp文件传输
c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...
- QT中TCP文件传输
QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...
- qt+TCP文件传输
简述 刚开始学习qt,在学习完网络编程后,觉得还是需要总结一下,毕竟总结才能更加的深刻. 本人第一次在csdn上写博客,想监督一下自己,让自己有一个学习的动力.好了不多说了, 目录 目录 简述 一.网 ...
- Qt5.4.1 局域网tcp文件传输工具带界面(含源码下载)
目录 1.程序设计 2.程序效果 服务端 客户端 3.代码设计 服务端 客户端 4.实验可改进的地方: 点击下载例程源码 1.程序设计 在同一局域网内的两个设备,基于tcp网络编程,实现可靠的.高速 ...
- Qt TCP文件传输工具 源码分享
前言 本章代码功能点 1.UDP广播方式与指定端口下所有用户建立连接 2.TCP服务器端作为文件发送者请求发送文件 3.TCP客户端作为文件接受者接受文件 4.对于传输一半的文件可以进行文件续传 程序 ...
- linux下c语言tcp文件传输,C语言实现TCP通信
导读 如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字).socket(套接字):简单来讲,socket就是用于描述I ...
- TCP文件传输服务器
服务器实现功能:利用网络编程实现上传下载文件,显示服务器和客户端所在路径所有文件:利用多线程实现并发服务器. 思路:1.服务器首先要设置好IP,端口等网络编程要使用到的信息:然后通过while循环实现 ...
最新文章
- 源创Talk第1期 | 对话晶泰科技赖力鹏:AI制药独角兽的崛起之路
- Taro+react开发(46)taro中环境判断
- 《游戏编程入门 4th》笔记(1 / 14):Windows初步
- “鸡肋”的百度,掉队了 BAT? | 畅言
- 零基础、转行学习Python是否还在纠结?这里告诉你答案!
- Android 开发高效工具之道
- 机房管理--如何应对学生关闭极域电子教室
- linux md5 大文件慢,【我的Linux,我做主!】浅谈MD5校验文件完整一致性
- Can‘t locate XXX/XXX.pm in @INC (you may need to install the XXX::XXX module)
- vlookup函数使用过程
- 论文解读:《Deep-4mcw2v: 基于序列的预测器用于识别大肠桿菌中的 N4- 甲基胞嘧啶(4mC)位点》
- 阿里云服务器ECS(VPS)介绍及使用视频教程和优惠活动
- 有米科技股份有限公司
- Python 3语法小记(四)字典 dictionary
- .o0博客导读0o. 1/23/2016最后更新
- DB4AI:使能数据库原生AI计算,助力数据湖场景业务成功
- XGBoost与GBDT比较
- 通过SQL语句计算两地的经纬度距离
- 与计算机有关的发明,计算机的发明与周易有关系吗?
- 鸿蒙os升级时间表,鸿蒙os2.0系统升级了什么_鸿蒙os2.0系统升级内容