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三种传输协议,建立起客户端 ...
随机推荐
- UVALive - 5963 ad-hoc
注意到合法条件是对称的,那很有可能与2有关, 小于2表示没有这一页,大于2表示冲突了 我也不知道这样做对不对的(输入范围很迷),试一下就A了... #include<bits/stdc++.h& ...
- mysql一些简单操作
创建数据库,删除数据库 create database databasename charset utf8 collate utf8_general_ci;设置字符集utf8,校对规则utf8_gen ...
- JS window,onload 与 $().read()
JS:window.onload的使用介绍 .在body标签里面 .在JS语句调用 .同时调用多个函数 .JS调用多个函数 .自定义的函数多次调用 jquery $(document).ready() ...
- 详解Oracle hints PQ_DISTRIBUTE
PQ_DISTRIBUTE是并行的hints中稍微复杂一点的一个 下面就这个hints做以下说明: 1.使用格式 /+ PQ_DISTRIBUTE(tablespec outer_distributi ...
- b站弹幕的爬取以及词云的简单使用
一.B站弹幕的爬取 1.分析发现,其弹幕都是通过list.so?=cid这个文件加载出来的,所以我们找到这个文件的请求头的请求url, 2. 打开url就能看到所有的评论 3. 上代码,解析 #!/u ...
- 数据插入INSERT
一.INSERT SELECT :将查询的数据直接插入 特点: 1.一次性插入所有查询出来的数据. 2.数据原子性,有一个失败全部失败. 3.没有指定的列加默认值或NULL,都没有就报错. 二.INS ...
- Ionic3,安装,创建项目(一)
Ionic3 简介:是一款html5的轻量级手机开发框架,基于angularjs.scss语法,ionic是一个轻量的手机UI库.并直接放弃了IOS 6和Android 4.1一下的版本支持. 安装: ...
- phantomJs原理
引用文段:链接:https://www.jianshu.com/p/0254391918f7 网页渲染可分为服务端渲染和客户端渲染,前者是指你在浏览器地址栏输入一个网址,Web服务器处理请求过程就将所 ...
- linux运维基础知识
linux运维基础知识大全 一,序言 每一个微不足道的知识,也是未来的铺垫.每一份工作的薪资职位,也是曾经努力的结果. 二,服务器 1,运维人员工作职责: 1)保证数据不丢失:2)保证服务器24小时运 ...
- 【C#】隐式类型var
在.NET 3.0后微软引入了隐式类型var,编译器可以自动判断变量的类型,通过var这个隐式类型,可以提高开发人员的开发效率,很多时候可以不考虑对象的类型,编译器会自动帮我们判断 使用隐式类型和使用 ...