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三种传输协议,建立起客户端 ...
随机推荐
- 玩转微信2次开发1_交互通信api.php(微擎版)
在2次开发中,涉及到比较多的也比较繁琐的就是服务器和微信服务器的交互 用户在公众号里操作回复关键词都会让微信服务器和开发者的服务器进行交互 用户一旦关注了某某公众号--微信后台会去查询该公众号是否连接 ...
- PHP二次开发
一.CMS类 如:phpcms.dedecms.empirecms.wordprss drupal joomla 二.shop类 如:ecshop eschopx shopnc emall mag ...
- [转] 前后端分离之JWT用户认证
[From] http://www.jianshu.com/p/180a870a308a 在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当 ...
- 【研究】Metasploit自动攻击模块
环境:kali-linux-2017.3-vm-amd64 一.安装postgresql数据库 apt-get install postgresql apt-get install rubygems ...
- python-基础学习篇(一)
python基础学习(一) 不积硅步,无以至千里.基础的学习越加透彻,才能更清楚的理解和分析需求,我贯彻基础学习“永无止境”的理念,故把自学的知识梳理在博客中,基础学习篇无限更新. python介绍 ...
- C++ GUI Qt4编程(10)-3.4spreadsheet
1. C++ GUI Qt4编程第三章,增加spreadsheet. 2. spreadsheet.h /**/ #ifndef SPREADSHEET_H #define SPREADSHEET_H ...
- Spark遇到的报错和坑
1. Java版本不一致,导致启动报错. # 解决方法: 在启动脚本最前边添加系统参数,指定Java版本 export JAVA_HOME=/usr/java/jdk1..0_181-amd64/jr ...
- JS如何获取屏幕、浏览器及网页高度宽度?
屏幕的尺寸是指当前分辨率下的高度.宽度,而不是物理高度.宽度. 如:一个22寸的显示器,屏幕分辨率为1366 * 768,那么我们可以获取到的屏幕高度为1366px,宽度为768px. 屏幕宽度和高度 ...
- Open Closed Principle(OCP)开闭原则
面向对象的最基本原则 Software entites like classes,modules and functions should be open for extension but cloa ...
- hibernateAPI详解
1 Configuration package www.test.b_api; import org.hibernate.Session; import org.hibernate.SessionFa ...