Qt下Tcp传输文件

文章目录

  • Qt下Tcp传输文件
  • 1.服务端
  • 2.客户端

1.服务端

//ServerWidgets.h
#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字
#include <QFile>
#include <QTimer>namespace Ui {class ServerWidget;
}class ServerWidget : public QWidget
{Q_OBJECTpublic:explicit ServerWidget(QWidget *parent = 0);~ServerWidget();void sendData(); //发送文件数据private slots:void on_buttonFile_clicked();void on_buttonSend_clicked();private:Ui::ServerWidget *ui;QTcpServer *tcpServer; //监听套接字QTcpSocket *tcpSocket; //通信套接字QFile file; //文件对象QString fileName; //文件名字qint64 fileSize; //文件大小qint64 sendSize; //已经发送文件的大小QTimer timer; //定时器};//ServerWidgets.cpp
#endif // SERVERWIDGET_H
#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>ServerWidget::ServerWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ServerWidget)
{ui->setupUi(this);//监听套接字tcpServer = new QTcpServer(this);//监听tcpServer->listen(QHostAddress::Any, 8888);setWindowTitle("服务器端口为:8888");//两个按钮都不能按ui->buttonFile->setEnabled(false);ui->buttonSend->setEnabled(false);//如果客户端成功和服务器连接//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->setText(str); //显示到编辑区//成功连接后,才能按选择文件ui->buttonFile->setEnabled(true);connect(tcpSocket, &QTcpSocket::readyRead,[=](){//取客户端的信息QByteArray buf = tcpSocket->readAll();if(QString(buf) == "file done"){//文件接收完毕ui->textEdit->append("文件发送完毕");file.close();//断开客户端端口tcpSocket->disconnectFromHost();tcpSocket->close();}});});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){qDebug() << "只读方式打开文件失败 106";}//提示打开文件的路径ui->textEdit->append(filePath);ui->buttonFile->setEnabled(false);ui->buttonSend->setEnabled(true);}else{qDebug() << "选择文件路径出错 118";}}
//发送文件按钮
void ServerWidget::on_buttonSend_clicked()
{ui->buttonSend->setEnabled(false);//先发送文件头信息  文件名##文件大小QString head = QString("%1##%2").arg(fileName).arg(fileSize);//发送头部信息qint64 len = tcpSocket->write( head.toUtf8() );if(len > 0)//头部信息发送成功{//发送真正的文件信息//防止TCP黏包//需要通过定时器延时 20 mstimer.start(20);}else{qDebug() << "头部信息发送失败 142";file.close();ui->buttonFile->setEnabled(true);ui->buttonSend->setEnabled(false);}
}void ServerWidget::sendData()
{ui->textEdit->append("正在发送文件……");qint64 len = 0;do{//每次发送数据的大小char buf[4*1024] = {0};len = 0;//往文件中读数据len = file.read(buf, sizeof(buf));//发送数据,读多少,发多少len = tcpSocket->write(buf, len);//发送的数据需要累积sendSize += len;}while(len > 0);//     //是否发送文件完毕
//     if(sendSize == fileSize)
//     {//         ui->textEdit->append("文件发送完毕");
//         file.close();//         //把客户端端口
//         tcpSocket->disconnectFromHost();
//         tcpSocket->close();
//     }}

2.客户端

//ClientWidgets.h
#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QFile>namespace Ui {class ClientWidget;
}class ClientWidget : public QWidget
{Q_OBJECTpublic:explicit ClientWidget(QWidget *parent = 0);~ClientWidget();private slots:void on_buttonConnect_clicked();private:Ui::ClientWidget *ui;QTcpSocket *tcpSocket;QFile file; //文件对象QString fileName; //文件名字qint64 fileSize; //文件大小qint64 recvSize; //已经接收文件的大小bool isStart;   //标志位,是否为头部信息
};#endif // CLIENTWIDGET_H//ClientWidgets.cpp
#include "clientwidget.h"
#include "ui_clientwidget.h"
#include <QDebug>
#include <QMessageBox>
#include <QHostAddress>ClientWidget::ClientWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ClientWidget)
{ui->setupUi(this);tcpSocket = new QTcpSocket(this);isStart = true;ui->progressBar->setValue(0); //当前值setWindowTitle("客户端");connect(tcpSocket, &QTcpSocket::readyRead,[=](){//取出接收的内容QByteArray buf = tcpSocket->readAll();if(true == isStart){//接收头isStart = false;//解析头部信息 QString buf = "hello##1024"//                    QString str = "hello##1024#mike";//                            str.section("##", 0, 0)//初始化//文件名fileName = QString(buf).section("##", 0, 0);//文件大小fileSize = QString(buf).section("##", 1, 1).toInt();recvSize = 0;   //已经接收文件大小//打开文件//关联文件名字file.setFileName(fileName);//只写方式方式,打开文件bool isOk = file.open(QIODevice::WriteOnly);if(false == isOk){qDebug() << "WriteOnly error 49";tcpSocket->disconnectFromHost(); //断开连接tcpSocket->close(); //关闭套接字return; //如果打开文件失败,中断函数}//弹出对话框,显示接收文件的信息QString str = QString("接收的文件: [%1: %2kb]").arg(fileName).arg(fileSize/1024);QMessageBox::information(this, "文件信息", str);//设置进度条ui->progressBar->setMinimum(0); //最小值ui->progressBar->setMaximum(fileSize/1024); //最大值ui->progressBar->setValue(0); //当前值}else //文件信息{qint64 len = file.write(buf);if(len >0) //接收数据大于0{recvSize += len; //累计接收大小qDebug() << len;}//更新进度条ui->progressBar->setValue(recvSize/1024);if(recvSize == fileSize) //文件接收完毕{//先给服务发送(接收文件完成的信息)tcpSocket->write("file done");QMessageBox::information(this, "完成", "文件接收完成");file.close(); //关闭文件//断开连接tcpSocket->disconnectFromHost();tcpSocket->close();}}});}ClientWidget::~ClientWidget()
{delete ui;
}void ClientWidget::on_buttonConnect_clicked()
{//获取服务器的ip和端口QString ip = ui->lineEditIP->text();quint16 port = ui->lineEditPort->text().toInt();//主动和服务器连接tcpSocket->connectToHost(QHostAddress(ip), port);isStart = true;//设置进度条ui->progressBar->setValue(0);
}

Qt下Tcp传输文件相关推荐

  1. Qt学习(八):QT中TCP传输文件

    知识点 服务端与客户端的通信 文件读写 文件窗口QFileDialog QString字符串的切分section 每次只发送4比特数据大小 先发送文件信息,再传数据,防止TCP黏包 QTimer使用 ...

  2. labview文件上传服务器,基于labview的局域网TCP传输文件夹问题的解决

    一.概述 用labview来做局域网的文件传输已经很久了,用tcp顺利解决了大文件的传输,其中包括几个G的文件,然而当你遇到一个文件夹里面包含的很多小文件需要传输时,一个个单独选择文件显得非常麻烦,因 ...

  3. 用Ubuntu16.04的vi编辑器编辑qt下的默认文件(/usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf)

    vi编辑器跟一般的文本编辑器不同,完全是终端编辑的,因此需要靠输入命令来修改vi的编辑属性. 这个网址是vi编辑器的快捷键和对应的功能:https://www.cnblogs.com/junw_chi ...

  4. linux下adb传输文件,使用adb在电脑和手机间传文件,adb手机传文件

    使用adb在电脑和手机间传文件,adb手机传文件 首先需要root手机. 然后,"Win + R",打开cmd窗口.下面以copy d:\1.txt到/system/目录为例说明 ...

  5. 计算机网络|iperf测量不同拥塞控制下TCP传输性能

    系列文章目录 待更新- 文章目录 系列文章目录 前言 一.实验准备 二.操作内容及步骤 1.内核相关指令 2.iperf or iperf3 什么是iperf/iperf3? iperf特性 3.tc ...

  6. ubuntu下Xshell传输文件

    如何通过Xshell传输文件到ubuntu 先执行rz命令 他会提醒你,先sudo apt install lrzsz 然后执行完这个命令之后再执行rz 他就会让你选择要传输的文件 然后回到ubunt ...

  7. linux下远程传输文件命令scp使用注解

    scp 命令是 SSH 中最方便有用的命令了,scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 . 与rcp 不同 ...

  8. tomcat介绍和TCP传输文件的实现

    服务器端 自定义S(原始方法) tomcat服务器S:java后台开发(目前现状) 客户端 自定义C(原始方法) 浏览器C(目前现状) 客户端代码 package com.netCode;import ...

  9. Linux环境下FTP传输文件无反应

    前提条件: 本地Windows服务器下,文件上传运行正常,部署jar包Linux环境上,上传文件无反应: 1 在FTP服务中,涉及到客户端和服务器端的连接,连接就会涉及到端口的打开问题: 2 而端口的 ...

最新文章

  1. ITK:在图像中查找连接的组件
  2. 基于pt100温度计仿真_基于8pt网格的设计系统
  3. 如何获得带时间的ping的结果
  4. 机器学习理论梳理2 : KNN K近邻分类模型
  5. Change Value to Reference(将值对象改为引用对象)
  6. 华为彭松:基于C.A.F模型构建联接竞争力,创造新增长
  7. w7系统计算机里没有摄像头,win7系统没有摄像头不能视频的几种原因和解决方法...
  8. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法
  9. 解析全球热点安全事件背后的玄机
  10. css如何设置固定位置,用css固定位置的方法
  11. 图片涂改了怎么给复原_图片马赛克怎么去掉 怎么去除马赛克方法介绍
  12. html css手机端响应式登录页面
  13. python项目简历内容包括哪些_python简历内容
  14. PR 2019 快速入门(8)
  15. 光线追踪技术 第二章
  16. 设置不显示桌面上的计算机图标不见了,显示桌面,教您显示桌面图标不见了如何恢复...
  17. 运行提速:让电脑从拖拉机引擎变成宝马引擎必备知识
  18. 动手搭建自己的本地测试服务器
  19. 柱状图python_化学领域里「过柱子」是什么意思?柱子干了为什么可怕?
  20. Java中静态方法的调用格式

热门文章

  1. ubuntu中用apt命令卸载软件
  2. react跳转url,跳转外链,新页面打开页面
  3. [20180428]DNS与ORA-12154错误.txt
  4. 跨入安全的殿堂--读《Web入侵安全测试与对策》感悟
  5. 【Lucene4.8教程之二】索引
  6. Ubuntu 安装系统资源托盘监视应用
  7. RHEL 6.5 rpm包安装mplyer
  8. 使用 Apache Lucene 搜索文本——轻松为应用程序构建搜索和索引功能
  9. 精通Android3笔记--第四章
  10. Linux网络协议栈(二)——套接字缓存(socket buffer)