Qt多文件传输功能实现

  • 前言
  • 代码实现概述
    • 客户端代码实现
    • 服务端代码
    • 效果展示
  • 结论

前言

本次设计主要是为了功能上的实现,因此对于ui界面的设计都是怎么简单怎么来的,主要的功能就是实现多个文件的发送与接收,即客户端发送,服务端接收保存,并且删去客户端的已发送的文件。

代码实现概述

这里就不在概述tcp通信的相关的内容,主要围绕本文设计进行叙述:
第一就是文件发送的流程图,单次文件内容发送主要分为两次,首先是文件名,可用于服务端建立新的文件;其次是文件大小,可用服务端判断是否完全接收完;最后是文件地址,用于服务端删除客户端发送的文件,也可以把这认为是简单的协议:

第二就是多文件的发送:这里用到了QFileDialog类的getOpenFileNames函数(可以固定打开文件的类型),返回QStringList的文件路径集合,接下来就是遍历发送。
第三就是防止发生粘包的情况,使用QIODevice类waitForBytesWritten函数,每次等待数据内容发送。

客户端代码实现

tcpclient.h文件:

#ifndef TCPCLIENT_H
#define TCPCLIENT_H#include <QtWidgets/QMainWindow>
#include "ui_tcpclient.h"
#include <QHostAddress>
#include <QFile>
#include <QTcpSocket>class TcpClient : public QMainWindow
{Q_OBJECTpublic:TcpClient(QWidget *parent = 0);~TcpClient();void sendData();private:Ui::TcpClientClass ui;int port;QString ip;QTcpSocket *tcpSocket;   //服务端连接套接字QFile locFile;      //待发送的文件QList<QString> fileNames;QList<QString> paths;QList<qint64> fileSizes;qint64 sendSize;int sendTime;private slots:void slotSend();   //发送void slotOpen();   //打开文件void sendMessage();  //传输文件void sendData(int);
};#endif // TCPCLIENT_H

tcpclient.cpp文件:

#include "tcpclient.h"
#include <QFileDialog>
#include <QtDebug>
#include <QFileInfo>TcpClient::TcpClient(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);//初始化port = 8081;ip = "127.0.0.1";connect(ui.openButton,SIGNAL(clicked()),this,SLOT(slotOpen()));connect(ui.sendButton,SIGNAL(clicked()),this,SLOT(slotSend()));connect(ui.closeButton,SIGNAL(clicked()),this,SLOT(close()));ui.openButton->setEnabled(true);ui.sendButton->setEnabled(false);
}TcpClient::~TcpClient()
{}void TcpClient::slotOpen()
{//初始化数据fileNames.clear();fileSizes.clear();sendTime = 0;paths = QFileDialog::getOpenFileNames(this,"open file");    //当前目录下if (!paths.isEmpty()){for (int i = 0; i < paths.size(); i++){locFile.setFileName(paths[i]);if (locFile.open(QIODevice::ReadOnly)){//获取发送文件的信息QFileInfo info(paths[i]);fileNames.append(info.fileName());  //文件名fileSizes.append(info.size());      //文件大小}qDebug()<<"fileName:"<<fileNames[i]<<"fileSize:"<<fileSizes[i]<<"path:"<<paths[i];}}ui.sendButton->setEnabled(true);
}void TcpClient::slotSend()
{//创建连接服务器tcpSocket = new QTcpSocket(this);tcpSocket->connectToHost(ip,port);  //连接服务器,并发出connected()信号connect(tcpSocket,SIGNAL(connected()),this,SLOT(sendMessage()));   //传输文件槽函数
}void TcpClient::sendMessage()
{qDebug()<<"link successful";ui.sendButton->setEnabled(false);//先发送头,自定义组包, 文件名#文件大小,不是文件数据locFile.setFileName(paths[sendTime]);locFile.open(QIODevice::ReadOnly);QString head = QString("head#%1#%2#%3").arg(fileNames[sendTime]).arg(fileSizes[sendTime]).arg(paths[sendTime]);qDebug()<<"head:"<<head<<endl<<head.size();//发送头qint64 len = tcpSocket->write(head.toUtf8().data());tcpSocket->waitForBytesWritten();  //等待数据内容发送if (len > 0){sendData(sendTime); //发送内容数据}
}void TcpClient::sendData(int i)
{QByteArray buf = locFile.readAll();qint64 len = tcpSocket->write(buf);tcpSocket->waitForBytesWritten();  //等待数据内容发送sendSize = len;qDebug()<<"sendSize:"<<sendSize;if (sendSize == fileSizes[i]){qDebug()<<"send successful";locFile.close();tcpSocket->close();}if (i < paths.size()-1){slotSend();sendTime++;}
}

服务端代码

因为服务端的代码也比较简单,这里就不展示了。

效果展示

