借助上一篇文章的内容,在原有的TCP通讯的基础上,在服务端和客户端之间发送文件。

首先把在客户端加一个用于显示发送进度的进度条,在服务器端把原有的发送和关闭换为选择和发送,如下图所示

在客户端连接服务器之后建立套接字,服务器便通过判断是否有建立套接字,然后才可以选择文件,在connect函数内写上

//成功连接后,才能按选择文件
ui->buttonFile->setEnabled(true);

之后我们在serverwidget.h中定义文件,文件名,文件大小等变量,在serverwidget.cpp中引用,在选择按钮中建立槽函数。

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() << "只读方式打开文件失败 77 ";}ui->buttonFile->setEnabled(false);ui->buttonSend->setEnabled(true);}else{qDebug() << "选择文件路径出错 62";}

之后便通过发送按钮进行发送,在槽函数内我们要记住要定义文件头,防止黏包,也起到加密作用,之后再20ms后启动定时器开始发送

void ServerWidget::on_buttonSend_clicked()
{//先发送文件头信息QString head=QString("%1##%2").arg(fileName).arg(fileSize);//发送头部信息qint64 len =tcpSocket->write(head.toUtf8());if(len>0){//发送真正的文件信息//防止TCP黏包文件timer.start(20);}else{qDebug() << "头部信息发送失败 110";file.close();ui->buttonFile->setEnabled(true);ui->buttonSend->setEnabled(false);}
}

还有要特别注意发送必须要使用定时器,要不然发送会失败,我们在主函数connect函数下面添加定时器,还有在serverwidget.h中要定义变量QTimer timer;

