本科毕业论文.docx

上传人:小飞机 文档编号:5335912 上传时间:2023-06-27 格式:DOCX 页数:25 大小:114.77KB
返回 下载 相关 举报
本科毕业论文.docx_第1页
第1页 / 共25页
本科毕业论文.docx_第2页
第2页 / 共25页
本科毕业论文.docx_第3页
第3页 / 共25页
本科毕业论文.docx_第4页
第4页 / 共25页
本科毕业论文.docx_第5页
第5页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《本科毕业论文.docx》由会员分享,可在线阅读,更多相关《本科毕业论文.docx(25页珍藏版)》请在三一办公上搜索。

1、课程设计报告题 目:基于QT的局域网聊天室UI界面和消息发送、接收模块课 程 名称:嵌入式系统应用开发院部名称:计算机工程学院专 业:计算机科学与技术班 级:计算机科学与技术(2)班课程设计书写要求课程设计报告原则上要求学生手写,要求书写工整。若因课程特 点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律 采用A4的纸张。课程设计报告书写说明课程设计报告应包含一下七部分内容:1、摘要 2、目录3、 前言/引言 4、正文 5、结论 、6、参考文献 7、附录,每部分 的书写要求参见具体条目要求。填写注意事项(1)准确说明,层次清晰。(2)尽量采用专用术语来说明事物。(3)外文、符号、公式

2、要准确,应使用统一规定的名词和符号。(4)应独立完成实验报告的书写,严禁抄袭、复印,一经发现, 以零分论处。课程设计报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验 报告的批改成绩采用百分制,具体评分标准由各院部自行制定。实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报 告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课 程的实验大纲。课程设计题目:基于 QT的局域网聊天室 一ui界面和消息发送、接收模块一、摘要嵌入式系统是软件和硬件的综合体,嵌入式系统是与应用紧密结合的,具有 很强专用性,必须结合实际系统需求进行合理的裁减利用。嵌入式在电

3、子行业的应用很广泛,学习嵌入式显得非常重要。这次课程设计 的主要目的是检验学习qt软件后的效果。通过基础题的代码编写,熟悉C+语 言编程技巧。通过完成聊天程序的设计,熟悉嵌入式底层编程。利用QT设计界 面,缩短开发时间。关键字:嵌入式、tcp SOCKET、QT软件二、目录一、摘要1二、目录2三、前言/弓|言3四、正文44.1原理与关键技术44.1.1条件与限制44.1.2开发环境说明44.1.3运行环境说明44.1.4设计思路的分析和可行性44.1.5信号和槽机制44.1.6聊天平台的设计思想54.1.7技术路线54.2系统的总体设计64.2.1界面设计64.2.2服务器端的设计74.2.3

4、客户端的设计84.3各个模块的具体实现过程94.3.1主界面设计主要代码分析94.3.2服务器端主要程序代码分析114.3.3客户端主要程序代码分析12五、结论14六、参考文献15七、附录16三、前言/引言局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具, 一般都具有文本聊天和文件传输功能。局域网聊天软件因其使用简单,系统资源 消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。随着中小型企事业的不断发展,在企业内部实现局域网通信是必不可少的, 随之出现了企业即时通讯,它是一种面向企业终端使用者的网络沟通工具服务, 使用者可以通过安装了即时通信的终端机进行两人或多人之

5、间的实时沟通。交流 内容包括文字、界面、语音、视频及文件互发等。四、正文4.1原理与关键技术4.1.1条件与限制本系统为普通聊天系统,主要是局域网内成员使用,要求界面简洁,操作简 单,以处理事物为核心,保证程序的可靠性。本系统处理数据量有限,适用于局 域网用户,但性能良好,能满足局域网成员的基本需求。可以应对各种由于系统产生的错误,比如信息发送失败,不能接收信息等, 要求尽可能多的预防此类事件的发生,并准备好应对措施和向用户提供提示信 息。要保证程序有一定的容错性,当用户进行非法操作或系统本身出现错误时要 能以合理的方式退出程序。4.1.2开发环境说明1. 编程语言:C+2. 操作系统:win

