毕业设计基于Qt嵌入式网络聊天系统的设计之欧阳史创编.docx
- 文档编号:10110455
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:20
- 大小:108.59KB
毕业设计基于Qt嵌入式网络聊天系统的设计之欧阳史创编.docx
《毕业设计基于Qt嵌入式网络聊天系统的设计之欧阳史创编.docx》由会员分享,可在线阅读,更多相关《毕业设计基于Qt嵌入式网络聊天系统的设计之欧阳史创编.docx(20页珍藏版)》请在冰豆网上搜索。
毕业设计基于Qt嵌入式网络聊天系统的设计之欧阳史创编
时间:
2021.02.10
创作:
欧阳史
本科生毕业论文(设计)
题 目
AFunctionalistApproachtoTranslationofTourismTexts
姓 名
商广浩学号0812301048
院 系
物理工程学院
专 业
电子信息工程
指导教师
王艳娜职称讲师
2012年5月15日
曲阜师范大学杏坛学院教务处制
摘要3
关键词3
Abstract3
keyword4
引言4
1QT6
1.1QT的概念6
1.2QT的发展史和前景7
1.3QT的主要功能8
2WINDOWSSOCKETS网络编程的研究4
2.1TCP/IP体系结构5
2.2.1TCP/IP简介5
2.2.2TCP/IP的特点5
2.2基本套接字5
2.3客户机/服务器模式7
2.4SOCKETS程序设计8
2.4.1SOCKETSAPI简介8
2.4.2WINDOWSSOCKETS机制9
3网络通信模块分析11
3.1网络通信程序设计过程11
3.2网络通信程序设计核心13
3.2.1通信设计代码分析13
3.2.2数据传输代码分析17
3.2.3出错处理19
4界面模块分析20
4.1服务器端界面模块分析20
4.2客户端界面模块分析21
4.2.1用户登陆界面分析21
4.2.2用户聊天界面分析24
5数据库模块分析27
5.1数据库的选择27
5.2数据库访问方法27
5.3ADO数据库编程27
5.3.1ADO与 ADO接口简介27
5.3.2使用ADO操作SQL代码分析28
6总结33
6.1体会和感想33
6.2总结33
第七章、参考书目34
基于Qt嵌入式网络聊天系统的设计
电子信息工程专业学生商广浩
指导老师王艳娜
摘要:
本文主要介绍了如何用QT技术来实现一个局域网的聊天软件。
论文阐述了QT的概念,发展历史,功能及其应用平台,以及QT的发展前景;本论文讨论了linus环境下局域网聊天程序的设计思路和设计方法。
其中网络通信部分采用流行的TCP/IP协议。
程序采用典型的C/S(服务器/客户端)构架。
用socket编程设计网络通讯。
界面设计部分采用QT框架。
数据库采用微软SQLServer。
本文最终设计了一个简易版本的聊天软件,包括登陆、退出、添加好友、消息收/发等功能。
关键词:
QT,TCP/IP通信,SocketsAPI,C/Sarchitecture
Qtbasedembeddednetworkchatsystemdesign
StudentmajoringinElectronicandInformationEngineeringshangguanghao
Tutorwangyanna
ABSTRACT:
ThisarticlediscusseshowtodesignanddevelopaLANchattingprograminLinusenvironment.ThenetworkcommunicationpartdependsonthepopularTCP/IPprotocol.SoftwareisbasedonC/Sarchitecture.NetworkcommunicationisdevelopedwithSocket.UIisdesignedwithQTframe.DatabaseisdesignedwithSQLserver.Thearticledescribesaconcisechartsoftwareversion,withthefunctionofloggingin/out,addingfriendtolist,sending/receivingmessageandsoon.
Keywords:
QT,TCP/IPcommunication,SocketsAPI,C/Sarchitecture
引言:
近年来,随着全球信息化的不断发展,网络也在飞速发展。
出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。
在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。
然而,随着企业规模的扩大,业务量的增加,企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,避免企业内部机密通过Internet泄露到外部。
为了解决上述矛盾,人们提出了开发局域网聊天软件的构想,通过局域网聊天软件,企业员工可以随时的进行即时消息传递,召开网络会议等,有利于提高工作效率,同时又保护了企业内部信息的安全。
随着用户对软件功能的需求不断提高,即时通讯的产品也不断地更新换代。
即时通讯的发展不论是在基础应用方面还是在扩展应用方面都有着飞跃。
为了满足用户的需求,包括腾讯公司的聊天软件QQ在内,许多即时性聊天工具都推出了语音聊天、视频聊天功能模块。
本课题研究的是基于局域网的聊天室,用VC++编写的程序,程序实现一般的文字聊天功能,可作为某局域网的交流工具。
本系统采用基于Socket的方法实现局域网通信,基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。
它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。
基于Socket的局域网聊天工具很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。
它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点[3]。
基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
如今基于局域网的即时通信工具一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟。
UDP的实时性比较好,但是不一定提供可靠的数据传输,TCP可以提供可靠的数据传输,本课题采用TCP完成局域网聊天室的设计。
1QT
1.1QT的概念
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。
它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。
Qt是面向对象语言,易于扩展,并且允许组件编程。
2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具。
1.2QT的历史和发展
*1996OctKDE组织成立
*1998Apr05Trolltech的程序员在5天之内将Netscape5.0从Motif移植到Qt上
*1998Apr08KDEFreeQt基金会成立
*1998Jul09Qt1.40发布
*1998Jul12KDE1.0发布
*1999Mar04QPL1.0发布
*1999Mar12Qt1.44发布
*1999Jun25Qt2.0发布
*1999Sep13KDE1.1.2发布
*2000Mar20嵌入式Qt发布
*2000Sep06Qt2.2发布
*2000Oct05Qt2.2.1发布
*2000Oct30Qt/Embedded开始使用GPL宣言
*2000Sep04Qtfreeedition开始使用GPL
*2008Nokia从Trolltech公司收购Qt,并增加LGPL的授权模式
*2011Digia从Nokia收购了Qt的商业版权,从此Nokia负责QtonMobile,QtCommercial由Digia负责
1.3QT的主要功能
Qt4.6首次包含了对Symbian平台的支持,并在其所支持的平台中新增了Windows7、AppleMacOS10.6(雪豹)和即将上市的Maemo6。
此外还为实时操作系统QNX和VxWorks提供了网络社区支持。
对Maemo5的支持目前也已进入研发阶段,其技术预览版第二版于2009年12月1日发布。
Qt对X11、X86、ARM及Symbian的支持首次为开发人员创造了使用同一代码库同时针对这多个平台进行开发的机会。
能够跨平台分享代码就意味着开发人员所开发的应用程序上市的速度将更快,影响的设备用户群将更广。
QtMobility项目下的全新QtAPI技术预览版也同时发布。
这些跨平台的API为开发人员提供了多种功能,如导航类设备的定位功能,以及信息发送和接收、联系人和网络连接管理等。
性能提升主要包括:
一个经过高度优化、重新编写的QtGraphicsView渲染算法、一个全新的OpenGL绘图引擎、WebKit、使用OpenVG对2D矢量图形的支持,以及对全新DirectFB的支持。
2Socket网络编程的研究
2.1TCP/IP体系结构
2.2.1TCP/IP简介
TCP/IP作为Internet的核心协议,通过近二十多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。
TCP/IP协议集确立了Internet的技术基础。
TCP/IP协议主要作用于OSI网络参考模型中的网络层(第3层)、传输层(第4层)和应用层(第7层)。
数据链路层(第2层)的功能主要应用于其它协议如以太网(Ethernet)、ATM、帧中继(FrameRelay),以及多数供应商特定协议等。
TCP/IP充分支持所有通用第2层协议。
TCP/IP组中的应用程序通常直接运行于传输层协议TCP或UDP上面,并不需要表示层(第6层)和会话层(第5层)的支持。
2.2.2TCP/IP的特点
TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。
因此用户一般不涉及。
编程时,编程界面有两种形式:
一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。
前者为核内设计,后者为核外设计。
用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。
2.2基本套接字
下面给出几个基本的套接字,这些套接字的使用贯穿了网络编程的始末,主导了数据通信的过程。
这将在以后的篇幅中会给出更详细的使用说明。
1、创建套接字——socket()
功能:
使用前创建一个新的套接字
格式:
SOCKETPASCALFARsocket(intaf,inttype,intprocotol);
参数:
af:
通信发生的区域
type:
要建立的套接字类型
procotol:
使用的特定协议
2、指定本地地址——bind()
功能:
将套接字地址与所创建的套接字号联系起来。
格式:
intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
参数:
s:
是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:
没有错误,bind()返回0,否则SOCKET_ERROR
3、建立套接字连接——connect()和accept()
功能:
共同完成连接工作
4、监听连接——listen()
功能:
用于面向连接服务器,表明它愿意接收连接。
格式:
intPASCALFARlisten(SOCKETs,intbacklog);
5、数据传输——send()与recv()
功能:
数据的发送与接收
6、多路复用——select()
功能:
用来检测一个或多个套接字状态。
7、关闭套接字——closesocket()
功能:
关闭套接字s
格式:
BOOLPASCALFARclosesocket(SOCKETs)。
2.3客户机/服务器模式
在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。
该模式的建立基于以下两点:
1、非对等作用;2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务,过程如下所示:
1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
2、等待客户请求到达该端口。
3、接收到重复服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求
5、关闭服务器。
客户方:
1、打开一通信通道,并连接到服务器所在主机的特定端口。
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
3、请求结束后关闭通信通道并终止。
2.4SOCKETS程序设计
2.4.1SOCKETSAPI简介
VC++对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。
其中,SocketsAPI是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。
最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的BerkeleySocket接口(套接字)。
在桌面操作系统进入Windows时代后,仍然继承了Socket方法。
在TCP/IP网络通信环境下,Socket数据传输是特殊的I/O,它也相当于文件描述符,具有一个类似于打开文件的函数调用-socket()。
可以这样理解:
Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。
Socket存在于一个"通信域"(为描述一般的线程如何通过Socket进行通信而引入的抽象概念)里,并且与另一个域的Socket交换数据。
Socket有三类。
第是SOCK_STREAM(流式),提供面向连接的可靠的通信服务,比如telnet,http。
第二种是SOCK_DGRAM(数据报),提供无连接不可靠的通信,比如UDP。
第三种是SOCK_RAW(原始),主要用于协议的开发和测试,支持通信底层操作,比如对IP和ICMP的直接访问。
2.4.1SOCKETS机制
1、异步选择机制:
SOCKETS的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
SOCKETS提供了一个异步选择函数WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。
FD_READ期望在套接字上收到数据(即读准备好)时接到通知
FD_WRITE期望在套接字上可发送数据(即写准备好)时接到通知
FD_OOB期望在套接字上有带外数据到达时接到通知
FD_ACCEPT期望在套接字上有外来连接时接到通知
FD_CONNECT期望在套接字连接建立完成时接到通知
FD_CLOSE期望在套接字关闭时接到通知
例如:
我们要在套接字读准备好或写准备好时接到通知,语句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
如果我们需要注销对套接字网络事件的消息发送,只要将lEvent设置为0。
2、异步请求函数
在BerkeleySockets中请求服务是阻塞的,WINDOWSSICKETS除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。
3网络通信模块分析
3.1网络通信程序设计过程
在调用了sockets的启动函数WSACleanup()之后才能进行其他的Socket系统调用,但启动函数WSAStartup()是为了建立与WindowsSocketsDLL的连接,因此在VC++6.0所建立工程的工程设置中的连接的库模块必须进行设置,在其中的link栏内的对象/库模块中加入“Ws2_32.lib”,才能真正建立建立与SocketsDLL的连接。
其他的Socket系统调用包括创建Socket、将创建的Socket与本地端口绑定、建立Socket连接服务器、监听是否有连接、请求数据的可控缓冲发送和可控缓冲接收,到最后关闭Socket。
具体流程图如1所示。
首先在服务器方,利用socket()函数建立流式套接字,返回套接字号s,接着利用bind()函数将套接字s与本地地址绑定,紧接着利用listen(0函数通知TCP,监听客户方,服务器准备接收连接,没有连接的话,服务器方通过closesocket()关闭套接字s,服务结束。
有连接的话,在客户方,通过socket()函数建立流式套接字s,此时在服务器方,建立连接,通过accept()返回,得到新的套接字ns,客户方通过connect()将套接字s与远程地址连接,此时服务器方/客户方在ns/s上读/写数据,直到交换完成。
交换完成后,服务器方/客户方关闭套接字ns/s,最后服务器方通过closesocket()关闭最初套接字s,服务结束。
具体设计过程如图1所示,具体设计代码将会在下面介绍:
3.2.1通信设计代码分析
先分析服务器端。
首先定义初始化网络函数,也就是SOCKETS的启动
在所有WINDOWSSOCKETS函数中,只有启动函数WSAStartup()和终止函数WSACleanup()是必须使用的。
启动函数必须是第一个使用的函数,而且它允许指定WINDOWSSOCKETSAPI的版本,并获得SOCKETS的特定的一些技术细节。
本结构如下:
intPASCALFARWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);
其中wVersionRequested保证SOCKETS可正常运行的DLL版本,如果不支持,则返回错误信息。
接下来就是对SOCKET的设置,本程序使用的数据传输模式是异步非阻塞模式,设置好之后就是监听客户端信息,
另外,发生在相应Socket上的各种网络异步事件的处理函数,其中OnAccept传进来的参数是服务器端创建的套接字,OnClose()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。
定义OnAccept()函数来接受连接请求,并保存与发起连接请求的客户端进行通信Socket,为新的socket注册异步事件;定义OnSend()函数来给客户端发数据时做相关预处理;定义OnReceive()函数来读出网络缓冲区中的数据包;定义OnClose()函数来结束与相应的客户端的通信,释放相应资源。
接下来讲讲客户端方。
首先初始化网络部分,带不需要将套接字设置为监听模式。
注册异步事件时,没有FD_ACCEPT,但增加了FD_CONNECT事件,因此没有OnAccept()函数,但增加了OnConnect()函数。
向服务器发出连接请求时,使用connect()函数,连接成功后,会响应到OnConnect()函数中。
下面是OnConnect()函数的定义,传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标志。
另外定义OnReceive()函数来处理网络数据到达事件;定义OnSend()函数来处理发送网络数据事件;定义OnClose()函数来处理服务器的关闭事件。
3.2.2数据传输代码分析
在服务器方用WSASend()函数来发送数据,使用WSARecv()来接收数据。
Sockets不鼓励用户使用阻塞方式传输数据,因为那样可能会阻塞整个linus环境。
若无错误发生且发送操作立即完成,则WSASend()函数返回所发送的字节数。
(注意该数目可能小于len参数所指定的值)。
如果连接结束,则返回0。
请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。
否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码,返回-1。
错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。
任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。
若无错误发生且接收操作立即完成,则WSARecv()函数返回所接收的字节数。
如果连接结束,则返回0。
请注意在这种情况下完成指示(启动指定的完成例程或设置一个事件对象)将早已发生。
否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
错误代码WSA_IO_PENDING表示重叠操作成功启动,过后将有完成指示。
任何其他的错误表示重叠操作未能成功地启动,以后也不会有完成指示。
若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。
否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
若无错误发生,recv()返回读入的字节数。
如果连接已中止,返回0。
否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
4界面模块分析
4.1服务器端界面模块分析
在服务器界面设计上设计很简单,通过一个列表框来显示服务器信息,一个启动按钮来启动服务器,一个退出按钮关闭服务器。
如果服务器启动没有什么问题就会在列表框中显示“创建服务器成功”字样。
当用户登陆,就会在列表框中显示如“127.0.0.1连接,接受127.0.0.1:
USER1001,接受127.0.0.1:
PASS1001”三行字样,如果登陆成功,在列表框中就会显示“接受127.0.0.1:
LIST”字样,获取在线用户列表。
如果登陆失败,在列表框中就会显示如“127.0..0.1断开”字样。
在注册用户的时候,如果注册成功,在列表框中就会显示如“ADDUSER1001SUCCESS”,如果失败,就会在列表框中显示“ADDUSERFAIL”
当修改用户信息的时候就会在列表框中显示“接受127.0.0.1:
GINF1001”,如果修改成功,就会在列表框中显示“接受127.0.0.1:
UINF1001”。
4.2客户端界面模块分析
客户端界面主要包括用户登陆界面、用户注册界面、在线用户列表界面、用户聊天界面。
其中客户端界面设计思路,主要设计过程如图3所示:
图3客户端界面轮廓
4.2.1用户登陆界面分析
用户登陆界面如图4所示
图4用户登陆界面
如图4显示,当单击“登陆”按钮进行用户的登陆:
当用户号码未填写时,会提示“请输入用户号码”。
当用户密码未填写时,会提示“请输入用户密码”。
当服务器IP未填写或格式不正确,会提示“请填写正确的服务器地址”。
勾选“保护密码”,在下次打开该登陆界面时,在输入框里自动显示上次登陆时输入的三项信息。
用户信息填写完毕后,按“登陆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 基于 Qt 嵌入式 网络 聊天 系统 设计 欧阳 创编