QT基于TCP实现文件传输系统

本文实例为大家分享了QT基于TCP实现文件传输系统的具体代码,供大家参考,具体内容如下

一、设计目标

1、发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口号

2、接收到数据后显示接收进度,接收完毕后进度条自动消失

二、效果展示

三、实现过程

Qt文件传输发送端

1. 连接服务器

2. 当连接成功后会发送connected信号

3. 在槽函数中发送文件头信息

4. 当数据发送成功后会发送bytesWritten

5. 在槽函数中发送文件内容

UI布局

filesend.h

class FileSend : public QWidget
{
    Q_OBJECT
 
public:
    explicit FileSend(QWidget *parent = nullptr);
    ~FileSend();
private slots:
    void on_selectBt_clicked();
    void on_sendBt_clicked();
    void send_file_head();
    void send_file_text();
private:
    Ui::FileSend *ui;
    QTcpSocket msocket;
    QFile file;
    QString filename;
    quint64 filesize;
    quint64 sendsize;
};

filesend.cpp

#include "filesend.h"
#include "ui_filesend.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QDataStream>
 
FileSend::FileSend(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileSend)
{
    ui->setupUi(this);
    //当客户端连接成功会发送connected信号, 当客户端掉线会发送disconnected信号
    connect(&msocket, &QTcpSocket::connected, this, &FileSend::send_file_head);
 
    //当套接字发送完毕会发送一个信号bytesWritten
    connect(&msocket, &QTcpSocket::bytesWritten, this, &FileSend::send_file_text);
 
}
 
FileSend::~FileSend()
{
    delete ui;
}
 
void FileSend::on_selectBt_clicked()
{
    //通过文件对话框获取文件路径
    QString filepath = QFileDialog::getOpenFileName(this);
    ui->fileEdit->setText(filepath);
}
 
void FileSend::on_sendBt_clicked()
{
    //连接服务器
    msocket.connectToHost(ui->ipedit->text(), ui->portedit->text().toUShort());
 
    //发送文件信息
    qDebug()<<"connect";
 
    //初始化
    filesize = 0;
    sendsize = 0;
}
 
//发送文件头信息
void FileSend::send_file_head()
{
    //发送文件名,文件大小
    QFileInfo info(ui->fileEdit->text());//文件信息对象
    filename = info.fileName();
    filesize = info.size();
 
    QByteArray array; //空间
    //把array与数据流绑定
    QDataStream stream(&array, QIODevice::WriteOnly);
    stream<<filesize<<filename;
 
    //设置进度条最大值
    ui->progressBar->setMaximum(filesize);
 
    //打开文件准备读取数据发送
    file.setFileName(ui->fileEdit->text());
    file.open(QIODevice::ReadOnly);
 
    //发送
    msocket.write(array);
}
 
void FileSend::send_file_text()
{
    if(sendsize < filesize)
    {
        QByteArray array = file.read(1024*10);//读取一段内容
        msocket.write(array);//发送一段内容
        sendsize += array.size();
        //设置进度条
        ui->progressBar->setValue(sendsize);
    }
    if(sendsize == filesize)
    {
        file.close();//关闭文件
    }
}

Qt文件传输接收端

1.创建服务器, 监听,当有客户端连接的时候发送newConnection信号,

2.在槽函数中创建与客户端通信的套接字QTcpSocket

3.当客户端发送数据是QTcpSocket对象会发送readyRead信号

4.在槽函数中读取数据

根据文件大小判断是否是第一次读取数据filesize==0

UI布局

filerecv.h

#ifndef FILERECV_H
#define FILERECV_H
 
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
 
namespace Ui {
class FileRecv;
}
 
class FileRecv : public QWidget
{
    Q_OBJECT
 
public:
    explicit FileRecv(QWidget *parent = nullptr);
    ~FileRecv();
protected slots:
    void read_data();
    void new_client();
private:
    Ui::FileRecv *ui;
    QTcpServer mserver;
    QFile file;
    QString filename;
    quint64 filesize;
    quint64 recvsize;
};
 
#endif // FILERECV_H
#include "filerecv.h"
#include "ui_filerecv.h"
#include <QDataStream>
FileRecv::FileRecv(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileRecv)
{
    ui->setupUi(this);
    //关联客户端连接信号
    connect(&mserver, &QTcpServer::newConnection, this, &FileRecv::new_client);
    //启动服务器
    mserver.listen(QHostAddress::Any,8080);
}
 
