Qt socket制作一个简单的文件传输系统
服务器
用qt designer设计出服务器界面:

上代码:
Server.pro
#-------------------------------------------------
#
# Project created by QtCreator --02T09::
#
#------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = Server
TEMPLATE = app SOURCES += main.cpp\
Widget.cpp HEADERS += Widget.h FORMS += widget.ui QT += network
Widget.h
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
#include <QFile> namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); void sendData(); private slots:
void on_button1_clicked(); void on_button2_clicked(); private:
Ui::Widget *ui; QTcpServer *server;
QTcpSocket *socket; QFile file;//文件对象
QString fileName;//文件名
qint64 fileSize;//文件大小
qint64 sendSize;//已经发送文件的大小 QTimer timer;
}; #endif // WIDGET_H
Widget.cpp
#include "Widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFileInfo>
#include <qDebug> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); server = new QTcpServer(this);
server->listen(QHostAddress::Any,); ui->button1->setEnabled(false);
ui->button2->setEnabled(false); connect(server,&QTcpServer::newConnection,[=](){
socket = server->nextPendingConnection();
//获取对方IP,端口
QString ip = socket->peerAddress().toString();
quint16 port = socket->peerPort(); QString str = QString("[%1:%2] 成功连接").arg(ip).arg(port);
ui->textEdit->append(str); ui->button1->setEnabled(true); });
} Widget::~Widget()
{
delete ui;
} void Widget::on_button1_clicked()
{
QString path = QFileDialog::getOpenFileName(this,"OPEN","../");
if(path == NULL){
ui->textEdit->append("路径读取失败");//qDebug() << "路径读取失败";
return;
} //初始化发送信息
fileName.clear();
fileSize = ;
sendSize = ;
//获取信息
QFileInfo info(path);
fileName = info.fileName();
fileSize = info.size();
//打开文件
file.setFileName(path);
if(!file.open(QIODevice::ReadOnly)){
ui->textEdit->append("文件打开失败");
return;
}
ui->textEdit->append(path);
ui->button1->setEnabled(false);
ui->button2->setEnabled(true); connect(&timer,&QTimer::timeout,[=](){ timer.stop();
sendData();
}); } void Widget::on_button2_clicked()
{
QString head = QString("0&%1&%2").arg(fileName).arg(fileSize);
//QString head = QString::number(fileSize);
qint64 len = socket->write(head.toUtf8());
if( len < ){
ui->textEdit->append("头文件没有发送成功");
file.close();
ui->button1->setEnabled(true);
ui->button2->setEnabled(false);
}
timer.start();//防止粘包 } void Widget::sendData()
{
qint64 len = ;
do{
len = ;
char buf[*] = {};//每次发送数据大小
len = file.read(buf,sizeof(buf));//读文件
len = socket->write(buf,len);//发文件
sendSize += len;
}while(len > ); if(sendSize != fileSize){
file.close();
ui->textEdit->append("文件未发送完全");
return ;
} ui->textEdit->append("文件发送完毕");
file.close();
}
main.cpp
#include "Widget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.setWindowTitle("服务器");
w.show(); return a.exec();
}
客户端
用qt designer设计出客户端界面:

上代码:
Client.pro
#-------------------------------------------------
#
# Project created by QtCreator --02T09::
#
#------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = Client
TEMPLATE = app SOURCES += main.cpp\
Widget.cpp HEADERS += Widget.h FORMS += widget.ui QT += network
Widget.h
#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QTcpSocket>
#include <QFile> namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); private slots:
void on_buttonSend_clicked(); private:
Ui::Widget *ui; QTcpSocket *socket; QFile file;//文件对象
QString fileName;//文件名
qint64 fileSize;//文件大小
qint64 recvSize;//已经收到的文件的大小 bool isStart;
}; #endif // WIDGET_H
Widget.cpp
#include "Widget.h"
#include "ui_widget.h"
#include <QHostAddress> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); socket = new QTcpSocket(this); isStart = true;
connect(socket,&QTcpSocket::readyRead,[=](){ QByteArray buf = socket->readAll();
if(isStart){//接收头
isStart = false; fileName = QString(buf).section("&",,);
fileSize = QString(buf).section("&",,).toInt();
recvSize = ; file.setFileName(fileName);
if(!file.open(QIODevice::WriteOnly)){
qDebug() << "打开出错";
return;
}
}
else{//接收文件 qint64 len = file.write(buf);
recvSize += len; if(recvSize == fileSize){
file.close();
qDebug() << "文件接收完成"; socket->disconnectFromHost();
socket->close();
}
}
});
} Widget::~Widget()
{
delete ui;
} void Widget::on_buttonSend_clicked()
{
QString ip = ui->editIP->text();
quint16 port = ui->editIP_2->text().toInt(); socket->connectToHost(QHostAddress(ip),port);
}
main.cpp
#include "Widget.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show(); return a.exec();
}
运行出来就是这个样子:

注意:qt网络编程一定要在pro文件中添加QT += network
Qt socket制作一个简单的文件传输系统的更多相关文章
- 实例学习SSIS(一)--制作一个简单的ETL包
原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...
- TensorFlow练习13: 制作一个简单的聊天机器人
现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri.Google Now.Amazon Alexa.微软小冰等等.前不久有一个视频比较了Google N ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
- 制作一个简单的WPF图片浏览器
原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1. 对指定文件夹下所有JPG文件进行预览2. 对选定图片进行旋转3. 对选定图片 ...
- 自己制作一个简单的操作系统二[CherryOS]
自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建], 详细介绍了制作所需的前期准备工作 一. 一点说明 这个操作系统只是第一步, 仅仅是开机显示 ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
- 如何使用AEditor制作一个简单的H5交互页demo
转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...
- Python的网络编程[5] -> BOOTP + TFTP + FTP -> 实现一个简单的文件传输流程
BOOTP-TFTP-FTP 目录 文件传输流程 服务器建立过程 客户端建立过程 1 文件传输流程 / File Transfer Flow 利用BOOTP,TFTP,FTP三种传输协议,建立起客户端 ...
随机推荐
- 04-树5 Root of AVL Tree (25 分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- PIE SDK图片元素的绘制
1. 功能简介 在数据的处理中会用到图片元素的绘制,利用IPictureElement图片元素接口进行绘制,目前PIE SDK支持IPictureElement元素接口的绘制,下面对图片元素的绘制进行 ...
- 转帖 JS的基础语法2
条件语句(if.switch). 循环语句(while.do…while. for … in).跳转语句(break,continue) 1.条件语句 Ø if语句 javascrip中的if语句 v ...
- Android中的CardView使用
Android 5.0 版本中新增了CardView,CardView继承自FrameLayout类,并且可以设置圆角和阴影,使得控件具有立体性,也可以包含其他的布局容器和控件. 1.配置build. ...
- 小程序 给最外层view设置百分之百高度不起作用
<view class="content"> <view class="today"> <view class="inf ...
- php获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime.下面首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日.上周.本月的起始 ...
- "Sorry this application cannot run under a virtual machine" Error
错误: 运行一个程序是出现了 “sorry this application cannot run under a virtual machine” 错误. 如何解决: 控制面板-->卸载程序- ...
- Oracle 数据类型详解
数据类型(datatype)是列(column)或存储过程中的一个属性. Oracle支持的数据类型可以分为三个基本种类:字符数据类型.数字数据类型以及表示其它数据的数据类型. 字符数据类型 CHAR ...
- ztree使用方法 python后台
一.在提前加载js的地方写一段js,判断该页面是否需要添加ztree,我的项目所有提前加载的js都写在admin.js中 //增加ztree $(document).ready(function() ...
- bzoj 5291: [Bjoi2018]链上二次求和
Description 有一条长度为n的链(1≤i<n,点i与点i+1之间有一条边的无向图),每个点有一个整数权值,第i个点的权值是 a_i.现在有m个操作,每个操作如下: 操作1(修改):给定 ...