QT文件传输(简单版)

QT文件传输(简单版)

这是用QT写的一篇简单的文件传输,只是考虑了黏包问题,并没有考虑进度条和线程问题

一、原理图

二、服务器端TCPSocket通信连接

Pro中加network
头文件:
QTcpSocket通信套接字
QTcpServer监听套接字
QFile 文件操作
QTimer定时器(防止黏包)
函数

  1. FileServer()//构造函数
FileServer()
{ui->setupUi(this);sendSize = 0;setWindowTitle("服务器端口:8888");m_tcpServer = new QTcpServer(this);//隐藏按钮ui->buttonSelect->setEnabled(false);ui->buttonSend->setEnabled(false);//监听m_tcpServer->listen(QHostAddress::Any,8888);connect(m_tcpServer,&QTcpServer::newConnection,this, &FileServer::slotNewconnection);//定时信号,当文件头信息发送完成时,发送文件本体connect(&timer, &QTimer::timeout,this, &FileServer::slotSend);
}

2.当有客户端连接时,打印客户端IP和端口号,及使选择文件按钮可点

void slotNewconnection();
{m_tcpsocket = m_tcpServer->nextPendingConnection();QString ip = m_tcpsocket->peerAddress().toString();quint16 port = m_tcpsocket->peerPort();QString str = QString("[%1 : %2]:成功连接").arg(ip).arg(port);ui->textBrowser->setText(str);//连接成功后可以选择文件ui->buttonSelect->setEnabled(true);
}

3.选择文件
void FileServer::on_buttonSelect_clicked()

void FileServer::on_buttonSelect_clicked()
{QString filePath = QFileDialog::getOpenFileName(this, "open", "../");//文件选择对话框的内容if(!filePath.isEmpty())//文件选择成功{//初始化信息fileName.clear();fileSize = 0;QFileInfo info(filePath);fileName = info.fileName();fileSize = info.size();file.setFileName(filePath);bool isOK = file.open(QIODevice::ReadOnly);if(!isOK){qDebug() << "只读方式打开失败";}ui->textBrowser->append(filePath);//显示到界面ui->buttonSelect->setEnabled(false);ui->buttonSend->setEnabled(true);}else{qDebug() << "文件选择失败";}
}

4.发送头文件 void on_buttonSend_clicked();

void FileServer::on_buttonSend_clicked()
{//先发送文件头信息 文件名#文件大小QString head = QString("%1#%2").arg(fileName).arg(fileSize);qint64 len = m_tcpsocket->write(head.toUtf8());if(len > 0) //头信息发送成功{//启动定时器,发送真正的文件timer.start(20);}else{qDebug() << "头信息发送失败";file.close();ui->buttonSelect->setEnabled(true);ui->buttonSend->setEnabled(false);}
}

5.发送真正的文件 void FileServer::sendData()