FileRecv::~FileRecv()
{
    delete ui;
}
void FileRecv::new_client()
{
    //创建与客户端通信的套接字
    QTcpSocket *msocket = mserver.nextPendingConnection();
    //关联读数据信号readyRead
    connect(msocket, &QTcpSocket::readyRead, this, &FileRecv::read_data);
    filesize = 0;
    recvsize = 0;
}
 
void FileRecv::read_data()
{
    QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());
    if(filesize == 0) //表达第一次读取数据--读文件信息
    {
        QByteArray array = msocket->readAll();
        QDataStream stream(&array, QIODevice::ReadOnly);//把套接字与数据流绑定
        stream>>filesize>>filename;//获取文件大小, 文件名
 
        //设置进度条最大值
        ui->progressBar->setMaximum(filesize);
 
        //打开文件
        file.setFileName(filename);
        file.open(QIODevice::WriteOnly);
 
        //显示进度条
        this->show();
    }
 
    //读文件内容
    if(recvsize <  filesize)
    {
        //读取一段写一段
        QByteArray array = msocket->readAll();
        file.write(array);
        recvsize += array.size();
        //更新进度条
        ui->progressBar->setValue(recvsize);
    }
 
    if(recvsize == filesize)
    {
        //读完,关闭文件
        file.close();
        //关闭套接字
        msocket->disconnectFromHost();
        //隐藏进度条
        this->hide();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • QT UDP网络编程实现简单消息传输

    本文实例为大家分享了QT UDP实现简单消息传输的具体代码,供大家参考,具体内容如下 这几天看了下Qt的udp,顺便实现了下简单的消息传输,看起来比较简单. UDP服务器: 截图如下: 代码: server.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QUdpSocket> #include<QtNetwork> #include<QLabel> #include<QP

  • QT实现视频传输功能

    本文实例为大家分享了QT实现视频传输功能的具体代码,供大家参考,具体内容如下 前言 我们经常会进行视频的传输,这篇文章我们将讲解QT下的视频传输. 客户端 udp客户端,我们主要获取某个视频的文件,采用opencv读取后,分帧传输.我们将图片解码成base-64格式 参考代码 #include "ImageClient.h" #include<QDebug> #include<QBuffer> #include<QFileDialog> #inclu

  • 基于QT制作一个简易的传输文件小工具

    最近因为一个事情很恼火,因为办公需要用到企业微信,但是企业微信只能在一个电脑上登陆,所以当别人发文件给你的时候,你只能一个电脑接收,创建共享文件夹也很麻烦,每次都需要去访问,很麻烦.所以准备自己写一个文件传输小工具. 功能就是能实现文件的双向传输,即客户端能传给服务端,服务端可以传给客户端. 使用的tcp通信,其实就是发消息,但是组合数据我是借鉴了IT1995大神写的代码. 先看下效果图 可以看到既可以接受文件也可进行发送文件,只要2台电脑在统一局域网内,就可发送和接受数据. 本地文件下出现了一

  • python使用MQTT给硬件传输图片的实现方法

    最近因需要用python写一个微服务来用MQTT给硬件传输图片,其中python用的是flask框架,大概流程如下: 协议为: 需要将图片数据封装成多个消息进行传输,每个消息传输的数据字节数为1400Byte. 消息(MQTT Payload) 格式:Web服务器-------->BASE: 反馈:BASE---------> Web服务器: 如果Web服务器发送完一个"数据传输消息"后,5S内没有收到MQTT"反馈消息"或者收到的反馈中显示"

  • QT实现文件传输功能

    本文实例为大家分享了QT实现文件传输功能的具体代码,供大家参考,具体内容如下 过程如下: 1.服务器端设置监听套接字,开始监听: 2.客户端在连接成功时开始传送文件,有connected()信号连接send()槽,send()发送文件头信息,包括文件名.文件总大小和文件名大小等: 3.传送完文件头信息时开始传送文件内容,有bytesWritten(qint64)信号连接到goOnSend(qint64)槽,前者是当想套接字写入数据时会出发的信号,即当已经想套接字写入数据,就继续传送数据,有sen

  • QT基于TCP实现文件传输系统

    本文实例为大家分享了QT基于TCP实现文件传输系统的具体代码,供大家参考,具体内容如下 一.设计目标 1.发送端选择要传输的文件,进度条显示传输的进度,手动输入要传输的ip地址和端口号 2.接收到数据后显示接收进度,接收完毕后进度条自动消失 二.效果展示 三.实现过程 Qt文件传输发送端 1. 连接服务器 2. 当连接成功后会发送connected信号 3. 在槽函数中发送文件头信息 4. 当数据发送成功后会发送bytesWritten 5. 在槽函数中发送文件内容 UI布局 filesend.

  • python3.5基于TCP实现文件传输

    本文实例为大家分享了python3.5基于TCP实现文件传输的具体代码,供大家参考,具体内容如下 服务器代码 # _*_ coding:utf-8 _*_ from socket import * import _thread def tcplink(skt,addr): print(skt) print(addr,"已经连接上...") print('开始发送文件') with open('./ww.jpg', 'rb') as f: for data in f: print(dat

  • QT基于TCP实现网络聊天室程序

    本文实例为大家分享了QT学习:基于TCP的网络聊天室程序,供大家参考,具体内容如下 TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用TCP传输数据,但在正式收发数据前,通信双方必须首先建立连接. 二.TCP编程模型 下面介绍基于TCP的经典编程模型,TCP客户端与服务器间的交互时序如下图所示: 三.TCP服务器端编程实例 TCP服务器端的具体实现

  • Qt基于TCP实现客户端与服务端的连接

    Qt TCP的客户端与服务端的连接,供大家参考,具体内容如下 可以实现局域网内简单的信息传递(文件传输,稍后更新) 界面是用ui设计师做的简单设计 客户端 (1).ClientWidget.h 头文件 #ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H #include <QWidget> #include "ui_ClientWidget.h" #include <QTcpSocket> #include <QHo

  • QT基于TCP网络聊天室

    本文实例为大家分享了QT实现网络聊天室的具体代码,供大家参考,具体内容如下 1.客户端 1.1UI设计 分两个部分,第一部分是消息区里面包含QPlainTextEdit和QListWidget,要显示接收的消息和在线的成员.第二部分QLineEdit发生字符. 1.2 子模块 1.2.1 登录界面 登录界面主要就是要有验证码,防止恶意程序的攻击.通过paintEvent画出一个白色矩形,在白色矩形里面显示四个不同颜色的字母以及随机出现的噪点. 代码: QLoginDialog.h #ifndef

  • 基于QT的TCP通信服务的实现

    目录 一.结构 1.1 套接字 1.2 socket通信流程 1.3 QTcpsocket 1.4 QTcpServer 二.设计UI 2.1 客户端UI 2.2 服务器端UI 三.核心代码 四.效果图 一.结构 1.1 套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字

  • 基于Qt的TCP实现通信

    本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下 一.tcp介绍 TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:服务端:负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互:客户端:负责每次连接的发起,建立连接后才可以进行通信: 二.界面设计 服务器端 客户端 三.具体程序设计 (1)服务器端设计 1.建立一个工程,工程名为tcpserver,类名为server.在.pro文件中加入如下代码并保存. QT    

  • python3基于TCP实现CS架构文件传输

    本文实例为大家分享了python3实现CS架构文件传输的具体代码,供大家参考,具体内容如下 1.目标: 基于tcp实现CS架构的文件传输 指令列表:(1)get:从服务器端下载文件 (2)put:向服务器端上传文件 (3)list:获得服务器端的目录 2.socket模块函数: (1)send和sendall:send的作用是发送TCP数据,返回发送的数据大小.send函数不保证将所有数据全部发送,因此可能需要重复多次才能完成所有数据的发送.sendall的作用是发送完整的TCP数据,成功时返回

  • Java 基于tcp协议实现文件上传

    服务端 package lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 服务端接收文件 */ public class TcpServerDemo2 { public static void main(String[] args) throws IOException { //1.创建服务 ServerSocket serverSocket = new ServerSo

  • Java 基于TCP Socket 实现文件上传

    文件上传过程一个单向Socket通信过程.客户端通过文件输入流读取文件,然后从Socket获取输出流写入数据.服务端从Socket中获得输入流,然后写入文件输出流,写入数据完成则上传完成. 服务端UploadServer: public class UplaodServer { public static void main(String []args){ try( // 创建一个ServerSocket监听8080端口的请求 // ServerSocket 实现了 AutoCloseable接

随机推荐