广播通信设计——WinSock编程

广播通信设计

源代码文件:https://download.****.net/download/WXY19990803/12450932

一、设计要求

  • 设计要求是通过学习winSock API编程,实现局域网消息广播的应用程序。
  • 系统采用CS架构的方式,具有服务端和客户端。完成的功能有私聊、群聊和私聊时的文件传输,私聊和文件传输采用TCP协议,群聊采用UDP协议。服务端只作为私聊信息的记录和转发,以及在线用户的更新。文件传输和聊天功能工作方式不同。文件传输的服务器由客户端提供,文件传输的客户端由系统客户端的私聊模块提供。而聊天功能的服务器由系统服务端提供,聊天功能的客户端由系统客户端提供。

二、开发环境与工具

  • 开发系统:Win10
  • 开发工具:Qt 5.6
  • 开发语言:C++

三、设计原理

  • 系统的设计采用了TCP协议和UDP协议,TCP作为面向连接的传输,传输的信息是可靠的,所以在系统的设计中选择TCP协议来作为用户一对一私聊和文件传输。UDP是面向无连接的协议,它本身是适合广播信息的,所以使用UDP协议来进行群聊的实现。
  • 本系统的设计是使用Qt实现的,而非纯粹的c++语言。这么说的原因在于Qt里的一些函数是对C++语言进行封装过的,就拿这次要使用的WinSock编程来说,函数的使用是有区别的,在这里只介绍Qt中的WinSock编程方法(包括TCP协议编程和UDP协议编程)。
  • 先说TCP编程,分为服务端和客户端。在服务端需要设置两个套接字,一个是监听套接字QTcpServer,一个是通信套接字QTcpSocket。监听套接字在设置为监听状态后可以和客户端连接,连接后服务端可以在连接中取出通信套接字来进行数据的传送。在客户端需要设置通信套接字QTcpSocket,该套接字要主动与服务端连接才能进行通信。编程原理如图3.1所示。
    广播通信设计——WinSock编程
  • 其次是UDP编程,也分为服务端与客户端,相对于TCP编程来说,UDP编程要简单些,他没有面向连接的过程,只需要接收广播的信号即可。客户端和服务端都需要设置一个通信套接字QUdpSocket,不同的在于服务端的套接字需要绑定才能工作,然后才能发送接收数据。UDP编程原理如图3.2所示。

广播通信设计——WinSock编程

四、系统功能描述及软件模块划分

  • 系统所实现的主要功能是用户一对一的私聊和文件传输,以及用户之间的群聊。并设定每台pc机只能注册一个用户,使用的是本地IP地址,一台pc机多次申请连接会报错(IP地址重复)。
  • 软件包含两大主要模块,一是客户端模块 chat_client,二是服务端模块chat_server,分别说下两大模块。
  • 首先是客户端模块 chat_client,该模块下面有四个小模块,分别是主模块 widget、私聊模块 chat、文件发送进度显示模块 filesend 和文件接收进度显示模块 filercv,主要说主模块 widget 和私聊模块 chat。主模块的功能有文件传输服务端TCP配置(用来接收其他用户发来的文件)、与服务端模块chat_server的定时连接(防止连接不上的情况)、处理UDP收到的广播消息(包括处理服务端返回的信息处理以及群聊信息的处理)、接收服务器返回的私聊TCP信息(服务端中转私聊信息)、获取本地IP地址(系统采用本地唯一IP地址进行用户注册)、以及私聊群聊方式的设置和群聊信息的发送功能。接着是私聊模块 chat,私聊模块可以说是主模块的子模块,实现的功能包括发送自己的私聊消息和接收对方的私聊消息并显示,除此之外,就是作为文件传输的客户端。
  • 然后是服务端模块 chat_server,该模块没有子模块,就一个主模块 widget。主模块的功能除了服务端界面的布局外,还有作为私聊TCP信息的服务端(接收用户传来的私聊信息并解析显示出内容,作为中转站将信息转发给目的IP)、处理UDP信息(包括处理新加用户和退出用户信息)、更新现有用户信息并广播该信息给客户端模块更新数据。

五、设计步骤
本次系统的设计主要是为了实现三个功能,一是使用TCP协议完成用户一对一的私聊;二是使用UDP协议完成广播信息的处理;三是使用TCP协议完成用户一对一之间的文件传输。

  • 先说使用UDP协议实现群聊广播信息的处理。在本系统的设计中,UDP协议除了处理广播数据外,还为单播数据工作。设计中有三个地方用到了UDP协议,一是用户名的返回(系统的用户名由服务端自动产生发送给客户端);二是服务端广播更新后的用户数据;三是群聊广播信息的处理,对三种信息的处理是通过标志位来实现判断的。系统中使用UDP协议的只有客户端的主模块widget和服务端的主模块widget。UDP协议实现的服务端就在系统服务端主模块中。该协议实现的功能主要流程图如图5.1和图5.2所示。

广播通信设计——WinSock编程
广播通信设计——WinSock编程
图5.1:UDP协议在客户端的主要函数流程

