基于Qt的p2p局域网聊天和文件传输软件要点

发布时间 : 星期五 文章基于Qt的p2p局域网聊天和文件传输软件要点更新完毕开始阅读

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 页

4 功能实现

4.1 系统设计流程

4.1.1 聊天功能的流程设计

采用DUP协议设计局域网聊天功能,在局域网聊天功能中,设计了一个客户端和一个服务端, 在通信建立的时候,通信的发起方首先确认通信的IP地址和Port端口,然后发送消息给服务端。服务端需要在同样的端口上等待发起者的信息。 客户端:

开始 从发送窗口中读入数据 Sendmessage调用UDP DatagramSocket DatagramPacket 调用Send方法发送数据 调用close方法关闭客户端 结束 图4-1 发送端工作流程图

第 9 页

服务端:

开始 DatagramSocket DatagramPacket 调用receive方法接收数据,存入datagram中 是否收到 信息 Y 进入文件 接收区 N 显示内容 调用close方法关闭服务端 结束 图4-2 接收端工作流程图

4.1.2 文件传输功能系统实现

使用TCP协议实现文件传输功能,服务端开始监听,客户端选择建立会话。会话建立成功后,开始选择文件进行传输。在文件传输开始时,由客户端给服务端发送文件,内容为待发送文件名和长度。客户端收到后判断是不是传送的文件,如果是则服务端选择接收文件。然后开始传输文件,文件传输完成后,选择关闭服务器端和客户端。

第 10 页

联系合同范文客服:xxxxx#qq.com(#替换为@)