connect(&timer,&QTimer::timeout,[=](){//关闭定时器timer.stop();//发送文件sendData();});

这样发送文件便完成了,紧接着我们在服务端中对发送过来的文件进行判断是否接收完成,把接收完成的信息返回给服务器,告诉它我已经接收完成。
首先,我们定义一个标志位isstart,用于判断是否可以接收,开始接收后,标志位就置false,防止再次接收。然后我们要对接收到的数据处理,判断文件头是否就是我们服务端发送的文件头,是就开始接收。

if(true==isStart)
{   //接收头isStart=false;//解析头部信息buf="hello##1024"//                    QString str="hello##1024mike";//                    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() << "WritOnly error 40";}//弹出对话框,显示接收文件的大小QString str=QString("接收的文件: [%1:%2kb]").arg(fileName).arg(fileSize);QMessageBox::information(this,"文件信息",str);//设置进度条ui->progressBar->setMinimum(0);ui->progressBar->setMaximum(fileSize/1024);ui->progressBar->setValue(0);
}

接收完后,我们在下面写一个else,判断已经接收完成,给服务器发送信息

else //文件信息
{qint64 len =file.write(buf);if(len>0){recvSize+=len;qDebug() <<len;}ui->progressBar->setValue(recvSize/1024);if(recvSize==fileSize){QString str=QString::number(recvSize);//tcpSocket->write(str.toUtf8().data());tcpSocket->write("file done");file.close();QMessageBox::information(this,"完成","文件接收完成");tcpSocket->disconnectFromHost();tcpSocket->close();}
}

然后在服务器端写上判断是否客户端是否接收完成

connect(tcpSocket,&QTcpSocket::readyRead,[=](){QByteArray buf=tcpSocket->readAll();if(QString(buf)=="file done"){//文件接收完毕ui->textEdit->append("接收完毕");file.close();//断开服务端端口tcpSocket->disconnectFromHost();tcpSocket->close();}else{qDebug() <<buf;}});

到这里就基本上完成了

02 Qt发送文件和接收相关推荐

  1. NodeJS代码直接发送文件及接收

    网络环境 系统有三个电脑:A和B在一个网段M,C单独在另一个网段N MN彼此不能访问,只有B能通过特殊方式访问C,反之不通 AB可以双向访问 A是前端服务器,BC都是后端服务器,安装有NodeJS+E ...

  2. Qt写的可以发送文件夹、图片、文件、文本内容的TCPServer、UDPServer

    Qt写的可以发送文件夹.图片.文件.文本内容的TCPServer.UDPServer TCP发送文件夹 TCP 客户端接收文件夹 UDP发送文件 UDP接收文件

  3. 把客户端文件发送到服务器,客户端向服务器发送文件

    客户端向服务器发送文件 内容精选 换一换 Microsoft SQL Server提供的发布与订阅功能,利用复制技术来实现数据同步,可以通过其提供的发布与订阅功能实现数据的读写分离和线下线上数据同步. ...

  4. 阿里旺旺发送文件以保存服务器,使用阿里旺旺收发文件

    您可能感兴趣的话题: 阿里旺旺 核心提示:我们都知道阿里旺旺是网络贸易在线沟通的好工具,不仅如此,阿里旺旺还提供了文件传送的功能,您可以及时便捷的将客户需要的报价单等传送给客户. 有三种方法可以将本地 ...

  5. flask和socket结合使用实现客户端向服务端发送文件

    文章目录 1.实验效果 2.文件结构说明 3.操作步骤 4.代码下载 5.服务端文件 6.客户端文件 7.前端文件 1.实验效果 成功发送文件和接收文件 2.文件结构说明 3.操作步骤 (1)首先运行 ...

  6. Smack+Openfire 接收和发送文件

    转载请注明出处:http://blog.csdn.net/steelychen/article/details/37958839 发送文件须要提供准确的接收放username称(例:user2@192 ...

  7. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  8. Qt多文件传输功能实现及方法概述

    Qt多文件传输功能实现 前言 代码实现概述 客户端代码实现 服务端代码 效果展示 结论 前言 本次设计主要是为了功能上的实现,因此对于ui界面的设计都是怎么简单怎么来的,主要的功能就是实现多个文件的发 ...

  9. qt+TCP文件传输

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

最新文章

  1. Luogu P1087 FBI树
  2. AI换脸技术再创新高度,DeepMind发布的VQ-VAE二代算法有多厉害?
  3. Linux下安装MongoDB全程记录
  4. SAP Spartacus module 层级结构设计的一种实践
  5. liunx java font_Linux下JDK中文字体乱码 | 学步园
  6. 传说中理科生看到会沉默、文科生看到会流泪的【程序员文史综合题目】
  7. Mybatis中强大的功能元素:resultMap
  8. 微服务之数据同步Porter 1
  9. python基础篇--从零开始(上)
  10. cvLaplace() 拉普拉斯变换
  11. docker 定时重启脚本_群晖docker容器定时自动重启
  12. 【Java】问题记录:fastjson中JSON.isValid()方法校验JSON合法性的BUG
  13. 关于怎么在图片里加边框,这几个好用软件就能实现
  14. RS232通信协议详解
  15. 自动化测试遇到的难点_自动化测试不成功的原因和实施过程中存在的问题
  16. 高防服务器与高防IP的区别和联系
  17. 您的私人助理已上线:保护重要数据的101条建议
  18. easy connect显示‘网络请求异常请稍后重试’
  19. Deadlock found when trying to get lock; try restarting transaction主要要是死锁问题呢怎么解决
  20. c语言12cr,计算机二级C语言讲义12.doc

热门文章

  1. php 发型,在线发型设计
  2. 盐城北大青鸟感恩节丨表达感恩 温暖加倍~
  3. N1, T1刷机记录
  4. 神武服务器维护打副本,神武什么时候维护_神武维护什么内容_快吧游戏
  5. cad是什么意思?如何查看cad格式的文件
  6. 高情商就是说话让人感到舒服
  7. web前端-01:关于css居中的几种方法
  8. 史上超级详细:java图片转二进制
  9. 一则很少人能看得懂的寓言!!
  10. 用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