昨天我们写了QT之TCP网络编程,今天就来看一下,在QT下的文件传输,这是在昨天所写代码的基础上添加上的。。
先看一下最终效果:
文件传输主要步骤:
服务器端:
1、打开服务器端的文件所在路径
QString filePath = QFileDialog::getOpenFileName(this,"选择文件","../");
2、打开文件
bool isOK = file.open(QIODevice::ReadOnly);
3、先发送文件头部信息
//先发送文件头信息 文件名##文件大小
QString head = QString("%1##%2").arg(fileName).arg(fileSize);
//发送头部信息
qint64 len = tcpSocket->write(head.toUtf8());
4、发送真是的文件数据
//往文件里读数据
len = file.read(buf,sizeof(buf));
//发送数据,读多少,发多少
len = tcpSocket->write(buf,len);
客户端:
1、建立连接后收到服务器文件数据的信号槽
connect(tcpSocket,&QTcpSocket::readyRead,[=](){
});
2、解析头部信息
//解析头部信息,初始化
fileName = QString(buf).section("##",0,0);
fileSize = QString(buf).section("##",1,1).toInt();
3、打开文件
bool isOK = file.open(QIODevice::WriteOnly|QIODevice::Append);
4、读取文件信息
quint64 len = file.write(buf);
这里还是贴一下源码吧,虽然可以实现传输文件功能,由于在网络编程基础上修改的,里边还存在一些bug,有兴趣的同学可以修改一下,使其完美一些.
不要忘记在.pro文件中添加
QT += core gui network
serverwidget.h
#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H
#include <QWidget>
#include<QTcpServer>//监听套接字
#include<QTcpSocket>//通信套接字
#include<QFile>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class ServerWidget; }
QT_END_NAMESPACE
class ServerWidget : public QWidget
{
Q_OBJECT
public:
ServerWidget(QWidget *parent = nullptr);
~ServerWidget();
void sendData();//发送数据
private slots:
void on_ButtonSend_clicked();
void on_ButtonClose_clicked();
void on_ButtonFile_clicked();
void on_ButtonFileSend_clicked();
private:
Ui::ServerWidget *ui;
QTcpServer *tcpServer;//监听套接字
QTcpSocket *tcpSocket;//通信套接字
QFile file;//文件对象
QString fileName;//文件名称
quint64 fileSize;//文件大小
quint64 sendSize;//已经发送文件大小
QTimer timer;