局域网聊天软件设计与实现(程序代码+任务书+说明书+外文翻译+演示文稿)_第1页
局域网聊天软件设计与实现(程序代码+任务书+说明书+外文翻译+演示文稿)_第2页
局域网聊天软件设计与实现(程序代码+任务书+说明书+外文翻译+演示文稿)_第3页
局域网聊天软件设计与实现(程序代码+任务书+说明书+外文翻译+演示文稿)_第4页
局域网聊天软件设计与实现(程序代码+任务书+说明书+外文翻译+演示文稿)_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

i局域网聊天软件设计与实现摘要局域网聊天软件是在Linux系统下运行的一个应用程序,程序用c+语言编写。本程序有如下功能:用户列表自动刷新、通过TCP通信协议进行消息收发、MYsql数据库保存用户名与密码。该设计是一个简单的局域网聊天软件,适用于企业内部和实验室使用,不与互联网进行数据交换,具有高速、安全等优势。本文着重介绍下列内容:对用户上下线消息通知、聊天消息收发等进行数据解析;TCP网络编程,讲述用TCP创建Client和Server以及收发数据的实现;最后对本设计的具体实现方法和设计实现流程进行讲解以及程序运行分析。关键词:Linux;TCP;Socket;Mysql数据库;C+iiTheDesignAndImplementationofTheLANChatSoftwareAbstractTheLANchattoolisAnapplicationunderLinux.TheapplicationwrittenbyC+language.Thisprogramhasthefollowingfunctions:sendingbroadcastwhenloginandexit,sendingandreceivingmessagesbytheTCPcommunicationprotocol,usingMYsqldatabasetosavechatmessages.itismostoftenusedtochatinenterpriseandlaboratory,itisworkingwithoutdataexchangefromInternet,soitcantransmitdatahighspeedandsecurity.Thispaperfocusesonthefollowingcontents:theuseronlineandofflinemessagenotification,chatmessagesendandreceivedataanalysis;TCPnetworkprogramming,heretellsthemethodofusingTCPtocreateclientandServertosendandreceivedata;Finallyintroducethedesignmethodandimplementationprocessofmygraduationdesignandrunningtheapplication.Keywords:Linux;TCP/IP;Socket;Mysqldatabase;C+目录摘要.iAbstract.ii1绪论.11.1课题背景.11.2目的和意义.11.3研究现状.12系统分析.32.1系统理论基础.32.1.1C/S架构.32.1.2TCP.32.1.3Socket.42.1.4QT编程框架.62.2可行性研究.102.3需求分析.112.4系统运行环境.113系统设计.123.1系统结构设计.123.2客户端服务器功能设计.123.3客户端设计.133.4服务器端设计.143.5群聊和私聊模块的设计.164程序描述与详细描述.174.1服务器端验证客户端的登录信息.174.1.1功能及实现.174.1.2技术概要.184.2服务器端处理用户消息.204.2.1功能及实现.204.2.2技术概要.214.3客户端读取服务器发送的数据.234.3.1功能及实现.234.3.2技术概要.254.4客户端用户列表的更新.255系统实现.275.1登录模块设计.275.2注册模块设计.285.3群聊模块设计.295.4私聊模块设计.32结论.34参考文献.35致谢.3601绪论1.1课题背景随着信息化的广泛普及,网络这种新兴事物在今年来得到前所未有的普及和发展,基于网络的各种应用层出不穷,让各个年龄及阶层的用户体会到了不同的个性化服务,人们的生活方式已经与网络紧密的结合在一起。中小型企业的领导也认识到提高企业信息化的必要性,为了让企业在发展迅速的信息时代生存下去,增强企业的竞争力,就要求有一个良好的平台来让企业员工之间的交流和通信,特别是领导和员工之间的沟通与交流,因此即时聊天交流系统就应运而生。伴随着企业规模的不断扩大,企业的各种信息也越来越私密,企业只希望员工通过内部网络进行交流与沟通,最大限度避免机密信息通过Internet泄漏到外部。为了解决上述问题,从而提出了局域网聊天软件的构想,通过该软件,企业的员工可以随时进行消息传递,即提高了效率,又保护了信息的私密与安全性。软件开发是一个十分复杂的过程,这里对软件开发的基本过程和方法进行介绍,并列举相关的实例加以说明。1.2目的和意义本论文主要说明基于Linux平台的局域网聊天软件的设计与实现。详细阐述开发中所用到的相关技术,并具体分析各个模块的功能和实现方法。本软件能够满足小型企业或小型局域网内部即时通信的需要,提高工作效率。1.3研究现状1996年11月,出现了ICQ,于是第一款互联网IM(InstantMessenger,即时通讯)应运而生,随后短短数年里成为了一个巨大的IM产业。到现在,IM应用工具成为了最热门的网络应用之一。国内各种外聊天工具花样繁多。而作为全球第一款即时通讯工具的ICQ,经过不断的发展,如今在业内的地位已经无人能够撼动。ICQ名字是英文“Iseekyou”的缩写,即“我找你”。ICQ最初只有两个特性,一个是用户列表,另一个是即时聊天。但是一出世就收到网民的喜爱,半年里注册用户就达到了85万,1998年这个数字更是翻了14多倍,注册用户达到了1200多万人。ICQ的迅速发展也让在桌面软件领域独步天下的微软与互联网领头羊的Yahoo嗅到了商机,分别推出了MSN与YahooMessenger,形成了即时通讯市场的雏形。ICQ风行全球的时候,国内也推出了各种仿ICQ的中文IM工具,现在国内的市场主要有微软的MSN、腾讯的QQ、雅虎的雅虎通等等。腾讯的QQ占据国内市场的70%以上。随着IM应用的发展,其功能也不断的丰富,除了用户列表与即时聊天,表情图片也成为了它的一个重要特性,此外文件传输、视频聊天、游戏等功能也被集成到了IM应用中。如今,IM不是一个简单的聊天工具,而是一个集信息资讯、休闲娱乐、交流互动的平台,它上面的语音、音乐点播、视频、信息共享等新的应用层出不穷。随着IM应用的不断成熟,已经形成了IM产业链。IM应用也成为了现代人们与现代经济中不可缺少的一部分。1互联网技术的发展使信息在传递方面也有了崭新的一面。聊天软件成为了信息传递最重要的方式,它可以让人们随时随地进行信息交流,让人们更好的了解彼此。聊天软件人性化的设计可以让每个用户都能得心应手的使用,获得了更多人的青睐。Internet的出现让整个世界连通起来,而聊天软件的出现把每一位网上的用户联通起来。网络应用的不断发展,让聊天软件成为最热门的应用之一。经过进来的发展,聊天软件已不再是简单的通讯工具,而是成为集互动交流、休闲娱乐为一体的多元化的互联网应用平台,它的出现给人们彼此间的沟通带来了无比的方便,通过聊天软件人们可以建立深刻的友情,让聊天软件更加充满了活力与生机。22系统分析2.1系统理论基础2.1.1C/S架构C/S结构的基本原则是将计算机的应用任务分解成多个子任务,由多台计算机分工合作完成。Client端完成数据的处理,数据的表示及用户接口功能;Server端完成DBMS的核心功能。这种架构的优点是具有强大的事务处理与数据操作能力,开发的模型比较简单,易于人们接受和理解。系统的应用程序和服务器构建在不同的计算机上运行。在C/S架构中,各个构建能够充分隔离,应用程序的开发集中于数据的浏览与查询,数据库服务器开发集中于数据的管理功能,有利于系统的安全性。服务器与客户端直接相连,实时性良好。可以充分发挥客户端的处理能力,可以在客户端把一部分工作处理后在提交给服务器。客户端的响应速度快并且应用服务器运行数据的负荷也比较轻。缺点一是应用服务器的运行数据负荷较轻。最简单的C/S架构的数据应用有两个部分,即客户应用程序与数据库服务器程序,可以分别称作前台程序和后台程序。后台程序运行数据库服务器程序,服务器一旦启动,就随时等待响应前台程序发来的请求;前台程序运行在用户的电脑上,当前台程序要对数据库中的数据进行任何操作时,就自动寻找后台程序,发送请求,后台程序根据预定的规则做出应答。二是数据的存储管理功能比较透明,在数据库中,数据的存储管理,是由服务器与客户端分别进行的,客户端不能违反的规则是在服务器中体现的。对于客户端是透明的,客户端无法干涉背后的过程。在这种架构下,数据库不能成为真正公共的、专业化的仓库,要受到专门的管理。2.1.2TCPTCP协议即TCP传输控制协议,是一种面向连接的、可靠的传输层协议,是专门为广域网设计的。它的标准是在一系列称为RFC的文档中。TCP是面向连接的,所以通信双方在通信之前必须先建立TCP连接,通信结束之后必须断开TCP连接。TCP的可靠性通过下列方式来体现:(1)把应用数据分割成最适合TCP发送的数据块。保持应用程序产生的数据长度不变。报文段或段(segment)是由TCP传递给IP的信息单位。(2)TCP发出一个段后,都启动一个定时器,等待接受目的端确认收到这个段。如果不能及时收到目的端的确认,TCP将重发这个段。如果TCP收到发送端的数据,将发送一个确认。(3)TCP保持它首部和数据的检验和。它是一个端到端的检验和,是为了检测数据在传输过程中是否变化。如果接受到的段的检验和有差错,则TCP将丢弃这个报文段并不发送确认(希望发端超时并重发)。(4)TCP报文段是作为IP数据报来传输的,而IP数据报可能会失序,因此TCP报文段也可能会失序。所以,TCP将对收到的数据进行重新排序,然后将正确的顺序交3给应用层。(5)IP数据报会发生重复,所以必须丢弃TCP接收端重复的数据。(6)TCP提供流量控制功能。TCP连接的双方都有固定大小的缓冲空间。TCP接收端只允许TCP发送端发送TCP接收端缓冲区所能接纳的数据。TCP使用三次握手协议建立连接,下图就是三次握手建立连接的过程。图2-1TCP三次握手示意图首先客户端发送SYN(SEQ=x)报文给服务器端,并进入SYN_SEND状态。其次服务器端收到SYN报文后回应一个SYN(SEQ=y)ACK(ACK=x+1)的报文,并进入SYN_RECV状态。最后客户端收到服务器端的SYN报文并回应一个ACK(ACK=y+1)报文,然后进入Established状态。TCP经过四次握手终止连接,下图就是四次握手终止连接的过程:图2-2TCP链接释放示意图首先应用进程调用close函数,称该端执行“主动关闭”(activeclose)操作。于是该端的TCP发送一个FIN分节以表示数据发送完毕。接着接收到这个FIN的对端执行“被动关闭”(passiveclose)操作。一段时间后接收到这个文件结束符的应用进程将调用close函数关闭它的套接字,该段的TCP也发送一个FIN。最后接收这个最终FIN的原发送端TCP确认这个FIN。2.1.3SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程2,程序员4可以用它们来开发TCP/IP网络上的应用程序。要学的TCP/IP网络编程,必须理解Socket接口,Socket(套接字)是BSD提供的网络应用编程接口,现在它已经是网络编程中的标准。据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Linux系统中的网络编程通过Socket接口实现。Socket既是一种特殊的IO,它也是一种文件描述符。一个完整的Socket都有一个相关描述协议,本地地址,本地端口,远程地址,远程端口;每一个Socket有一个本地的唯一Socket号,由操作系统分配。为了建立Socket,程式能够调用Socket函数,该函数返回一个类似于文档描述符的句柄。socket函数原型为:intsocket(intfamily,inttype,intprotocol);#include参数说明:family:协议族AF_INET,AF_INET6,AF_LOCAL,AF_ROUTE,AF_KEYtype:套接字类型SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,SOCK_SEQPACKETprotocol:协议类别0,IPPROTO_TCP,IPPROTO_UDP,IPPROTO_SCTP返回值:套接字通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端连同面向连接socket的bind函数将一个地址绑定到套接字intbind(intsockfd,conststructsockaddr*myaddr,socklen_taddrlen);#includesockfd:socket套接字描述符myaddr:指向特定于协议的地址结构指针addrlen:该地址结构的长度返回值:0,成功;其他,失败structsockaddr结构类型是用来保存socket信息的:#includestructsockaddrunsignedshortsa_family;/*地址族,AF_xxx*/charsa_data14;/*14字节的协议地址*/;sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。structsockaddr_in/后面编程也会用到的结构体shortintsin_family;/*地址族*/unsignedshortintsin_port;/*端口号*/5structin_addrsin_addr;/*IP地址*/unsignedcharsin_zero8;/*填充0以保持和structsockaddr同样大小*/;使用一个确知的端口来接收客户端的连接。bind函数将一个地址绑定到套接字#includeintbind(intsockfd,conststructsockaddr*myaddr,socklen_taddrlen);sockfd:socket套接字描述符myaddr:指向特定于协议的地址结构指针addrlen:该地址结构的长度返回值:0,成功;其他,失败建立连接与收发数据。intlisten(intsockfd,intbacklog);listen函数可以将套接字由主动修改为被动,操作系统为该套接字设置一个连接队列,来记录所有连接到该套接字的连接。sockfd:socket监听套接字描述符backlog:连接队列的长度intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);accept函数从已连接队列中取出一个已经建立的连接intconnect(intsockfd,conststructsockaddr*addr,socklen_tlen);connect主动连接addr中的监听套接字。ssize_tsend(intsockfd,constvoid*buf,size_tnbytes,intflags);/发送数据ssize_trecv(intsockfd,void*buf,size_tnbytes,intflags);/接受数据以上是对socket编程的一些主要函数进行介绍,接下来的编程中就会用到这些函数。2.1.4QT编程框架QT是一个跨平台的C+GUI应用框架,它给应用程序开发者提供建立友好的图形用户界面所需要的所有功能。QT具有面向对象、真正的组件编程、易于扩展的特点。QT的核心机制是信号和槽。信号和槽是QT的一种高级接口,主要应用于对象之间的通信。它是QT自定义的一种通信机制,独立于标准的C/C+语言,使用QT的信号和槽,就必须借助一个QT的工具moc,moc是一个C+预处理器,为高层次的事件处理自动生成附加代码。信号是对象发射出来的,并且只有定义过该信号的类及其派生类才能发射出这个信号。当发射一个信号时,与信号相关联的槽函数将被立刻执行。信号和槽机制独立于任何GUI时间循环。只有所有的槽函数返回后发射函数才返回。如果多个槽函数与一个信号相关联,当该信号被发射时,槽函数会一个接一个的执行,但是它们的执行顺序是随机的。不能人为的指定哪个槽函数先执行,哪个槽函数后执行。信号是在头文件中声明的,QT用signals关键字来标识信号声明区。槽函数是普通的C+成员函数,唯一不同的就是它可以与很多信号相关联。当产生与其相关联的信号时,就会被调用该槽函数。通过调用QObject对象的connect()函数来将信号与槽函数相关联。这个函数的作用是将发射者对象中的信号与接受者的槽函数联系起来。用QT的宏SIGNAL()6来指定信号,用宏SLOT()来指定槽函数。信号和槽机制虽然比较灵活,但是也有一些局限性。为了避免在实际的使用过程中产生一些错误,做到有的放矢。应注意下面的一些注意事项:(1)和真正的回调函数比起来,信号和槽在效率上有所损失,但是这种损失相对来说是比较小的。它提供的灵活性、简洁性还是值得的。但如果要追求高效率的华,比如实时系统,就要尽可能少用这种机制。(2)信号和槽函数机制和普通的函数的调用一样,要是使用不当的话,在程序运行过程中可能发生死循环。所以,在使用槽函数是一定要注意,防止形成死循环,如在槽函数中发射所接收到的信号。(3)当一个信号与多个槽函数相联系时,当该信号发射后,相应的槽函数的执行顺序将是随机的。(4)在signal和slot函数的参数中不能使用宏定义。这是由于moc工具不扩展#define。(5)不能在signals或者slots区域内声明构造函数。(6)信号或槽函数的参数不能是函数指针。但是可以通过定义别名来绕过这个限制。(7)信号和槽函数不能有缺省参数。(8)信号和槽函数不能携带带模版类的参数,如果这样使用的话,即时moc工具不报告发生错误,也得不到想要的结果。但是,可以通过定义别名来绕过这个限制。(9)信号或槽函数区域内不能包含嵌套的类,嵌套的类中也不能有信号或者槽函数。(10)最后信号或槽函数区域内也不能声明友元。Qt提供了一组范围相当广泛的C+类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。QtDesigner:Qt设计器。用来可视化地设计应用程序界面。QtLinguist:Qt语言学家。用来翻译应用程序。以此提供对多种语言的支持。Qmake:使用此工具可以由简单的、与平台无关的工程文件来生成编译所需的Makefile。QtAssistant:关于Qt的帮助文件。类似于MSDN。可以快速地发现你所需要的帮助。moc:元对象编译器。uic:用户界面编译器。在程序编译时被自动调用,通过ui_*.h文件生成应用程序界面。qembed:转换数据,比如,将图片转换为C+代码。安装的过程对于不同的Qt平台是不同的。在Windows环境下安装Qt,需要先安装MinGW。MinGW,即MinimalistGNUForWindows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用GCC(GNUCompilerC)产生Windows32程序。在基本层,MinGW是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时间库(MSVCRT.DLL),该库在所有的NTOS上有效,在所有的Windows95发行版以上的WindowsOS有效,使用基本运行时间,你可以使用GCC写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的C运行时间扩展。该功能是Windows32API不具备的。下一个组成部分是7w32api包,它是一组可以使用Windows32API的包含文件和端口库。与基本运行时间相结合,就可以有充分的权利既使用CRT(CRuntime)又使用Windows32API功能。实际上MinGW并不是一个C/C+编译器,而是一套GNU工具集合。除开GCC(GNU编译器集合)以外,MinGW还包含有一些其他的GNU程序开发工具(比如gawkbison等等)。在安装MinGW之后,再安装Qt,然后更改一下Windows系统的环境变量,就可以在Windows环境下使用Qt了。如果想在VC环境下使用Qt,那么还需要进一步编译和设置,或者下载专门用于VC的QT版本。一个布局管理者就是一个根据窗口作用设置其大小和位置的对象。Qt有三个主要的布局管理类:QHBoxLayout:将窗口部件水平自左至右设置(有些情况下是自右向左)。QVBoxLayout:将窗口部件垂直自上向下设置。QGridLayout:以网格形式设置窗口部件。Qt构建用户界面的方法很容易理解,并且有很高的灵活性。Qt程序员最常用的设计模式是:说明所需要的窗口部件,然后设置这些部件必须的特性。程序员把窗口部件添加到布局管理器中,布局管理器就将自动地设置这些部件的大小和位置。而用户界面的行为是通过连接各个部件(运用信号/槽机制)来实现的。“信号和槽”机制用于Qt对象间的通讯。“信号/槽”机制是一种关于无缝对象通讯的机制,它是Qt的一个中心特征,也是Qt与其它工具包的最不相同的部分。在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。例如,如果我们正在解析一个XML文件,当我们遇到一个新的标签时,我们也许希望通知列表视图我们正在用来表达XML文件的结构。较老的工具包使用一种被称作回调(callback)的通讯方式来实现同一目的。回调是指一个函数的指针,如果你希望一个处理函数通知你一些事件,你可以把另一个函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调。回调有两个主要缺点:首先他们不是类型安全的。我们从来都不能确定处理函数使用了正确的参数来调用回调。其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。在Qt中我们有一种可以替代回调的技术。我们使用信号和槽。当一个特定事件发生的时候,一个信号被发射。Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。槽就是一个可以被调用处理特定信号的函数。Qt的窗口部件也有很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号。“信号和槽”的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名)。因为签名是一致的,编译器就可以帮助我们检测类型不匹配。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。Qt的“信号和槽”的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(coredump)。8从QObject类,或者它的一个子类(比如QWidget类)所继承出的所有类,都可以包含信号和槽。当对象改变它们的状态的时候,信号被发送,这就是所有的对象通讯时所做的一切。它不执导也不注意有没有对象接收它所发射的信号。槽用来接收信号,但它们同时也是对象中正常的成员函数。一个槽不知道它是否被任意信号连接。此外,对象并不知道关于这种通讯的机制。你可以把很多信号和你所希望的单一槽相连,并且一个信号也可以和你所期望的许多槽相连。把一个信号和另外一个信号直接相连也是可行的(这种情况下,只要第一个信号被发射,第二个信号就会被立即发射)。信号:当对象的内部状态发生改变,信号就被发射,只有定义了一个信号的类和它的子类才能发射这个信号。例如,一个列表框同时发射highlighted()和activated()这两个信号。绝大多数对象也许只对activated()这个信号感兴趣,但是有时我们也想知道列表框中的哪个条目在当前是高亮的。如果两个不同的类对同一个信号感兴趣,你可以把这个信号和这两个对象连接起来。当一个信号被发射,它所连接的槽会被立即执行,就像一个普通函数调用一样。信号/槽机制完全不依赖于任何一种图形用户界面的事件回路。当所有的槽都返回后emit也将返回。如果几个槽被连接到一个信号,当信号被发射时,这些槽就会被按任意顺序一个接一个地执行。信号会由moc自动生成并且一定不要在.cpp文件中实现。它们也不能有任何返回类型(比如使用void)。关于参数需要注意。我们的经验显示如果信号和槽不使用特殊的类型,它们都可以多次使用。如果QScrollBar:valueChanged()使用了一个特殊的类型,比如hypotheticalQRangeControl:Range,它就只能被连接到被设计成可以处理QRangeControl的槽。槽:当一个和槽连接的信号被发射的时候,这个操被调用。槽也是普通的C+函数并且可以像它们一样被调用;它们唯一的特点就是它们可以被信号连接。槽的参数不能含有默认值,并且和信号一样,为了槽的参数而使用自己特定的类型是很不明智的。因为槽就是普通成员函数,但却有一点非常有意思的东西,它们也和普通成员函数一样有访问权限。一个槽的访问权限决定了谁可以和它相连:一个publicslots:区包含了任何信号都可以相连的槽。这对于组件编程来说非常有用:你生成了许多对象,它们互相并不知道,把它们的信号和槽连接起来,这样信息就可以正确地传递,并且就像一个铁路模型,把它打开然后让它跑起来。一个protectedslots:区包含了之后这个类和它的子类的信号才能连接的槽。这就是说这些槽只是类的实现的一部分,而不是它和外界的接口。一个privateslots:区包含了之后这个类本身的信号可以连接的槽。这就是说它和这个类是非常紧密的,甚至它的子类都没有获得连接权利这样的信任。你也可以把槽定义为虚的,这在实践中被发现也是非常有用的。Qt的一个最主要的特点可能就是它扩展了C+的机制,可以创建独立的软件组件,这些组件可以被绑定在一起,而不需要互相的任何了解。9这个机制被成为元对象系统,它提供了两个关键服务:信号/槽、运行时的类型信息和动态属性系统(内省机制)。内省机制对于实现信号和槽是必须的,并且允许应用程序员在程序运行时获得“元信息”(包括被对象支持的信号和槽的列表,以及这些信号/槽所在的类的名称)。内省机制同时支持“道具”(对于QtDesigner)和文本翻译(国际化),它还是Qt应用程序脚本(QtScriptforApplication)的基础。标准的C+并不提供对于Qt的元对象系统所需要的动态元信息的支持。Qt提供了一个单独的工具:元对象编译器(moc)来解决这个问题。Moc用来解析Q_OBJECT类的定义,使这些信息在C+函数中可用。由于moc使用纯粹的C+函数来实现,所以Qt的元对象系统在任何C+编译器下都可以工作。元对象系统这样工作:Q_OBJECT宏声明一些内省函数(metaObject(),TR(),qt_matacall()和少量其他的函数)。这些函数必须在所有的QObject的子类中被实现。Qt的moc工具负责执行被Q_OBJECT宏声明的函数,同时负责执行所有的信号函数。QObject的成员函数,例如connect()和disconnect(),使用内省函数来工作。元对象系统基于以下三类:1)、QOBJECT类;2)、类声明中的私有段的Q_OBJECT宏;3)、元对象编译器。Moc读取C+源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C+源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。除了提供对象间通讯的信号和槽机制之外(这也是介绍这个系统的主要原因),QObject中的元对象代码也实现其它特征:1)、className()函数在运行的时候以字符串返回类的名称,不需要C+编译器中的运行时刻类型识别(RTTI)的支持。2)、inherits()函数返回这个对象是否是一个继承于QObject继承树中一个特定类的类的实例。3)、tr()和trUtf8()两个函数是用于国际化的字符串翻译。4)、setPorperty()和property()两个函数是用来通过名称动态设置和获得对象属性的。5)、metaObject()函数返回这个类所关联的元对象。虽然使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果Q_OBJECT宏没有被使用,那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,一个没有元代码的QObject的子类和它含有元对象代码的最近的祖先相同。举例来说就是,className()将不会返回你的类的实际名称,返回的是它的这个祖先的名称。我们强烈建议QObject的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性。102.2可行性研究设计局域网聊天软件需要基于具有TCP/IP协议栈的Linux操作系统。软件采用TCP协议作为基本通信协议,并自己构造应用层数据结构。软件通过Socket套接字实现客户端与服务器之间连接的建立。在Linux系统中Socket套接字可以用文件的形式进行操作,所以,客户端与服务器之间数据的读写完全可以通过Linux系统文件的读写操作来实现,软件采用QT编程框架,提供了图形用户界面应用程序的开发框架,所以经分析该软件设计基本可行。2.3需求分析本项目基于Linux系统实现在局域网内的聊天软件,软件分为服务端和客户端,要实现的功能如下。服务器端:(1)能够正确的启动服务器。(2)能够监听指定的端口,来等待用户的连接。(3)客户端注册时能通过数据库验证用户的注册信息,并把注册结果返回给客户端。(4)客户端登陆时能通过数据库验证用户的登陆信息,登陆成功后,把此用户的登录消息通知其他好友。(5)登陆成功时,能够向新连接的用户发送已上线的用户名单。(6)能够接收客户端的群聊消息请求,并能正确无误地处理请求,并把消息发送到所有已登录的客户端。(7)能够接受客户端的私聊消息请求,并能正确无误地处理请求,并把消息发送到特定的客户端。(8)当用户断开与服务器端地连接时,服务器能够把连接正确的断开,并把该用户退出的消息通知其他用户。(9)能够正确的关闭服务器。客户端:(1)能够启动应用程序,并与服务器建立连接。(2)登陆界面,能够把登录信息正确的发送到服务器。(3)能够正确的处理服务器反馈的登结果信息。(4)注册界面,能够把注册信息正确的发送到服务器。(5)能够正确的处理服务器反馈的注册结果信息。(6)登录以后,能够自动的更新用户列表。(7)能够把群聊消息正确的发送到服务器。(8)能够正确的把群聊消息显示到群聊界面。(9)能够把私聊消息正确的发送到服务器。(10)能够正确的把私聊消息显示到特定的聊天窗口。(11)客户端退出时,能够把该用户的退出消息发送到服务器,并关闭所有聊天窗口。112.4系统运行环境硬件环境:CPU:Inter(R)Core(TM)i52.67GHz内存:2.00GB硬盘:500G软件环境:操作系统:Ubuntu12.0.4应用软件:QT5.0.2123系统设计3.1系统结构设计本系统采用C/S结构,最重要的特点是非对相互作用,即客户与服务器处于不平等的地位,服务器拥有客户所不具备的软硬件资源,客户与服务器分别是服务的请求者和提供者。网络中各个及其的资源是不平等的,网络的真正目的就是共享这些不均等资源,非对等相互作用特点也正好体现和适应了客观现实中资源不均等现象。局域网上不同主机进程间通信完全是异步的,通信时机具有随机性,所以必须用这种为通信双方的数据交换提供同步的机制。3.2客户端服务器功能设计客户端主要功能有用户注册、用户登录、更新在线用户列表,消息收发模块。消息收发模块又分为群聊和私聊两种。客户端的功能模块如下图所示:图3-1客户端功能模块图服务器的主要功能有处理注册消息、处理登陆消息、转发聊天消息、处理退出消息如下图所示:13图3-2服务器功能模块图3.3客户端设计客户端设计以用户使用为出发点,功能分登录、注册、聊天、退出。首先设计一个连接模块,即运行客户端后,连接线程看能否连接到服务器,要能先连接到服务器才能在进行登陆注册等操作,这样做可以让用户知道服务器是否运行。连接到服务器后,进行注册,登陆时系统要能根据用户输入的用户名和密码判断该用户是否为合法用户;如果用户输入的用户名或密码错误,系统将给出相应的提示,并要求用户进行重新登录;如果用户输入的用户名和密码正确,可进行聊天操作。需要说明的是,在连接到服务器、登录、注册等过程没

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论