广播通信设计——WinSock编程
图5.2:UDP协议在服务端的主要函数流程

  • 再说使用TCP协议实现用户一对一私聊的功能实现。私聊信息是在客户端模块 chat_client里的子模块chat中发出的(由子模块widget创建的chat对象实现),然后发给服务端模块 chat_server进行中转,最后由客户端模块 chat_client里的子模块widget接收(接收的内容也是在由子模块widget创建的chat对象中显示)。该功能实现的主要流程图如图5.3所示。

广播通信设计——WinSock编程
图5.3:实现私聊功能的主要函数流程

  • 最后是使用TCP协议进行文件数据的传输。文件传输的客户端是在客户端模块下的子模块chat中定义的,服务端是在客户端模块下的主模块widget中定义的,也就是说文件传输功能没有用到系统的服务端,所有功能都是在系统客户端中实现的。直接作用体现在当用户1在给用户2发送文件时,用户1使用私聊模块chat选择文件进行发送,用户2使用主模块widget对对方发送的文件进行确认和接收。该功能实现的主要函数流程如图5.4所示:
    广播通信设计——WinSock编程
    图5.4:文件传输主要函数流程

六、关键问题及其解决方法

  • 设计过程中主要有两个关键问题。第一个是UDP广播信息的处理,因为在设计过程中需要广播几类信息,需要将每类信息加上标记位,也就是封装不同的信息,除此之外用户更新信息是一次性全部发出,用户接受后需要对信息进行判断,以及解析,就如同要封装成数据报一样先广播在接受一点点解析。如何封装和解析成了一个难题,首先是所有用户信息的储存(每个用户对应一个用户名和一个IP地址),我查资料找到了QT中“#include ”容器头文件的用法,他可以将每个用户按照“键:值”的方式一起存储。接着是找到了“#include ”流头文件的用法,他可以将没一个信息按照流的方式存储,然后在解析,实现了UDP广播信息的处理。
  • 第二个关键问题是文件传输中出现了问题,文件传输有时候文件内容过多(文件太大)或出现内容丢失导致接收的文件出现损坏,然后我想到了将文件按每份4k的内容块进行传输,知道传完。
  • 代码实现后,虽说文件传输的最大内容有所提升,但还是在接收大文件时出现了文件内容丢失文件损坏的情况,这个是个遗憾,未能解决。

七、设计结果
软件正常运行是先打开服务端,再打开客户端,服务端界面如图7.1所示,客户端界面如图7.2所示。
广播通信设计——WinSock编程
图7.1:服务端界面
广播通信设计——WinSock编程
图7.2:客户端界面
在先后打开服务端和客户端后,服务端会有消息显示已有用户连接,并返回自动生成的用户名在客户端显示(Usr_1)。私聊功能只需要在客户端双击你想私聊的用户即可进入私聊界面,如图7.3所示。
广播通信设计——WinSock编程
图7.3:私聊界面

思考题:简述单播、广播、多播的区别与联系,以及各自的优缺点和适应范围。

  • 单播:主机之间一对一的通讯方式,网络中的交换机和路由器对数据只进行转发不进行复制。如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作。但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用单播模式,具体的说就是IP单播协议。网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地。
  • 单播优点:服务器能够及时响应客户的请求,能够对不同的用户实现个性化服务。
  • 单播缺点:当用户量大时,容易造成网络阻塞
  • 广播:主机之间一对所有的通讯方式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络。
  • 广播优点:网络建立和维护简单,服务器流量负载低。
  • 广播缺点:无法实现对每个用户进行及时的个性化服务。
  • 多播(组播):主机之间一对一组的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。
  • 多播优点:具备单播和广播的优点,最具有发展前景。
  • 多播缺点:与单播相比没有纠错机制,发送丢包错包后难以弥补。

八、软件使用说明
软件中有两个工程文件,一个是客户端工程文件chat_client,一个是服务端工程文件chat_server,使用QT打开各个工程文件的.pro文件即可。在正常使用软件时需要先打开服务端在打开客户端,否则先打开客户端会出现出错提示,注意,软件设计时是采用一台PC机只能注册一个用户的原则,采用的是唯一IP地址进行注册,但没有限制自己与自己私聊和传输文件,目的在于测试。在正常打开软件后,如果要私聊,双击用户列表中的用户即可进入私聊界面,在私聊界面中可以进行文件传输。如果要群聊,点击“开始群聊”按钮即可进入群聊界面。退出软件点击“退出”即可。服务端打开后是不需要任何操作的,他自动显示用户一对一之间的私聊信息,但是不能显示文件传输信息和群聊信息。

九、参考资料
书籍资料:
[1]张会勇. WinSock网络编程经络. 电子工业出版社,2012.
[2]王艳平. Windows网络与通信程序设计. 人民邮电出版社,2009
[3]唐文超. Visual C++网络编程. 清华大学出版社,2013

视频资料:
[1]网址:https://www.bilibili.com/video/av20446734?p=1