服务器

用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. Python爬虫常用之PyQuery

    PyQuery是解析页面常用的库.是python对jquery的封装.下面是一份解析基本页面的代码.后期用到复杂或者实用的方式再增加. from pyquery import PyQuery as p ...

  2. Java 继承初探

    Java继承的基础 Java中,被继承的类叫做超类,继承超类的类叫子类.(一个子类亦可以是另一个类的超类) 继承一个类,只需要用关键字 extends 把一个类的定义合并到另一个类中就可以了. 例子中 ...

  3. Oracle 的加减法函数

    原文:https://blog.csdn.net/chenghaibing2008/article/details/37873117 加法   select sysdate,add_months(sy ...

  4. harbor 仓库搭建

    一,介绍 Harbor是一个用于存储Docker镜像的企业级Registry服务. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry ...

  5. Grafana监控可视化环境搭建

    依赖库Go 1.6NodeJS v4+sqlite3GO 环境搭建 vi /etc/profile export GOPATH="/root/go" export GOROOT=& ...

  6. 从XCodeGhost事件看软件来源鉴别的重要性

    事件 事件引爆于9月18日乌云网公布的一则分析报告:"XCode编译器里有鬼 – XCodeGhost样本分析",这份纯粹的技术分析报告引发中国iOS生态链的众多开发者的关注. 引 ...

  7. Javascript怎么跳出循环,嵌套循环。

    今天要实现一个功能,在数组a中的每一项,对应数组b中的每一项,如果对应上了就给数组b的checked增加ture属性,如果查找不到就给数组b的checked增加false属性. 如果有哪里写的不对欢迎 ...

  8. 使用vue-router切换页面时,获取上一页url以及当前页面url

    今天在实现一个小功能的时候,遇到一个问题,使用vue-router获取上一页面的url信息,我尝试了多种方式,发现使用vue-router的canDeactivate钩子实现这个功能最为方便,现在将我 ...

  9. glyphicons-halflings-regular.woff2 文件 404

    搜索了下,果然是因为mine没有配置的原因. http://stackoverflow.com/questions/32300578/how-to-remove-error-about-glyphic ...

  10. SVN服务器在Ubuntu16.04下搭建多版本库详细教程

    1  介绍  Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...