写在前面
本文旨在做一个简单的代码讲解,我会给出源码,然后整个代码的讲解都在源码的基础上进行。
代码可能会随着更新而进行修改,但是整体框架变化不会太大。
整个文章内容不会太多,算是我自己的一个复盘,整个的来说算是一个比较综合的程序开发,不算太难,但对于初学者来说肯定也不会太简单。程序涉及到网络模块、自定义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,TCP,发送,毕业设计,服务端,客户端 From: https://www.cnblogs.com/Leventure/p/17129442.html