基于TCP、UDP的聊天文件传输程序

上传人:liy****000 文档编号:373310883 上传时间:2023-12-15 格式:DOC 页数:18 大小:402.50KB
返回 下载 相关 举报
基于TCP、UDP的聊天文件传输程序_第1页
第1页 / 共18页
基于TCP、UDP的聊天文件传输程序_第2页
第2页 / 共18页
基于TCP、UDP的聊天文件传输程序_第3页
第3页 / 共18页
基于TCP、UDP的聊天文件传输程序_第4页
第4页 / 共18页
基于TCP、UDP的聊天文件传输程序_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《基于TCP、UDP的聊天文件传输程序》由会员分享,可在线阅读,更多相关《基于TCP、UDP的聊天文件传输程序(18页珍藏版)》请在金锄头文库上搜索。

1、网络通信原理课程题 目 基于TCP、UDP的聊天文件传输程序目 录1 实验综述11.1 设计目标11.2 完成功能12 网络编程的预备知识12.1 TCP/IP协议族简介12.2 用户数据报协议UDP22.3 传输控制协议TCP33 编程实现53.1 编程环境53.2 QtNetwork63.3 整体结构和子模块划分74 关键模块分析94.1 聊天内容传输模块94.2 文件传输模块105 开发工具135.1 测试环境135.2 测试步骤136 实验总结156.1 个人收获156.2 待改善的问题157 参考资料16 研究生宽带通信网原理实验报告 1 实验综述1.1 设计目标TCP/IP协议是I

2、nternet的基础和最基本的网络协议。本实验利用了UDP和TCP协议,实现一个具有聊天功能和文件传输功能的QT插件。实验中使用非面向连接的UDP协议实现文字传输的功能,使用面向连接的TCP协议实现文件传输的功能。1.2 完成功能(1)布局界面,创建若干个按钮和输入控件和一个现实控件,如图1所示。(2)利用UDPSOCKET实现网络聊天的功能。(3)利用TCPSOCKET实现文件传输的功能。图1 程序界面2 网络编程的预备知识2.1 TCP/IP协议族简介TCP/IP体系结构分为四层,分别是网络接口层、网际层、运输层和应用层。如图2所示的一种分层次画出具体协议的表示图可知,TCP/IP协议族具

3、有“两头大而中间小”的特点。应用层和网络接口层都有多种协议,而中间的IP层是最小的,上层的各种协议都向下汇聚到一个IP协议中。这种沙漏型的结构表明:TCP/IP协议可以为各式各样的应用提供服务(所谓的everything over IP)。同时TCP/IP协议也允许IP协议在各式各样的网络结构中构成互联网上运行(所谓的IP over everything)。正因为如此,因特网才会发展到今天这种全球规模。从图2不难看出IP协议在因特网中起到核心的作用。我们应该知道的是,TCP/IP中的运输层向高层用户屏蔽了下层的网络核心细节(如网络拓扑、路由选择协议等),它使应用进程看见的就是好像在两个运输层实

4、体之间有一条端到端的逻辑通信信道,尽管下层可能存在着非常复杂的协议。图2 TCP/IP协议族示意图 运输层有两个主要的协议,分别是面向连接的TCP协议和无连接的UDP协议。下面详细介绍这两个协议。2.2 用户数据报协议UDP 用户数据报协议(User Datagram Protocol, UDP)是一种无连接的网络协议,它只是在IP的数据报服务之上增加了很少的功能,即复用和解复用以及差错检测的功能。UDP的主要特点是:(1)UDP是无连接的,即发送数据之前不需要建立连接(当然发送数据结束之后也没有连接需要释放),因此减少了开销和发送数据之前的时延。(2)UDP使用尽最大努力交付,即不保证可靠交