6、dows xp 32位系统3. 开发平台:QT creator4.1.3运行环境说明1. CPU:酷睿 i52. 内存:2GB3. 硬盘:500G4. 操作系统:windows xp 32位系统4.1.4设计思路的分析和可行性本如软件采用服务器和客户端的形式。服务器负责监听客户端和接收客户端 发送过来的信息,并在显示在界面上。客户端则向服务端发送信息,在本地呈现 的同时,通过网络实时发往服务器。用户在服务器器上也可以看见客户端发送的 消息,并获取最新客户端发送的消息。网络编程技术的成熟和界面设计技术使得客户端与服务端通信的设计成为 可能,而且此软件同过设置IP是聊天通信更为方便。4.1.5信号

7、和槽机制信号:当对象改变其状态时,信号就由该对象发射(emit)出去,而且对象 只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信 息封装,能确保对象被当作一个真正的软件组件来使用。槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否 有任何信号与自己相连接。而且对象并不了解具体的通信机制。信号与槽的连接:所有从QObject或其子类(例如Qwidget )派生的类 都能够包含信号和槽。因为信号与槽的连接是通过QObject的connect。成员 函数来实现的。4.1.6聊天平台的设计思想本系统采用服务器和客户端的形式。服务器主要模拟服务器的控制端,来对客户端

8、的各种状态进行监听。可以通 过网络向客户端发送信息,并接受客户端传来的信息,供用户参考。客户端主要通过IP连接服务器。客户端在显示自己状态的同时,通过网络 实时将自己的状态发送到服务器端。4.1.7技术路线UDP协议:UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连 接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是 UDP的正式规范。UDP协议的全称是用户数据报协议1,在网络中它与TCP协议一样用于处 理数据包,是一种无连接的

9、协议。在OSI模型中,在第四层一一传输层,处于 IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺 点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的UDP用来 支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的 众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今 已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使 是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协 议)协议的顶层。根据OSI(开放系统互连)参考模型

10、,UDP和TCP都属于传输 层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数 据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头 信息,剩余字节则用来包含具体的传输数据。TCP协议:TCP(Transmission Control Protocol传输控制协议)是一种面向连接(连 接导向)的、可靠的、基于IP的传输层协议,由IETF的RFC 793说明(specified)。TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 协议/网间协议,是一个工业标准的协议集,它是为广域网

11、(WAN)设计的。它是 由ARPANET网的研究机构发展起来的。TCP/IP的标准在一系列称为RFC的文档中公布。文档由技术专家、特别工 作组、或RFC编辑修订。公布一个文档 时,该文档被赋予一个RFC编号,如RFC959 (FTP的说明文档)、RFC793(TCP的说明文档)、RFC791(IP的说明文档)等。 最初的RFC 一直保留而从来不会被更新,如果修改了该文档,则该文档又以一 个新号码公布。因此,重要的是要确认你拥有了关于某个专题的最新RFC文档。 通常在RFC的开头部分,有相关RFC的更新(update)、修改(errata)、作废 (obsolete)信息,提示读者信息的时效性。

12、TCP与UDP的区别:1. TCP协议面向连接,UDP协议面向非连接;2. TCP协议传输速度慢,UDP协议传输速度快3. TCP有丢包重传机制,UDP没有;4. TCP协议保证数据正确性,UDP协议可能丢包4.2系统的总体设计4.2.1界面设计图1主界面软件左边那大块是聊天内容显示界面,这里局域网相当于qq中的qq群,即 群聊。该程序实现的是每个用户登录既是客户端又是服务器端,这就需要看你站 在哪个角度看问题了。简单的说,当用户发送信息给别人时就是客户端,当接收 别人的信息是就可以看做是服务器端。4.2.2服务器端的设计请选择要发送的文件!图2发送文件界面服务器端界面主要如图所示,包括界面部

13、分和控制部分。界面执行显示功能,包括打开、发送、关闭功能。发送端流程:图3发送端流程4.2.3客户端的设计等待接收文件-取消关闭图4接收文件界面客户端界面如图所示,采用的是界面驱动的方式。客户端有自己的窗口,都可以单独向服务器端发送状态信息。客户端主要包括发送和清除当前信息的功能呢,还有通过IP连接服务器的 功能。客户端的界面响应用户的操作时,可以向服务器报告自己的信息。客户端也会将必要的信息定时报告给服务器。接收端流程:初始化TCP Socket 并绑定到指定端口接收文件nN |扣绝接堂文件 处理-N触发更新发送进度条图5接收端流程4.3各个模块的具体实现过程4.3.1主界面设计主要代码分析

