写在前面

本文旨在做一个简单的代码讲解,我会给出源码,然后整个代码的讲解都在源码的基础上进行。

代码可能会随着更新而进行修改,但是整体框架变化不会太大。

整个文章内容不会太多,算是我自己的一个复盘,整个的来说算是一个比较综合的程序开发,不算太难,但对于初学者来说肯定也不会太简单。程序涉及到网络模块、自定义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开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解的更多相关文章

  1. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  2. 如何在Linux环境下通过uwgsi部署Python服务

    部署python程序时常常会遇到同一台服务器上2.x和3.x共存的情况,不同应用需要使用不用的python版本,使用virtualenv创建虚拟环境能很好地解决这一问题. 首先,需要在服务器上安装vi ...

  3. QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)

    QT在Linux环境下读取和设置系统时间 本文博客链接:http://blog.csdn.NET/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 开发软件:QT 读取系统时间 ...

  4. 同一局域网环境下的arp欺骗和中间人攻击(mac)

    最近读了一篇有关arp欺骗和中间人攻击的文章,于是乎就想着自己实现一下,顺便验证下微信在回话劫持后的安全性. 1.本机环境 Macbook Air:OS X 10.11 El Captain 2.推荐 ...

  5. 转载:一种云环境下SaaS软件部署方法及装置与流程

    转载:http://www.xjishu.com/zhuanli/55/201710103925.html 本发明涉及云计算技术领域,特别是涉及一种云环境下SaaS软件部署方法及装置. 背景技术: 随 ...

  6. 非域环境下使用证书部署数据库(SqlServer2008R2)镜像

    非域环境下使用证书部署数据库(SqlServer2008R2)镜像 前言 部署数据库镜像一般有两种方式域环境下部署http://liulike.blog.51cto.com/1355103/33918 ...

  7. Linux环境下使用图形化界面的SVN客户端软件-RabbitVCS

    如果想在Linux环境下使用图形化界面的SVN客户端软件,那么RabbitVCS绝对是首选,可以媲美Windows环境下用的TortoiseSVN,甚至连操作都基本一样,所以强烈推荐给各位童鞋. Ra ...

  8. linux 环境下tomcat中部署jfinal项目

    tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebap ...

  9. .NET Framework 项目多环境下配置文件web.config

    解决jenkins自动构建发布的问题,统一从git/svn库中获取项目文件,根据不同配置编译发布到多个运行环境中. 转自:https://www.cnblogs.com/hugogoos/p/6426 ...

  10. 七年开发小结MyBatis 在 Spring 环境下的事务管理

    MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能.但是由于它本身也有一些缓存.事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFin ...

随机推荐

  1. scroll-view和swiper的使用

    源码: <template>            <viex class="out">            <view class="b ...

  2. hdu4365 Palindrome graph

    Palindrome graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 华企盾DSC可能涉及的Linux命令

    掌握Linux系统的基本命令 详细使用请参考:Linux命令大全 uname 查看系统信息 wget 文件下载 chmod 改变文件或目录权限 ls 显示指定工作目录下的内容及属性信息 cd 切换当前 ...

  4. python pycurl 安装使用

    python pycurl 安装使用 本文主要讲下pycurl 安装使用. 1.安装 首先使用 pip 命令安装. pip install pycurl 输出如下: Collecting pycurl ...

  5. Ubuntu apt-get 的使用

    在Ubuntu中,可以使用apt-get命令来管理软件包.下面是一些常见的apt-get命令及其用法: 安装软件包: sudo apt-get install <package> 其中,& ...

  6. ChatGPT 沦为了我的打工仔

    大家好,我是老章 最近在折腾之前搞的R-bookdown网站.Jekyll博客,还有刚上了Astro做的周刊.Astro Starlight做的文档站 R2ML:https://r2ml.zhangl ...

  7. [ACTF2020 新生赛]Exec 1

    [ACTF2020 新生赛]Exec 1 审题 发现题目有ping功能,猜测是命令执行漏洞. 知识点 linux系统命令 解题 先ping127.0.0.1,观察是否正常执行. 发现正常后执行ls / ...

  8. ChatGPT的中转站(欧派API) oupuapi,不扶墙也能上楼

    开启智能生活新篇章:oupo中转站(欧派)--引领人工智能大模型的枢纽 在人工智能技术日新月异的今天,我们荣幸地向您推介oupo中转站(欧派)--这一汇聚各类顶尖人工智能大模型的平台.它不仅为技术研发 ...

  9. throws和try、catch有什么区别?throws如何使用?

    在Java中,异常处理是非常重要的一部分.当程序出现异常时,我们需要对其进行处理以确保程序的正确性和可靠性.Java提供了两种异常处理机制:throws和try.catch. 区别 throws和tr ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (34)-- 算法导论5.3 1题

    一.Marceau 教授不同意引理 5.5 证明中使用的循环不变式.他对第1次送代之前循环不变式是否为真提出质疑.他的理由是,我们可以很容易宣称一个空数组不包含0排列.因此一个空的子数组包含一个0排列 ...