[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 ...
随机推荐
- 吉特日化MES & 医药行业相关专业术语汇总
- 解决报错:Java 8 date/time type `java.time.Duration` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
1.错误信息: Java 8 date/time type java.time.Duration not supported by default: add Module "com.fast ...
- 使用Py2neo更新Neo4j中节点的属性值的正确姿势
1 def findNode(name, graph): 2 matcher = NodeMatcher(graph) 3 m = matcher.match(name = name).first() ...
- 华企盾DSC手机app登录不上常见处理方法
1.DSC服务器是否正常运行. 2.telnet外网是否通.(需要在程序与功能中添加telnet功能才能在cmd窗口用telnet命令 举例:telnet 172.17.2.20 5558) 3.其它 ...
- fence的使用
一.创建一个集群及pcs安装 1.真机切换root用户下 2.打开PC管理器视图 1.安装pcs,关掉防火墙,重启pcs和下次开机自动启动pcs 1.创建一个集群,用户:hacluster:密码:re ...
- 降低node版本,怎么降低node版本
降低node版本,怎么降低node版本? 部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果. ...
- Luogu P4524 Ceste 题解
题目链接:\(\texttt{Luogu P4524 Ceste}\) 简化题意 给定一个有 \(n\) 个点 \(m\) 条边的无向图.每条边的边权为一个二元组 \((a, b)\),求以 \(1\ ...
- jumpserver连接ecs实例报错:UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh_exchange_identification: Connection closed by remote host", "unreachable": true
报错分析思路: 1.是ssh密钥设置有没有对接 2.防火墙拦截问题 3.用户设置问题 4.sshd配置问题 问题解决: 无法与221.229.216.39端口35846进行协商:找不到匹配的主机密钥类 ...
- AI与低代码解锁无限可能
前言 近年来,人工智能(AI)和低代码开发技术逐渐成为数字化转型的重要推动力.AI作为一项具有革命性潜力的技术,正在改变我们生活的方方面面.而低代码开发则提供了一种快速构建应用程序的方法,使得开发者无 ...
- 【K8S系列】快速初始化⼀个最⼩集群
序言 走得最慢的人,只要不丧失目标,也比漫无目的地徘徊的人走得快. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记一级重要 蓝色:用来标记二级重要 希望这篇文章能让你不仅有一定 ...