14、/接收UDP信息void Widget:processPendingDatagrams()/hasPendingDatagrams返回true时表示至少有一个数据报在等待被读取while(udpSocket-hasPendingDatagrams()QByteArray datagram;/pendingDatagramSize为返回第一个在等待读取报文的size, resize函数是把datagram的size 归一化到参数size的大小一样datagram.resize(udpSocket-pendingDatagramSize();/将读取到的不大于datagram.size()大小数据

15、输入到datagram.data()中,datagram.data()返 回的是一个字节数组中存储数据位置的指针udpSocket-readDatagram(datagram.data(), datagram.size();QDataStream in(&datagram, QIODevice:ReadOnly);/ 因为其属性为只读,所以是输入int messageType; /此处的 int 为 qint32,在 Qt 中,qint8 为 char,qint16 为 uintin messageType; /读取1个32位长度的整型数据到messageTyep中QString userNa

16、me,localHostName,ipAddress,message;QString time = QDateTime:currentDateTime().toString(yyyy-MM-dd hh:mm:ss);/将当前的时间转化到括号中的形式switch(messageType)case Message:/in后面如果为Qstring,则表示读取一个直到出现0的字符串in userName localHostName ipAddress message;ui-messageBrowser-setTextColor(Qt:blue);/ 设置文本颜色ui-messageBrowser-se

17、tCurrentFont(QFont(Times New Roman,12);/ 设置字体大小/ ui-messageBrowser-append( +userName+ + time);/输出的格式为用户名加时 间显示/输出的格式为主机名加时间显示,但输出完后为什么会自动换行呢?ui-messageBrowser-append( +localHostName+ + time);ui-messageBrowser-append(message);/ 消息输出break;case NewParticipant:in userName localHostName ipAddress;newPart

18、icipant(userName,localHostName,ipAddress);break;case ParticipantLeft:in userName localHostName;participantLeft(userName,localHostName,time);break;case FileName:break;case Refuse:break;4.3.2服务器端主要程序代码分析/开始发送数据void TcpServer:sendMessage()/是 connect 中的槽函数ui-serverSendBtn-setEnabled(false);/当在传送文件的过程中,发

19、送按钮不可用clientConnection = tcpServer-nextPendingConnection();/用来获取一个巳连接的 TcpSocket/bytesWritten为qint64类型,即长整型connect(clientConnection, SIGNAL(bytesWritten(qint64), /?this, SLOT(updateClientProgress(qint64);ui-serverStatusLabel-setText(tr(开始传送文件 %1 ! ).arg(theFileName);localFile = new QFile(fileName);

20、/localFile 代表的是文件内容本身 if(!localFile-open(QFile:ReadOnly)QMessageBox:warning(this, tr(应用程序”),tr(无法读取文件 %1:n%2).arg(fileName).arg(localFile-errorString();/errorString 是系 统自带的信息return;TotalBytes = localFile-size();/ 文件总大小/头文件中的定义QByteArray outBlock;QDataStream sendOut(&outBlock, QIODevice:WriteOnly);/

21、设置输出流属性sendOut.setVersion(QDataStream:Qt_4_7);/设置Qt版本,不同版本的数据流格式不同time.start(); / 开始计时QString currentFile = fileName.right(fileName.size() /currentFile 代表所选文件的文件 名-fileName.lastIndexOf(/)-1);/qint64(0)表示将0转换成qint64类型,与(qint64)0等价/如果是,则此处为依次写入总大小信息空间,文件名大小信息空间,文件名sendOut qint64(0) qint64(0) seek(0);/

22、返回到 outBlock 的开始,执行覆盖操作/发送总大小空间和文件名大小空间sendOut TotalBytes write(outBlock)为套接字将内容发送出去,返回实际发送出去的字节数bytesToWrite = TotalBytes - clientConnection-write(outBlock);outBlock.resize(0);/why?4.3.3客户端主要程序代码分析/创建新连接void TcpClient:newConnect() blockSize = 0;tcpClient-abort();/取消巳有的连接tcpClient-connectToHost(host

23、Address, tcpPort);/连接到指定 ip 地址和端口的主机 time.start();/读取数据void TcpClient:readMessage()QDataStream in(tcpClient);/这里的 QDataStream 可以直接用 QTcpSocket 对象做参数in.setVersion(QDataStream:Qt_4_7);float useTime = time.elapsed();if (bytesReceived bytesAvailable()/bytesAvailable 为返回将要被读取的字节数=sizeof(qint64)*2) & (fil

24、eNameSize = 0)五、结论本文使用面向对象程序设计思想,设计开发QT聊天系统。聊天系统要完成 的任务就是提供用户操作界面,方便用户之间在局域网的环境下相互通信。程序 的核心是通过基于TCP/IP的Socket来实现消息传递的通信部分。通过此次课程 设计的锻炼,提高了我们解决实际问题的能力,让我们能更加从容地面对未来的 工作。六、参考文献1 霍亚飞.Qt及Qt Quick开发实战精解.北京航空航天大学出版社,2012; 155-122 布兰切特(Jasmin Blanchette )等.C+GUI Programmingwith Qt4 M.第二版.电子工业出版社,2008: 223-

25、30七、附录关键代码:Tcpserver.cpp:#include tcpserver.h#include ui_tcpserver.h#include #include #include #include #include #include TcpServer:TcpServer(QWidget *parent):QDialog(parent),ui(new Ui:TcpServer)ui-setupUi(this);setFixedSize(350,180);tcpPort = 6666;tcpServer = new QTcpServer(this);connect(tcpServer,

26、 SIGNAL(newConnection(), this, SLOT(sendMessage();initServer();TcpServer:TcpServer()delete ui;/初始化void TcpServer:initServer()payloadSize = 64*1024;TotalBytes = 0;bytesWritten = 0;bytesToWrite = 0;ui-serverStatusLabel-setText(tr(请选择要传 送的文件);ui-progressBar-reset();ui-serverOpenBtn-setEnabled(true);ui-

27、serverSendBtn-setEnabled(false);tcpServer-close();/开始发送数据void TcpServer:sendMessage()ui-serverSendBtn-setEnabled(false);clientConnection=tcpServer-nextPendingConnection();connect(clientConnection,SIGNAL(bytesWritten(qint64),this,SLOT(updateClientProgress(qint64);ui-serverStatusLabel-setText(tr(开始传送文

28、 件 %1 ! ).arg(theFileName);localFile = new QFile(fileName);if(!localFile-open(QFile:ReadOnly)QMessageBox:warning(this, tr(应用程序”), tr(无法读取文件%1:n%2).arg(fileName).arg(l ocalFile-errorString();return;TotalBytes = localFile-size();QDataStreamsendOut(&outBlock,QIODevice:WriteOnly);sendOut.setVersion(QDat

29、aStream:Qt_4_8);time.start(); / 开始计时QStringcurrentFile=fileName.right(fileName.size()-fileName.lastIndexOf(/)-1);sendOut qint64(0)qint64(0)seek(0);sendOut TotalBytes write(outBlock);outBlock.resize(0);/更新进度条void TcpServer:updateClientProgress(qint64 numBytes) qApp-processEvents();bytesWritten += (in

30、t)numBytes;if (bytesToWrite 0) outBlock=localFile-read(qMin(bytesToWrite, payloadSize);bytesToWrite-二(int)clientConnection-write(outBlock);outBlock.resize(0); else localFile-close();ui-progressBar-setMaximum(TotalBytes);ui-progressBar-setValue(bytesWritten);float useTime = time.elapsed();double spee

31、d = bytesWritten / useTime;ui-serverStatusLabel-setText(tr( 已 发 送 %1MB (%2MB/s)n共%3MB已用时:4秒n估计剩 余时间:5秒).arg(bytesWritten/(1024*1024).arg(speed*1000 / (1024*1024), 0, f, 2).arg(TotalBytes / (1024 * 1024).arg(useTime/1000, 0, f, 0).arg(TotalBytes/speed/1000 - useTime/1000, 0, f, 0);if(bytesWritten = T

32、otalBytes) localFile-close(); tcpServer-close(); ui-serverStatusLabel-setText(tr(传送文件 %1 成功”).arg(theFileName);/打开按钮void TcpServer:on_serverOpenBtn_clicked()fileName 二 QFileDialog:getOpenFileName(this);if(!fileName.isEmpty()theFileName=fileName.right(fileName.size()-fileName.lastIndexOf(/)-1);ui-ser

33、verStatusLabel-setText(tr(要传送的文件为:%1 ”).arg(theFileName);ui-serverSendBtn-setEnabled(true);ui-serverOpenBtn-setEnabled(false);/发送按钮void TcpServer:on_serverSendBtn_clicked()void TcpServer:on_serverCloseBtn_clicked()if(tcpServer-isListening()tcpServer-close();if (localFile-isOpen()localFile-close();cl

34、ientConnection-abort();close();/被对方拒绝void TcpServer:refused()tcpServer-close();ui-serverStatusLabel-setText(tr(对方拒绝接收! !);if(!tcpServer-listen(QHostAddress:Any,tcpPort) /开始监听qDebug() errorString();close();return;ui-serverStatusLabel-setText(tr(等待对方接 收);emit sendFileName(theFileName);/关闭按钮/关闭事件void T

35、cpServer:closeEvent(QCloseEvent *)on_serverCloseBtn_clicked();Tcoclient.cpp:#include tcpclient.h#include ui_tcpclient.h#include #include #include TcpClient:TcpClient(QWidget *parent):QDialog(parent),ui(new Ui:TcpClient)ui-setupUi(this);setFixedSize(350,180);TotalBytes = 0;bytesReceived = 0;fileNameS

36、ize = 0;tcpClient = new QTcpSocket(this);tcpPort = 6666;connect(tcpClient, SIGNAL(readyRead(), this, SLOT(readMessage();connect(tcpClient,SIGNAL(error(QAbstractSocket:SocketError),this,SLOT(displayError(QAbstractSocket:SocketError) ;TcpClient:TcpClient()delete ui;/设置文件名void TcpClient:setFileName(QSt

37、ring fileName)localFile = new QFile(fileName);/设置地址void TcpClient:setHostAddress(QHostAddressaddress)hostAddress = address;newConnect();/创建新连接void TcpClient:newConnect()blockSize = 0;tcpClient-abort();tcpClient-connectToHost(hostAddress,tcpPort);time.start();/读取数据void TcpClient:readMessage()QDataStr

38、eam in(tcpClient);in.setVersion(QDataStream:Qt_4_7);float useTime = time.elapsed();if (bytesReceived bytesAvailable()=sizeof(qint64)*2) & (fileNameSize=0)inTotalBytesfileNameSize;bytesReceived += sizeof(qint64)*2;if(tcpClient-bytesAvailable()=fileNameSize) & (fileNameSize != 0) infileName;bytesRecei

39、ved +=fileNameSize;if(!localFile-open(QFile:WriteOnly) QMessageBox:warning(this,tr( 应 用程序),tr(无法读取文件1:n%2.).arg(fileNam e).arg(localFile-errorString();return; else return;if (bytesReceived bytesAvailable(); inBlock = tcpClient-readAll(); localFile-write(inBlock); inBlock.resize(0);ui-progressBar-set

40、Maximum(TotalBytes); ui-progressBar-setValue(bytesReceived);double speed = bytesReceived / useTime;ui-tcpClientStatusLabel-setText(tr(已 接 收 %1MB (%2MB/s)n共%3MB已用时:4秒n估计剩余时间:5秒).arg(bytesR eceived / (1024*1024).arg(speed*1000/(1024*1024),0,f,2).arg(TotalB ytes / (1024 * 1024).arg(useTim e/1000,0,f,0)

41、.arg(TotalB ytes/speed/1000 - useTime/1000,0,f,0);if(bytesReceived = TotalBytes) localFile-close();tcpClient-close();ui-tcpClientStatusLabel-setText(tr(接 收文件%1完毕).arg(fi leName);/错误处理voidTcpClient:displayError(QAbstractSocket:SocketEr ror socketError) switch(socketError)case QAbstractSocket:RemoteHo

42、stClosedError : break;default : qDebug() errorString();/取消按钮tcpClient-abort();void TcpClient:on_tcpClientCancleBtn_clicked()if (localFile-isOpen()localFile-close();tcpClient-abort();close();if (localFile-isOpen()localFile-close();/关闭事件void TcpClient:closeEvent(QCloseEvent *)/关闭按钮void TcpClient:on_tcpClientCloseBtn_clicked()on_tcpClientCloseBtn_clicked();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号