5、付,因此主机不需要维持复杂的连接状态表。(3)UDP是面向报文的。发送方的UDP对应用程序交下来的报文仅添加首部之后就交付给IP层,也就是说,应用层交给UDP多长的报文,UDP照样发送。所以应用程序应该选择合适的报文大小,若报文过长,则IP层将会对UDP报文进行分片,降低了IP层的效率;反之,若报文太短,则导致IP首部相对过大,也降低了IP层的效率(4)UDP没有拥塞控制,因此网络出现拥塞不会对主机的发送速率造成影响。这对实时应用是很重要的。(5)UDP支持一对一、一对多、多对一和多对多的交互通信。(6)UDP首部仅有8个字节,开销较小。2.3 传输控制协议TCP传输控制协议(Transmis

6、sion Control Protocol,TCP)是TCP/IP体系中非常复杂的一个协议,它具有如下特点:(1)TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据结束之后,必须释放已建立的TCP连接。(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。(3)TCP提供可靠交付服务。也就是说,用户可以通过协议无差错、不丢失、不重复且按序到达地传输数据。(4)TCP提供全双工通信。它允许连接的双方在任何时候发送数据。(5)面向字节流。TCP中的“流”指的是流入进程和从进程流出的字节序列。即应用程序与TCP的交互是一次一个数据块

7、,但TCP把应用程序交下来的数据块仅看成一连串无结构的字节流。图3 TCP面向流的概念TCP对应用进程一次把多长的报文发到TCP的缓存器中并不关心,它会根据其发送窗口的大小来调整一个报文段有多长。如果发送来的数据太长,则它将对数据进行分段,如果太短,则会等待数据达到一定大小再发送。TCP所谓的面向连接并不是指真正的物理连接,而是一条建立在各种可靠性保障机制上的序连接。连接是TCP最基本的抽象,TCP的很多特性都与其面向连接的这个基本特性有关。如前所述,每一条TCP连接有两个端点,这个端点不是主机,不是IP地址、不是进程也不是运输层的端口,而是叫做套接字(SOCKET)。其定义是端口号拼接到点分

8、十进制表示的IP地址上,用冒号或者逗号隔开。例如,有IP地址218.192.169.130而端口号是80,那么得到的套接字则为(218.192.169.130:80)。总之,我们有套接字socket = (IP地址:端口号)每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:TCP连接:= socket1,socket2 = (IP:port1),(IP,port2)总而言之,TCP连接就是由协议软件所提供的一种抽象。有时为了方便,我们也可以说,在一个应用进程和另一个应用进程之间建立了一条TCP连接,但被连接的两端是套接字,同一个地址可以有多个不同的TCP连接,而同一个端口号

9、也可以出现在多个不同的TCP连接中。TCP的可靠传输依靠于一系列复杂的机制,例如超时重传、拥塞控制等等,不作详述。3 编程实现3.1 编程环境Qt是一个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。它既可以开发GUI程序,也可开发非GUI程序,比如控制台和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。Qt与其他开发工具包最不相同的部分是它的“信号和槽”(signal and slot)机制,这也是

10、它的中心特征。图4 信号和槽示意图在图形用户界面编程中,我们希望一个窗口部件的一个变化被通知给另外一个窗口部件。更一般地,我们希望任何一类的对象可以与其他对象进行通信。较老的工具包使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数指针,所以如果你希望一个处理函数通知你一些事件,你可以把另一个函数回调的指针传递给处理函数。处理函数在适当的时候调用回调。回调有两个主要的缺点。首先他们不是类型安全的。我们从不确定处理函数使用了正确的参数来调用回调。其次回调和处理函数是非常强地联系在一起的,因为处理函数必须知道要调用哪个回调。信号和槽机制是指,当一个特定事件发生的时候,一个信号被发射。Qt的

11、窗口部件有很多预定义的信号, 但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配。(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的 签名。)因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数

12、而被调用。信号和槽可以使用任何数量、任何类型的参 数。它们是完全类型安全的:不会再有回调核心转储(core dump)。从QObject类或者它的一个子类 (比如QWidget类)继承的所有类可以包含信号和槽。 当对象改变它们的状态的时候,信号被发送,从某种意义上讲,它们也许对外面的世界感兴趣。这就是所有的对象通讯时所做的一切。它不知道也不注意无论有没有 东西接收它所发射的信号。这就是真正的信息封装,并且确保对象可以用作一个软件组件。3.2 QtNetworkQtNetwork是QT为用户提供网络功能的库,里面封装好许多个类为用户所用。本次试验用到的是QTcpServer、QTcpSocket

13、和QUdpSocket这三个类。QTcpServer提供一个TCP基础服务类,这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer挑选一个端口,可以监听一个指定的地址或者所有的机器地址。用它的listen()函数监听所有连接,在有客户端连接到服务器端就会发射一个newConnection()信号,此时可以调用nextPendingConnection()来接受待处理的连接,并返回一个QTcpSocket,我们可以用这个返回的套接字和客户端连接并通信。QTcpSocket类提供一个套接字,可以用bind()函数绑定一个主机的端口,也可以用connectToHost()函数

14、请求一个TCP连接。QUdpSocket类可以用来发送和接收UDP数据报。采用UDP时,数据是以数据报的形式从一个主机发送到另一个主机的,此中没有连接的概念,如果UDP数据报没有成功发送,它并不会向发送者发送任何错误报告。3.3 整体结构和子模块划分图5 整体结构图程序由主界面(TestWork)、TCP服务器类(MyServer)、发送文件类(Sender)和接收文件类(Receiver)组成。MyServer类派生自QTcpServer类,实质上是图6 主界面类的结构图一个TCP服务器,程序启动时就会调用它建立一个服务器进行TCP连接的监听。当一个新的连接请求到来时,它将生成一个选项框(Q

15、MessageBox)作传输控制,用户单击Yes后接收端才建立套接字传输数据,传输完成后双方都关闭套接字。等待下一次的连接。传输文件子模块可以理解为一个C/S结构的程序,客户端只有在向服务器提出文件传输的请求,服务器,即接收端才根据请求分配一个新的套接字进行传输任务,然而在程序运行的任何时刻,用户都可以使用聊天的功能,这由QUdpSocket来完成。主界面类(TestWork)为整个程序提供一个交互界面,完成所有交互功能,结构如图6所示。它包括了一些按钮和输入控件,一个用于显示聊天内容和一些信息提示的文本浏览器。除了提供界面外,该类还完成了聊天内容的收发。聊天是通过UDP数据包来实现的。图7 服务器类(Myserver)结构图服务器类(Myserver)监听文件传输的请求,并且每当新连接到来时实例化一个接收文件类(Receiver),实现文件的传输。当用户点击发送按钮时,程序就会实例化一个Sender类,如图8所示,并向该类待传输文件的路径,然后发送文件。接收文件类(Receiver)与发送类十分

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 实验设计

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号