[Qt开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解
写在前面
本文旨在做一个简单的代码讲解,我会给出源码,然后整个代码的讲解都在源码的基础上进行。
代码可能会随着更新而进行修改,但是整体框架变化不会太大。
整个文章内容不会太多,算是我自己的一个复盘,整个的来说算是一个比较综合的程序开发,不算太难,但对于初学者来说肯定也不会太简单。程序涉及到网络模块、自定义UI、文件读写等内容,但是比较可惜的是作为一个Windows桌面端程序没有涉及到Windows窗体和COM组件,这个是我觉得比较可惜的。
综上,本文不是零基础的项目讲解和代码教学,请至少参考一下下列的确定任务环节,确定自己能看明白需要做些什么再继续阅读本文。
注:我写到一般发现用文字和图片来写教程实在是太折磨了,所以我想偷懒一下直接用视频去讲解,如果急得话可以直接拿我的源码去看,要是不急的话可以直接b站关注我,B站ID:Leventure_轩先生
B站主页:Leventure_轩先生
Github:
服务端:https://github.com/LeventureQys/FilePlanter
客户端:https://github.com/LeventureQys/FilePlanterClient
确定任务
按照我们的标题,是要做一个局域网环境下的远程文件发送部署工具,那么我们需要确定一下基本知识。
1.使用的是Qt开发,所以基本的ui要会用,包括基本的控件,自定义的控件,选择文件等等。包括信号槽机制
2.需要了解最基本的文件IO,至少你得知道在本案例中,文件是通过二进制字符流进行的传输
3.需要了解一些最基本的网络知识,TCP和UDP的协议你至少得知道是什么东西,了解socket通信
4.需要了解什么是注册表,因为其中有些操作需要读写注册表。
ok,在我们知道阅读本文需要知道哪些知识之后,接下来就说说怎么做这个程序。
做什么?怎么做?
做什么?
整个系统由两个软件组成,分别是文件部署服务端及文件部署客户端。我们将一个文件从服务端发送到很多个连接到当前服务端的客户端的指定路径上去。这个是我们的目标
怎么做?
发送端:
1.我们需要一个最基本的界面框架,如下

2.因为文件下发可能会需要面向不同的对象,所以我们可能需要一个自定义的用户对象ui,用于插入到界面ui的右方,如图所示:

用户对象的ui需要提供一些最基本的功能,包括展示指定用户的信息、可以踢出用户、重新发送文件、展示当前用户的发送进度等等。
3.需要一个最基本的TCP连接模块。
4.需要自己来定义一个简单的文件切分的协议。
接收端:
1.同样的需要一个简单的界面

功能比较简单,只需要提供服务端的IP,和一个自身的唯一标识,提供一个文件保存路径即可
2.要能够读写注册表,令自己能够是开机启动(注:开机启动的程序的依赖需要放在指定位置,具体内容请查询百度)
3.要有一个读写接收服务端二进制流的网络服务DLL
4.要有一个能够解析这个二进制流与服务端相对的简单协议。
开始着手做
一、最基本的出发:网络协议
整个软件最最底层的功能自然是网络连接,如果连最起码的网络连接都没有,更不要谈后续的开发了。实际上整个软件都是建立在这个网络协议能够顺利进行并收发信息的基础上。也就是说即使我们整个程序用的是黑板命令行也可以运行,但是如果没有这个网络协议,那么整个程序就无法正常进行了。
网络通信模块的详情见Github:
LgQtNetwork
这个仓库里面包含了服务端和客户端两边,接下来我要对代码进行简单的讲解。
注:整个通讯库使用的是Qt的类,需要在模块里加上一个network并使用到相关的模块,所有的行为都托管交给了Qt的内部去处理,所以这里不存在丢包、粘包的处理,统一交给Qt的lib去管理了。
TCP协议
1.发送端:
Socket通讯可以理解为单纯地发送一些数据包,这些数据包中只有内容,并没有包括但不限于字符总长度、当前字符位置、第几个包等这些信息,这些信息可能统统需要我们自己去定义。
首先我们知道,我们不可能把一个socket包定义的太大,比如一次发几十上百万个字节,这是显然不可能的,这样操作的话会使得我们的tcp连接性能变差而且丢包的损失严重。而且数字是由顺序的,但是网络连接不一定能够保证所有的顺序都保持匀速运转,可能有的快有的慢——那我们数据的顺序又该如何保证呢?
当然了这些问题我们这里是不考虑的,一部分是我不懂,另一部分是这里太小了写不下(笑
不急,我们一步步来
1>首先要建立一个QTcpServer的实例对象,然后让它去监听端口:


绑定新用户登录的事件,每当一个新用户进入之后,就通过一个结构体登记这个用户并把它记录在一个哈希表中方便通过其唯一ID来搜索这个用户
哈希表:

用户结构体:

进行信号的绑定,方便后续对外提供接口:

如何发送TCP消息给其他客户端,主要是看这个SendMsg:

这个SendMsg是另一个方法,可以按F12走进去看下:

这里其实相当于就是简单处理了以下,把这个二进制流的消息分段1024个字节为一组打包发送,通过TcpServer的write方法发送指定长度的字节
TCP消息的接受也是类似,包括客户端的TCP消息收发也是类似的,唯一的不同就是一个是TCP的服务端,一个是TCP的客户端,一个是监听等待客户连接,一个是客户端主动连接等到服务端返回,有点区别,但区别不大。
[Qt开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解的更多相关文章
- RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA
环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...
- 如何在Linux环境下通过uwgsi部署Python服务
部署python程序时常常会遇到同一台服务器上2.x和3.x共存的情况,不同应用需要使用不用的python版本,使用virtualenv创建虚拟环境能很好地解决这一问题. 首先,需要在服务器上安装vi ...
- QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)
QT在Linux环境下读取和设置系统时间 本文博客链接:http://blog.csdn.NET/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 开发软件:QT 读取系统时间 ...
- 同一局域网环境下的arp欺骗和中间人攻击(mac)
最近读了一篇有关arp欺骗和中间人攻击的文章,于是乎就想着自己实现一下,顺便验证下微信在回话劫持后的安全性. 1.本机环境 Macbook Air:OS X 10.11 El Captain 2.推荐 ...
- 转载:一种云环境下SaaS软件部署方法及装置与流程
转载:http://www.xjishu.com/zhuanli/55/201710103925.html 本发明涉及云计算技术领域,特别是涉及一种云环境下SaaS软件部署方法及装置. 背景技术: 随 ...
- 非域环境下使用证书部署数据库(SqlServer2008R2)镜像
非域环境下使用证书部署数据库(SqlServer2008R2)镜像 前言 部署数据库镜像一般有两种方式域环境下部署http://liulike.blog.51cto.com/1355103/33918 ...
- Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS
如果想在Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVCS绝对是首选,可以媲美Windows环境下用的TortoiseSVN,甚至连操作都基本一样,所以强烈推荐给各位童鞋. Ra ...
- linux 环境下tomcat中部署jfinal项目
tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebap ...
- .NET Framework 项目多环境下配置文件web.config
解决jenkins自动构建发布的问题,统一从git/svn库中获取项目文件,根据不同配置编译发布到多个运行环境中. 转自:https://www.cnblogs.com/hugogoos/p/6426 ...
- 七年开发小结MyBatis 在 Spring 环境下的事务管理
MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFin ...
随机推荐
- 【UniApp】-uni-app-内置组件
前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局数据和局部数据 那么了解完了uni-app-全局数据和局部数据之后,这篇文章来给大家介绍一下 UniApp 中内置组件 首先不管三 ...
- [CF1824D] LuoTianyi and the Function
题目描述 LuoTianyi gives you an array $ a $ of $ n $ integers and the index begins from $ 1 $ . Define $ ...
- Python+Selenium+Webdriver+unittest 实现登录126邮箱
第一版:登录 #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webd ...
- 盘点前端的那些Ajax请求:从ES5到React
说起前端开发,Ajax请求是绕不开的技术点.然而,程序语言更新换代越来越快,Ajax请求的方式也是各有不同. 在使用ES5开发的时候,我们还在使用最原始的XMLHttpRequest对象: // cr ...
- ASR项目实战-任务队列在文件转写特性中的应用
转写时长超出60秒的语音文件,业界的竞品通常会使用创建异步转写任务的方式来提供支持. 一个简单.直接的实现方案,即: 网关服务接收到来自客户的转写请求时,将任务信息持久化至任务队列中. 由算法服务的实 ...
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(2)
这是一个系列文章<如何从零开始实现TDOA技术的 UWB 精确定位系统>第2部分. 重要提示(劝退说明): Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程 ...
- manjaro下使用deepin-wine5解决wechat无法发送图片的问题
问题 在manjaro操作系统下,使用了deepin-wine安装wechat.但是,wechat运行无法发送较大图片且截图功能也有问题. 解决 在参考了github之后,我找到了解决方案. 附上链接 ...
- 【Python】【OpenCV】OCR识别(二)——透视变换
对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的. 针对上述情况,所以我们在处理有角度的图象 ...
- MySQL基础篇:第九章_详解流程控制结构
流程控制结构 系统变量 一.全局变量 作用域:针对于所有会话(连接)有效,但不能跨重启 查看所有全局变量 SHOW GLOBAL VARIABLES; 查看满足条件的部分系统变量 SHOW GLOBA ...
- Kuasar成为CNCF官方项目,探索容器运行时新纪元
本文分享自华为云社区<Kuasar成为CNCF官方项目,探索容器运行时新纪元!>,作者:云容器大未来. 北京时间12月20日,云原生计算基金会(CNCF)正式接纳多沙箱容器运行时项目 Ku ...