基于-Qt-的聊天程序设计与实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

仪器科学与工程学院信息通信网络概论第二次实验董元220112071/21信息通信网络概论实验报告实验题目:基于Qt的聊天程序设计与实现姓名:董元学号:22011207仪器科学与工程学院信息通信网络概论第二次实验董元220112072/21一.实验目的1.了解双机通信过程,并设计实现双机通信2.掌握如果利用TCP套接字创建并连接服务器3.了解在双机互联构建的局域网环境下如何进行数据交换二.实验条件和环境(一)开发平台:Qt5.2.1简介Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,易于扩展,允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。2014年4月,跨平台集成开发环境QtCreator3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP。Qt的logo以及理念仪器科学与工程学院信息通信网络概论第二次实验董元220112073/21Qt5.2.1的开发环境(二)操作系统:Windows操作系统三.实验内容1.编写一个双机通信程序,编程语言不限2.UI设计可充分发挥想象,附加功能由自己设计。注意:本次试验,我们在基础要求上,进一步发挥,完成了局域网聊天程序的设计,该程序实现了以下两个功能:1、基于UDP协议的多人聊天功能;2、基于TCP协议的文件的可靠传输。仪器科学与工程学院信息通信网络概论第二次实验董元220112074/21四.实验过程及程序(一)系统流程图开始创建UDPSOCKET套接字,绑定服务器IP地址和端口号端口有报文要读取读取消息,判断数据类型读取新用户信息新用户登录消息读取下线用户信息在线用户下线消息读取用户信息与聊天内容聊天消息用户列表删除下线用户信息用户列表添加新用户信息在聊天窗口中显示聊天内容NY系统流程图(二)主要功能代码实现1、聊天模块原理:采用UDP协议实现局域网内聊天消息的广播。原理示意图:仪器科学与工程学院信息通信网络概论第二次实验董元220112075/21开始Step1:建立SOCKET套接字,绑定主机IP与端口Step2:分配消息缓冲区,建立数据传输流Step3:向局域网内广播加入聊天的消息,上线Step4:基于UDP协议发送或接受广播消息Step5:向局域网内广播退出聊天的消息,下线结束用户界面介绍:主要功能及其具体代码实现:功能一:广播消息区消息发送区用户列表区字体格式区用户列表区仪器科学与工程学院信息通信网络概论第二次实验董元220112076/21//发送消息voidsendMessage(MessageTypetype,QStringserverAddress=);功能二://读取并处理消息voidhasPendingFile(QStringuserName,QStringserverAddress,QStringclientAddress,QStringfileName);功能一具体代码实现://使用UDP广播发送消息//参数说明:type:发送内容的数据类型;serverAddress:服务器IPvoidWidget::sendMessage(MessageTypetype,QStringserverAddress){//创建字节数组data保存数据,创建数据流out写入数据QByteArraydata;QDataStreamout(&data,QIODevice::WriteOnly);//获得本地主机名QStringlocalHostName=QHostInfo::localHostName();//获得本地IP地址QStringaddress=getIP();//发送消息:用户名+本地主机名outtypegetUserName()localHostName;//处理不同类型的消息switch(type){//消息类型为聊天信息caseMessage://发送内容不能为空,若发送内容为空,弹出警告窗口if(ui-messageTextEdit-toPlainText()==){QMessageBox::warning(0,QStringLiteral(警告),QStringLiteral(发送内容不能为空),QMessageBox::Ok);return;}//发送消息:IP地址+MessageoutaddressgetMessage();ui-messageBrowser-verticalScrollBar()-setValue(ui-messageBrowser-verticalScrollBar()-maximum());break;//消息类型为参与聊天的新请求caseNewParticipant://发送消息:新参与者的IP地址outaddress;break;//消息类型:用户下线仪器科学与工程学院信息通信网络概论第二次实验董元220112077/21caseParticipantLeft:break;//消息类型:传送文件caseFileName:{introw=ui-userTableWidget-currentRow();QStringclientAddress=ui-userTableWidget-item(row,2)-text();//发送消息:本地主机IP地址+客户端IP地址outaddressclientAddressfileName;break;}//消息类型:拒绝接受文件caseRefuse://发送消息:服务器地址outserverAddress;break;}//广播发送字节数组data中的数据udpSocket-writeDatagram(data,data.length(),QHostAddress::Broadcast,port);}功能二具体代码实现://接收并处理UDP消息voidWidget::processPendingDatagrams(){while(udpSocket-hasPendingDatagrams()){//创建数据报QByteArraydatagram;//数据包整形?datagram.resize(udpSocket-pendingDatagramSize());//读取数据报udpSocket-readDatagram(datagram.data(),datagram.size());//创建数据流in,接收消息QDataStreamin(&datagram,QIODevice::ReadOnly);intmessageType;inmessageType;QStringuserName,localHostName,ipAddress,message;QStringtime=QDateTime::currentDateTime().toString(yyyy-MM-ddhh:mm:ss);//接收消息,接收端与发送端的数据类型以及操作一一对应switch(messageType){caseMessage:仪器科学与工程学院信息通信网络概论第二次实验董元220112078/21inuserNamelocalHostNameipAddressmessage;ui-messageBrowser-setTextColor(Qt::darkBlue);ui-messageBrowser-setCurrentFont(QFont(TimesNewRoman,10));ui-messageBrowser-append([+userName+]+time);ui-messageBrowser-append(message);break;caseNewParticipant:inuserNamelocalHostNameipAddress;newParticipant(userName,localHostName,ipAddress);break;caseParticipantLeft:inuserNamelocalHostName;participantLeft(userName,localHostName,time);break;caseFileName:{inuserNamelocalHostNameipAddress;QStringclientAddress,fileName;inclientAddressfileName;hasPendingFile(userName,ipAddress,clientAddress,fileName);break;}caseRefuse:{inuserNamelocalHostName;QStringserverAddress;inserverAddress;QStringipAddress=getIP();if(ipAddress==serverAddress){server-refused();}break;}}}}2、文件传输模块:仪器科学与工程学院信息通信网络概论第二次实验董元220112079/21原理:采用TCP协议实现局域网内文件的可靠传输。原理示意图:开始建立SOCKET套接字,绑定主机IP与端口发送连接请求,“三次握手”后建立连接文件传输结束,“四次挥手”释放连接结束另一端的机器接收文件,下载到本地机器上发送文件,请求接收?拒接接收文件同意接收邮件仪器科学与工程学院信息通信网络概论第二次实验董元2201120710/21主要功能及其具体代码实现:功能一://服务器端发送数据voidTcpServer::sendMessage();功能二://客户端创建新连接voidTcpClient::newConnect();//客户端读取数据voidTcpClient::readMessage();功能一具体代码实现://服务器端发送数据voidTcpServer::sendMessage(){ui-serverSendBtn-setEnabled(false);clientConnection=tcpServer-nextPendingConnection();connect(clientConnection,SIGNAL(bytesWritten(qint64)),this,SLOT(updateClientProgress(qint64)));ui-serverStatusLabel-setText(QStringLiteral(开始传送文件%1!).arg(theFileName));localFile=newQFile(fileName);if(!localFile-open((QFile::ReadOnly))){仪器科学与工程学院信息通信网络概论第二次实验董元2201120711/21QMessageBox::warning(this,QStringLiteral(应用程序),QStringLiteral(无法读取文件%1:\n%2).arg(fileName).arg(localFile-errorString()));return;}TotalBytes=localFile-size();QDataStreamsendOut(&outBlock,QIODevice::WriteOnly);sendOut.setVersion(QDataStream::Qt_

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功