void FileServer::sendData()
{qint64 len = 0;do{char buf[4*1204] = {0}; //每次发送的文件大小len = 0;len = file.read(buf, len); //读多少发多少m_tcpsocket->write(buf, len);//发送sendSize += len;}while(len > 0);//当len等于0时,发送完毕if(sendSize == fileSize)//检验文件信息{qDebug() << "文件发送完毕";file.close();m_tcpsocket->disconnectFromHost();m_tcpsocket->close();}
}

6.定时器槽函数 void FileServer::slotSend()

void FileServer::slotSend()//定时器槽函数
{timer.stop();//关闭定时器sendData();  //发送文件
}

三、客户端TCPSocket通信连接

Pro中加network
头文件:
QTcpSocket通信套接字
QFile 文件操作
QHostAddress IP地址
QMessageBox提示对话框
私有成员:
QTcpSocket *m_tcpSocket;
QFile file;
QString fileName; 文件名字
qint64 fileSize; 文件大小
qint64 recvSize; 接收长度
bool isStart; 判断是否是头

函数
1.构造函数 FileClient()

 FileClient::FileClient(QWidget *parent) :QWidget(parent),ui(new Ui::FileClient)
{ui->setupUi(this);m_tcpSocket = new QTcpSocket();isStart = true; //初始化是头//读信息connect(m_tcpSocket, &QTcpSocket::readyRead,this, &FileClient::slotReadyread);}

2.连接服务器 void FileClient::on_buttonConnect_clicked()

void FileClient::on_buttonConnect_clicked()//连接服务器
{//获取IP和端口号QString ip = ui->lineEditIP->text(); qint16 port = ui->lineEditPort->text().toInt();m_tcpSocket->connectToHost(QHostAddress(ip), port);
}

3.接收文件 void FileClient::slotReadyread()

void FileClient::slotReadyread()
{//接收QByteArray buf = m_tcpSocket->readAll();if(isStart)//判断是否是头{isStart = false;//解析头部 "head#1024"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(!isOK){qDebug() << "打开文件失败";}}else{qDebug() << "打开成功,读取信息";qint64 len = file.write(buf);recvSize += len;qDebug()  << "接收" <<recvSize;if(recvSize == fileSize){qDebug() << " 实际"<< fileSize;QMessageBox::information(this, "完成", "接受文件成功");file.close();m_tcpSocket->disconnectFromHost();m_tcpSocket->close();}}}

QT文件传输(简单版)相关推荐

  1. 基于QT实现的简单版控制台植物大战僵尸

    植物大战僵尸 项目主要内容与目标 模仿设计并实现基于面向对象思想的一个简单版控制台植物大战僵尸, 植物设计包含向日葵, 普通豌豆射手, 双发豌豆射手, 寒冰豌豆射手, 地刺, 窝瓜, 土豆地雷, 火爆 ...

  2. 使用window的SMB协议实现局域网文件传输——java版

    前言 简述一下SMB协议 SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议 ...

  3. 双电脑双系统Linux与Windows之间的简单文件(图片,视频,压缩包)传输方式——微信文件传输助手网页版

    由于近期项目需要,在Ubuntu系统下工作,截图传至Windows下记录,网上搜了一些方法感觉很复杂,多为Windows下与虚拟机中Ubuntu的文件传输,与本人需求不符.经过探索,发现使用微信文件传 ...

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

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

  5. Qt TCP协议 传输简单字符串实例

    TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序. A 转载:http://mobile.51cto.com ...

  6. Qt Quick实现的文件传输工具(TCP传输篇)

    [写在前面] 本篇为传输篇. 接上篇.  [正文开始] 在上一篇中,我们已经扫描到了整个局域网中运行了本工具的用户,以 <name, ip> 的形式存储在 DiscoverConnecti ...

  7. 手机文件管理ftp服务器,ftp工具手机版(ftp文件传输管理工具)V1.0.2 手机版

    ftp工具手机版(ftp文件传输管理工具)是一款非常实用的ftp文件管理应用工具.主要作用是将手机ftp上的文件数据快速传输到电脑上,或者将电脑上的文件传输到手机上,实现双向传输,并且传输速度十分快, ...

  8. qt+TCP文件传输

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

  9. c 语言 验证码识别算法,一个简单的文件传输验证码识别c/s实现

    一个简单的文件传输验证码识别c/s实现 大体思路 client通过tcp向server传输一个待识别的验证图片,server端识别后通过tcp回传给client. server端识别验证码采用pyte ...

最新文章

  1. 这款超火的游戏,AI只用4小时,就秀出了人类花1年才能达到的水平
  2. 制导炸弹毕业设计怎么用matlab仿真,基于MATLAB的自动控制系统仿真-本科毕业设计.doc...
  3. centos 忘记 root 密码
  4. 网络编程套接字API
  5. 图像PSNR值及MSE值的计算
  6. ModelCoder中的超密时间模型
  7. webpack快速学习1
  8. #9 case while until select语句的运用与例子
  9. 第 4 章 terminal
  10. php 调试环境配置
  11. 【转载】高速电路设计中的电源地
  12. Java安装包(JDK)安装和运行环境配置【超全】
  13. 高中全国计算机信息学竞赛,高中信息学奥赛考什么
  14. 用于fast scnn的cityscape数据集制作
  15. c语言驻波,C版:基于声学驻波的液位检测方法C2-1(电子版)
  16. win10輸入法去掉语言栏?win10輸入法切换简体繁体?
  17. 用什么工具可以批量查询韵达快递
  18. php,调用百地图度API实现标记
  19. c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...
  20. Android接入第三方QQ登录

热门文章

  1. C# 批量删除Word超链接
  2. 计算机学院学生会会徽,学生会会徽策划书
  3. html改变单选形状,用css实现html中单选框样式改变
  4. 第十三届Revit二次开发实战训练课程22年3月21在武汉举办
  5. 【逗老师带你学IT】PRTG自定义脚本获取H3C Loadbalance负载均衡链路状态
  6. 爬虫爬取豆瓣电影top250
  7. SAP中生产版本原因导致PIR无法带出下级需求案例分析
  8. 精美火锅美食特产PPT模板
  9. C++知识总结——运算符重载
  10. Dalvik 指令集