因为只是简单的功能设计,因此没有直观的展示,主要是客户端的发送截图,以及服务端对接收二进制文件内容的打印。
客户端界面:

服务端控制台打印文件内容:

结论

本次设计对单次文件传输是没什么问题的,主要的多文件传输时的粘包现象,本次设计经过验证对于多个小文件传输是没问题的,但是不排除大量的大文件不会出现问题。因此就需要一个更好更稳定的协议来保证,这次只是简单使用了等待传输的函数,后面我也会进一步进行更好的封包与解包的通信操作。见TCP解决粘包问题(结构数据封包拆包)

Qt多文件传输功能实现及方法概述相关推荐

  1. 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...

    文章主要为大家详细介绍了python实现ftp文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!!! 本文实例为大家分享了python实现ftp文件传输的具体 ...

  2. socket编程实现文件传输功能

    这节我们来完成 socket 文件传输程序,这是一个非常实用的例子.要实现的功能为:client 从 server 下载一个文件并保存到本地. 编写这个程序需要注意两个问题: 1) 文件大小不确定,有 ...

  3. Linux断开usb调试命令,Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】

    通过设置系统属性(System Property)[persist.sys.usb.config]即可实现关闭或打开USB调试和文件传输功能,其中mtp表示文件传输,adb表示adb调试,none表示 ...

  4. QT中级(6)基于QT的文件传输工具(2)

    QT中级(6)基于QT的文件传输工具(2) 本文实现第一步 1 新增功能 2 运行效果 3 实现思路 4 源代码 实现这个文件传输工具大概需要那几步? 实现多线程对文件的读写 实现TCP客户端和服务端 ...

  5. socket实现文件传输功能

    要实现的功能为:client 从 server 下载一个文件并保存到本地. 编写这个程序需要注意两个问题: 1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能 ...

  6. socket编程二十二:socket编程实现文件传输功能

    这节我们来完成 socket 文件传输程序,这是一个非常实用的例子.要实现的功能为:client 从 server 下载一个文件并保存到本地. 编写这个程序需要注意两个问题: 1) 文件大小不确定,有 ...

  7. socket 编程实现文件传输功能!强无敌,网络通讯的必备知识储备!

    socket 文件传输程序,这是一个非常实用的例子. 要实现的功能为:client 从 server 下载一个文件并保存到本地. 编写这个程序需要注意两个问题: ======== 1) 文件大小不确定 ...

  8. openssh相关文件传输功能

    putty中有pscp程序可以复制文件. 在linux下有scp和sftp访问openssh-server进行文件传输功能,用法详解man手册,比较简单. sftp类似于ftp,用法相近. copy ...

  9. Android关闭USB的ADB调试和文件传输功能(禁用USB)

    点击打开链接 通过设置系统属性(System Property)[persist.sys.usb.config]即可实现关闭或打开USB调试和文件传输功能,其中mtp表示文件传输,adb表示adb调试 ...

最新文章

  1. java循环购物车结算系统_原生JS实现购物车结算功能代码
  2. input的onkeyup效果 超级简短代码
  3. excel公式中更正错误 #N/A
  4. 互联网1分钟 | 1015
  5. Linux环境进程间通信---信号(下)
  6. 【转载】Centos7修改root密码
  7. 为什么在释放锁的时候是从 tail 进行扫描
  8. 使用手机测试、访问本地环境方法
  9. 2月上旬全球六大顶级域名最新动态 .COM占73.3%
  10. php globals_PHP $ GLOBALS(超级全局变量),带有示例
  11. 学完文本知识,我就直接看懂图片了!
  12. VSTO应用程序中加入键盘钩子
  13. 66. 加一(C, Python)
  14. c++读取ini的Section节名
  15. 一篇搞懂Android View
  16. XML通过XSL格式化的那点事(XML到自定义节点折叠显示)
  17. cxf webservice:异常SOAPFaultException: Unexpected wrapper element found解决
  18. 关于Python切片的问题,从左向右提取元素与从右向左提取元素
  19. apollo本地启动调方式
  20. 【狂神说Redis】1NoSQL概述1-2什么是NoSQL

热门文章

  1. 【Shiro】Unsatisfied dependency expressed through method 'securityManager' parameter 3
  2. vue eslint报错Expected linebreaks to be ‘LF‘ but found ‘CRLF‘
  3. 基于Docker搭建私有镜像仓库
  4. eslint airbnb 不允许尾随逗号
  5. 微信小程序报错 .wxss 无法找到
  6. vue图片查看控件v-viewer使用
  7. java常见数据校验
  8. java解析json数组对象_JAVA中快速解析JSON对象里包含的JSON数组
  9. .Net 中的封装知识点
  10. 东芝笔记本linux系统安装驱动,笔记本驱动,详细教您东芝笔记本无线网卡驱动怎么安装...