文章目录

  • 一、文件传输服务器端
  • 二、文件传输客户端

一、文件传输服务器端

  1. 服务器端前端设置
  2. pro文件中添加配置 QT += network CONFIG+= C++11
  3. 头文件中定义变量
    serverwidget.h

    QTcpServer *tcpServer;  // 监听套接字
    QTcpSocket *tcpSocket;  // 通信套接字QFile file;             // 传输的文件对象
    QString fileName;       // 文件名字
    qint64  fileSize;       // 文件大小
    qint64 sendSize;        // 已经发送的文件的大小QTimer timer;           // 定时器
    void sendData();    // 发送文件数据
    
  4. 文件传输方法的实现
    先设置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();}
    }
    

二、文件传输客户端

  1. 前端设计

  2. 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文件传输相关推荐

  1. python3 tcp 文件传输源码

    tcp文件传输 from socket import * s=socket() s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) s.bind(('0.0.0.0',45 ...

  2. 计算机网络实验传输文件,湖大计算机网络实验-tcp文件传输实验

    实验二 tcp文件传输 信息安全2班莫胜吕 20100830215 一,实验目的 掌握实现网络文件传输的方法,并了解TCP连接是字符流的二,实验内容 1,单线程的文件传输 2,多线程的文件传输 3,加 ...

  3. Linux下C语言实现TCP文件传输

    开发环境: Linux,GCC 功能介绍: 客户端和服务端的TCP文件传输,客户端可以上传文件到服务端,也可以从服务端下载文件,还可以查看和修改服务端的工作目录(临时),查看客户端当前目录. 代码下载 ...

  4. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  5. QT中TCP文件传输

    QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...

  6. qt+TCP文件传输

    简述 刚开始学习qt,在学习完网络编程后,觉得还是需要总结一下,毕竟总结才能更加的深刻. 本人第一次在csdn上写博客,想监督一下自己,让自己有一个学习的动力.好了不多说了, 目录 目录 简述 一.网 ...

  7. Qt5.4.1 局域网tcp文件传输工具带界面(含源码下载)

    目录 1.程序设计 2.程序效果 服务端 客户端 3.代码设计 服务端 客户端 4.实验可改进的地方: 点击下载例程源码  1.程序设计 在同一局域网内的两个设备,基于tcp网络编程,实现可靠的.高速 ...

  8. Qt TCP文件传输工具 源码分享

    前言 本章代码功能点 1.UDP广播方式与指定端口下所有用户建立连接 2.TCP服务器端作为文件发送者请求发送文件 3.TCP客户端作为文件接受者接受文件 4.对于传输一半的文件可以进行文件续传 程序 ...

  9. linux下c语言tcp文件传输,C语言实现TCP通信

    导读 如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字).socket(套接字):简单来讲,socket就是用于描述I ...

  10. TCP文件传输服务器

    服务器实现功能:利用网络编程实现上传下载文件,显示服务器和客户端所在路径所有文件:利用多线程实现并发服务器. 思路:1.服务器首先要设置好IP,端口等网络编程要使用到的信息:然后通过while循环实现 ...

最新文章

  1. 源创Talk第1期 | 对话晶泰科技赖力鹏:AI制药独角兽的崛起之路
  2. Taro+react开发(46)taro中环境判断
  3. 《游戏编程入门 4th》笔记(1 / 14):Windows初步
  4. “鸡肋”的百度,掉队了 BAT? | 畅言
  5. 零基础、转行学习Python是否还在纠结?这里告诉你答案!
  6. Android 开发高效工具之道
  7. 机房管理--如何应对学生关闭极域电子教室
  8. linux md5 大文件慢,【我的Linux,我做主!】浅谈MD5校验文件完整一致性
  9. Can‘t locate XXX/XXX.pm in @INC (you may need to install the XXX::XXX module)
  10. vlookup函数使用过程
  11. 论文解读:《Deep-4mcw2v: 基于序列的预测器用于识别大肠桿菌中的 N4- 甲基胞嘧啶(4mC)位点》
  12. 阿里云服务器ECS(VPS)介绍及使用视频教程和优惠活动
  13. 有米科技股份有限公司
  14. Python 3语法小记(四)字典 dictionary
  15. .o0博客导读0o. 1/23/2016最后更新
  16. DB4AI:使能数据库原生AI计算,助力数据湖场景业务成功
  17. XGBoost与GBDT比较
  18. 通过SQL语句计算两地的经纬度距离
  19. 与计算机有关的发明,计算机的发明与周易有关系吗?
  20. 鸿蒙os升级时间表,鸿蒙os2.0系统升级了什么_鸿蒙os2.0系统升级内容

热门文章

  1. 解决小程序使用wxCharts环形图时,值为0时安卓机不显示图的问题
  2. 二维数组作为参数,传入函数(最好用的)
  3. GRE作文备考技巧怎样避免低效率重复劳动?
  4. 佛山APP开发公司:女性APP开发应用分析
  5. 拳王虚拟项目公社:还不会截流?揭秘利用《三十而已》热门关键词截流日赚万元
  6. java商品信息管理实验报告_java学生信息管理系统实验报告
  7. (2O21全新升级)初学者教程零基础学习游戏建模
  8. 爱情呼叫转移-深度广度遍历(中)
  9. #pragma once 的意思
  10. 安全测试之AppScan