QT的文件传输

这篇博客介绍了如何使用QT实现TCP协议的文件传输。在客户端,文章详细阐述了如何连接服务器,发送文件大小信息及文件数据,并通过信号和槽进行处理。在服务器端,接收连接并接收数据,更新进度条直至接收完成。整个过程涉及到QT的TCPSocket和QFile等相关类的使用。
摘要由CSDN通过智能技术生成

在上一节里我们使用TCP服务器发送一个字符串,然后在TCP客户端进行接收。在这一节我们重新写一个客户端程序和一个服务器程序,这次我们让客户端进行文件的发送,服务器进行文件的接收。有了上一节的基础,这一节的内容就很好理解了,注意一下几个信号和槽的关联即可。当然,我们这次要更深入了解一下数据的发送和接收的处理方法。

 

一、客户端

这次我们先讲解客户端,在客户端里我们与服务器进行连接,一旦连接成功,就会发出connected()信号,这时我们就进行文件的发送。

在上一节我们已经看到,发送数据时我们先发送了数据的大小信息。这一次,我们要先发送文件的总大小,然后文件名长度,然后是文件名,这三部分我们合称为文件头结构,最后再发送文件数据。所以在发送函数里我们就要进行相应的处理,当然,在服务器的接收函数里我们也要进行相应的处理。对于文件大小,这次我们使用了qint64,它是64位的,可以表示一个很大的文件了。

1.同前一节,我们新建工程,将工程命名为“tcpSender”。注意添加network模块。

2.我们在widget.ui文件中将界面设计如下。

 Hosted by ImageHost.org

这里“主机”后的Line Edit的objectName为hostLineEdit;“端口”后的Line Edit的objectName为portLineEdit;下面的Progress Bar的objectName为clientProgressBar,其value属性设为0;“状态”Label的objetName为clientStatusLabel;“打开”按钮的objectName为openButton;“发送”按钮的objectName为sendButton;

3.在widget.h 文件中进行更改。

(1)添加头文件#include <QtNetwork>

(2)添加private变量:

QTcpSocket *tcpClient;

    QFile *localFile;  //要发送的文件

    qint64 totalBytes;  //数据总大小

    qint64 bytesWritten;  //已经发送数据大小

    qint64 bytesToWrite;   //剩余数据大小

    qint64 loadSize;   //每次发送数据的大小

    QString fileName;  //保存文件路径

QByteArray outBlock;  //数据缓冲区,即存放每次要发送的数据

(3)添加私有槽函数:

private slots:

    void send();  //连接服务器

    void startTransfer();  //发送文件大小等信息

    void updateClientProgress(qint64); //发送数据,更新进度条

    void displayError(QAbstractSocket::SocketError); //显示错误

void openFile();  //打开文件

4.widget.cpp文件中进行更改。

添加头文件:#include <QFileDialog>

(1)在构造函数中添加代码:

loadSize = 4*1024;

    totalBytes = 0;

    bytesWritten = 0;

    bytesToWrite = 0;

    tcpClient = new QTcpSocket(this);

    connect(tcpClient,SIGNAL(connected()),this,SLOT(startTransfer()));

    //当连接服务器成功时,发出connected()信号,我们开始传送文件

    connect(tcpClient,SIGNAL(bytesWritten(qint64)),this,

SLOT(updateClientProgress(qint64)));

    //当有数据发送成功时,我们更新进度条

    connect(tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),this,

            SLOT(displayError(QAbstractSocket::SocketError)));

    ui->sendButton->setEnabled(false);

    //开始使”发送“按钮不可用

我们主要是进行了变量的初始化和几个信号和槽函数的关联。

(2)实现打开文件函数。

void Widget::openFile()   //打开文件

{

    fileName

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值