2.4 TCP/UDP工作协议流程
(1)TCP协议的工作流程
服务器端 客户端 用socket方法建立套接用bind方法把套接字与本地地址绑定 用Listen方法准备好连用accept方法接受连接,并等待client端连接 用socket方法建立套接字 如连接已建立,accept返回新的套接字 进行连接 用connect方法把套接字与server端相连 用Receive和send方法在套接字上做数据交换 数据交换 用Receive和send方法在套接字上做数据交换 Shutdown方法用于释放连接 关闭套接字,服务结束 Shutdown方法用于释放连接 关闭套接字,服务结束
图2-1 TCP协议的工作流程
第 4 页
(2)UDP协议的工作流程
服务器端 客户端 用socket方法建立套接字 用socket方法建立套接字 用bind方法把套接字与本地地址绑定 用bind方法把套接字与本地地址绑定 用Receive和send方法在套接字上做数据交换 数据传送 用Receive和send方法在套接字上做数据交换 Shutdown方法用于释放连接 Shutdown方法用于释放连接 关闭套接字,服务结束 关闭套接字,服务结束
图2-2 UDP协议的工作流程
第 5 页
3 系统总体结构设计
3.1 基本简介
整个应用程序要实现聊天及文件传输的功能,主要由三大块组成:
(1)人机交互界面:用于显示连接状态、消息传送、实现消息输入等功能;? (2)消息传输模块:用于实现消息传输协议的封装与解包工作,实现消息传
输控制;
(3)文件传输模块:用于实现文件传输协议的封装与解包工作,实现文件头
及文件的发送与接收控制。
3.2 系统功能模块设计
交互界面包含3大功能块:
(1)聊天窗口:包括发送和接收到的信息显示框和信息的输入框; (2)文件收发:包括需要填写的建立TCP连接的服务器信息框和文件传输需
要的功能和显示进度框;
(3)附加功能:附加“消息记录”和“使用帮助”的对话框,点击对应按钮接口
打开。
3.3 功能模块介绍
3.3.1 聊天功能模块
聊天也就是信息(字符串)的收发,根据其实时性的要求与短消息传递的特点,采用UDP协议来实现。
在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。UDP的应用是很简单的。我们只需要在发送端执行writeDatagram()函数将信息发送到广播地址的某一个端口,然后接收端绑定到这个端口,只要这个端口有数据,就会发送readyRead()信号,我们接收到该信号后进行数据处理即可。 (1)客户端
/***** 创建Udp套接字和绑定端口与槽函数 *********/ QUdpSocket *UdpSender = new QUdpSocket(this); QUdpSocket *UdpReader = new QUdpSocket(this);
// 将UdpReader绑定到广播地址的5566端口,接收发到这个端口的信息
第 6 页
UdpReader->bind(5566, QUdpSocket::ShareAddress);
// 将有数据的readyRead()信号绑定到读信息的readMessage()槽函数 connect(UdpReader, SIGNAL(readyRead()), this, SLOT(readMessage())); /***** 发送消息 *********/ void sendMessage() {
QByteArray datagram = “hello world!”;
UdpSender ->writeDatagram(datagram.data(),datagram.size(), QHostAddress::Broadcast,5566); }
/***** 接收消息 *********/ void readMessage() {
//拥有等待的数据报
while(UdpReader->hasPendingDatagrams()) {
QByteArray datagram; //拥于存放接收的数据报 //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
datagram.resize(UdpReader->pendingDatagramSize());
//接收数据报,将其存放到datagram中
UdpReader->readDatagram(datagram.data(), datagram.size()); serverMessage = datagram; } } (2)服务器端
过程与代码和客户端一致,只是因为是双向通信,所以在服务器端需要发送的端口号要不一样。具体见工程代码。 3.3.2 文件传输模块
文件传送具有连续性和可靠性要求的特点,通常采用点对点通信,并应用TCP服务来保证数据传输过程中的准确性和顺序性。
TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序。我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就会发出newConnection()信号,我们可以关联这个信号到我们自己的槽函数,实现与客户端的连接。建立连接后,任何一方都可以进行数据的发送。另一端一旦
第 7 页
有数据到来就会发出readyRead()信号,我们可以关联此信号,进行数据的接收。
由于涉及到文件的拆分和增加文件头信息等,还需要管理发送和接收进度条,代码比较复杂,具体见工程代码,代码都有比较清晰的注释。
第 8 页