服务器

用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制作一个简单的文件传输系统的更多相关文章

  1. 实例学习SSIS(一)--制作一个简单的ETL包

    原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...

  2. TensorFlow练习13: 制作一个简单的聊天机器人

    现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri.Google Now.Amazon Alexa.微软小冰等等.前不久有一个视频比较了Google N ...

  3. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  4. PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...

  5. 制作一个简单的WPF图片浏览器

    原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1.  对指定文件夹下所有JPG文件进行预览2.  对选定图片进行旋转3.  对选定图片 ...

  6. 自己制作一个简单的操作系统二[CherryOS]

    自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建], 详细介绍了制作所需的前期准备工作 一. 一点说明 这个操作系统只是第一步, 仅仅是开机显示 ...

  7. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  8. 如何使用AEditor制作一个简单的H5交互页demo

    转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...

  9. Python的网络编程[5] -> BOOTP + TFTP + FTP -> 实现一个简单的文件传输流程

    BOOTP-TFTP-FTP 目录 文件传输流程 服务器建立过程 客户端建立过程 1 文件传输流程 / File Transfer Flow 利用BOOTP,TFTP,FTP三种传输协议,建立起客户端 ...

随机推荐

  1. drf的安装和配置

    一.安装 1.安装 pip install djangorestframework 2.配置 注:以上两部就OK了 二.最简单的drf版本 1.创建应用 在项目中新建一个应用: python mana ...

  2. PIE SDK均值滤波

    1.算法功能简介 均值滤波是最常用的线性低通滤波,它均等地对待邻域中的每个像素.对于每个像素,取邻域像素值的平均作为该像素的新值.均值滤波算法简单,计算速度快,对高斯噪声比较有效.从频率域的角度看,相 ...

  3. java将文本写入本地硬盘

    注意:首先要在E盘创建qaz.txt文本文件.然后执行代码写入. public static void main(String[] args) { SecurityCodeUtils scu = ne ...

  4. 转帖 css的块元素、内联元素、内联块元素、display属性、浮动、定位

    块元素 块元素,也可以称为行元素,布局中常用的标签如:div.p.ul.li.h1~h6.dl.dt.dd等等都是块元素,它在布局中的行为:1.支持全部的样式.2.如果没有设置宽度,默认的宽度为父级宽 ...

  5. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. 6个Unity 开源项目分享!

    http://gad.qq.com/article/detail/38279?sessionUserType=BFT.PARAMS.249034.TASKID&ADUIN=991655778& ...

  7. Linux下MySQL数据库主从同步配置

    说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...

  8. 深入学习keepalived之预备工作--线程

    1. 线程的定义 1.1 线程定义在scheduler.h文件中,其定义如下所示 /* Thread itself. */ typedef struct _thread { unsigned long ...

  9. 使用setInterval函数改变网页背景的颜色

    var icolor=0; var iNum=256; var iID=setInterval(setbgColor, 500); function setbgColor() { body.backg ...

  10. 10、选择框:ion-select

    !重点 multiple="true" 控制 选择框是 多选还是单选.true为 多选类似 checkbox. /* ---html----*/ <ion-content p ...