还剩41页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
本科毕业设计(论文)即时通信软件的开发与设计摘要随着计算机互联网技术的不断发展,国家对互联网的不断重视,各种各样的社交软件层出不穷,使用通信软件交流成为了人们生活中必不可少的一部分即时通讯工具作为未来跨越互联网与移动互联网的业务,其发展的潜力是十分巨大的,同时,其商业模式的发展将是未来要关注的焦点免费与收费相结合的发展策略将是IM的主要发展模式本论文实现一个运行于windows平台的基于局域网的即时聊天系统该聊天软件包括服务器端和客户端两个模块,客户端向服务器端发送服务请求服务器端向客户端提供相应的服务客户端主要实现用户登录、注册、聊天等功能该软件采用多线程技术、tcp通信技术、udp通信技术,并在传输数据时对消息实现序列化和数据的还原该软件能实现企业员工内部聊天交流,避免企业内部员工使用类似QQ等软件泄露内部信息,但是该软件只实现了登录、注册、聊天等基本功能,还有很多不足之处需要改进关键字客户端服务器c/s即时通信套接字.ABSTRACTWiththecontinuousdevelopmentofcomputertechnologytheInternetthestatecontinuestopayattentiontotheInternetavarietyofsocialsoftwareafteranotherusingcommunicationsoftwareexchangehasbecomeanindispensablepartofpeopleslives.InstantmessagingasthefutureacrosstheInternetandmobileInternetbusinessitsdevelopmentpotentialisenormouswhilethedevelopmentofitsbusinessmodelwillbethefocusofthefuturetopayattention.FreeandfeedevelopmentstrategywillbeacombinationofIMsmaindevelopmentmodel.InthispapertherealizationofarunonLAN-basedinstantmessagingsystemwindowsplatform.Thechatsoftwareincludesserverandclientoftwomodulestheclientsendsaservicerequesttotheservertotheclienttoprovideappropriateservicestotheserver.Clientmainimplementuserloginregistrationchatandotherfunctions.Thesoftwareusesmulti-threadingtechnologytcpcommunicationtechnologyudpcommunicationstechnologyandinthetransmissionofdatatoachievereductionmessageserializationanddata.ThesoftwareenablesemployeeschatinternalcommunicationandtoavoidinternalstaffusesimilarsoftwareQQleakedinsideinformationbutthesoftwareonlytorealizetheloginregistrationchatandotherbasicfunctionstherearemanydeficienciesneedtobeimproved.Keywordsclientserverc/sinstantmessagingsockets目录TOC\o1-3\h\u摘要IABSTRACTII1前言
11.1课题背景及意义
11.2国内现状及发展趋势
11.3现行系统的不足
21.4解决方案22系统开发关键技术及开发环境
42.1qt及qtcreator开发环境
42.
1.1qt简介
42.
1.2QtCreator简介
52.2mysql数据库介绍
52.3socket套接字介绍
62.4IP
62.5TCP
72.5udp协议简介
72.6c/s模式介绍
82.7多线程技术介绍
93.系统设计
113.1系统分析
113.
1.1功能需求分析
113.
1.2性能需求分析
123.
1.3数据需求分析
133.2系统设计
143.
2.1工作流程
143.
2.2服务器设计
143.
2.3客户端设计154系统关键技术实现
164.1服务器实现
164.2客户端实现195系统测试
335.1测试的意义及目的
335.2软件测试的方法
335.3测试用例
335.4测试结论34总结36参考文献38致谢391前言
1.1课题背景及意义即时通信(instantmessaging)是指网络上用来进行实时通讯的系统服务,人们可以使用即时通信软件以文字、图片、文档、语音、视频的形式通过网络进行异地实时信息交流随着互联网的不断普及,使用通信软件交流成为了人们生活中必不可少的一部分,而且人们对通信软件的功能需求的不断增大,即时通信软件的功能也日趋完善,除了最基本的通讯功能外,逐渐集成了电子邮件、博客、微博、音乐、电视、游戏、电子支付和搜索等多种功能,而这些功能的集成也使得即时通信软件已经不再是一个单纯的通信工具,它已经成为了集信息交流、娱乐、电子商务、商务办公、客户服务于一身的综合化信息平台即时通信将世界构建成了一个整体,实现了信息交流的无国界;无论你身在美国、还是遥远的非洲、亦或是我们身处的中国,通过MSN或qq聊天就可以知道你现在正在干什么,将要干什么;即时通信应用在企业办公上,企业工作效率得到了很大的提升,群组聊天让员工之间的技术探讨畅通无阻;视频会议技术让你不再为繁琐的会议东奔西走;这极大方便了我们的生活,提高了我们的生活品质因此,即时通信软件的设计与开发具有重要意义
1.2国内现状及发展趋势国内外即时通信系统发展迅速,特别是近年来即时通信软件层出不穷,目前人们熟知的有腾讯QQ、MSN、UC、skype等即时通信软件;还有最近几年新起的微信、易信、米聊等移动端即时通信软件据一项数据调查显示2014年二季度末,QQ月活跃账户数达到
8.29亿,微信和WeChat(微信海外版)合并月活跃账户数达
4.38亿在微信月活账户持续增长的同时,QQ智能终端月活跃账户突破了
5.21亿,同比增长45%,相比上季度也有6%的增幅据相关统计,目前中国智能手机用户在5亿左右,这意味着,智能手机用户几乎都活跃在手机QQ上这些数据表明移动端的即时通信软件现今有很大的市场,逐渐的由互联网络跨入移动互联网,发展潜力十分巨大而今,随着人们对生活娱乐的需求不断增加,即时通信软件不单单只有信息交流这一简单的功能,它还集成了与人生活紧密相关的一些功能;比如腾讯手机qq上的滴滴打车、qq电影票、腾讯新闻、qq钱包等这些功能让你体会到生活的便捷与快乐;让你足不出户就可以实现电影票的购买,而且还能帮你理财即时通讯工具作为未来跨越互联网与移动互联网的业务,其发展的潜力是十分巨大的,同时,其商业模式的发展将是未来要关注的焦点免费与收费相结合的发展策略将是IM的主要发展模式集成多种与人们生活息息相关的服务功能是IM的主要发展趋势
1.3现行系统的不足随着电子商务的发展,支付工具遍地开花,即时通讯的经济价值将进一步增强,也不可避免地遭遇更大的安全性问题用户信息泄露,盗号木马、网络诈骗钓鱼等安全性问题屡见不鲜只要连接到Internet互联网,用户账号和密码被盗对黑客来说是件很容易的事即时通信软件一般要输入个人账号和密码,验证成功后方可为其提供服务而目前的即时通信厂商很少考虑它的认证机制这给黑客可乘之机,攻击者通过暴力破解、木马欺骗等破解方法窃取密码后冒充该用户来查看聊天记录并与其他用户进行通信,以此来窃取重要的信息目前,大多数即时通信软件在通讯时传递的信息或文件仅仅采用了弱加密甚至不加密的方式,黑客能很容易的利用此缺陷来监听、篡改、窃取用户的重要数据,这种泄密可能给用户造成不可估量的损失;尤其是对一些商业机构和金融机构,一旦泄密,将会构成巨大的商业安全威胁
1.4解决方案为了解决以上所提到的问题,本软件使用基于C/S模式的架构模型,采用基于Socket的局域网通信工具的设计与实现方法并且还采用tcp与udp通信协议来实现通信;基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点而tcp协议是一种可靠的面向连接的传输协议,通过序列确认和包重复机制提供可靠的数据流发送和应用程序的虚拟连接服务经过3次握手建立连接发送数据但tcp不是及时的传输协议而udp协议的传输效率高,在企业局域网稳定安全的环境下实现用户聊天时用udp协议就可以很好的弥补tcp协议的不足而在数据方面,服务器将用户个人信息、用户好友列表信息、客户端连接信息存放于数据库中整个软件有客户端和服务器端组成,将所有功能封装于各式类文件中,后期维护简单2系统开发关键技术及开发环境
2.1qt及qtcreator开发环境
2.
1.1qt简介Qt是一个跨平台应用程序和UI开发框架使用qt只需一次性开发应用程序,无需重新编写源代码,便可跨不同的桌面和嵌入式操作系统部署这些应用程序QtSoftware的前生为创始于1994年的Trolltech(奇趣科技)Trolltech于2008年6月被Nokia收购,加速了其跨平台的开发战略总的来说,相对于老旧的MFC和目前编程行业通行的VC++工具,Qt以其入门简单,跨平台以及嵌入式等方面有着无可代替的优越性,当然MFC的完整性以及内容的丰富性是Qt不及的但是由于Qt为开源框架,得到了众多开发者的支持,因此qt的普及也在近千万开发人员的基础上,再次的得到发展自从诺基亚宣布停止开发其和英特尔公司共同推出的Meego系统并大幅度裁员以来,Qt用以移动开发人员集聚减少,从而使得曾经火热的Qt减缓了在移动设备上的发展的步伐,但是正因为如此,Qt就更加专注于跨平台信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言当一个特定事件发生的时候,一个信号被发射Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号槽就是一个可以被调用处理特定信号的函数Qt的窗口部件又很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号信号和槽的机制是类型安全的一个信号的签名必须与它的接收槽的签名相匹配(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名)因为签名是一致的,编译器就可以帮助我们检测类型不匹配信号和槽是宽松地联系在一起的一个发射信号的类不用知道也不用注意哪个槽要接收这个信号Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用信号和槽可以使用任何数量、任何类型的参数它们是完全类型安全的,不会再有回调核心转储coredump
2.
1.2QtCreator简介QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE),能够跨平台运行,支持的系统包括Linux,MacOSX以及Windows.允许开发者为多桌面环境及移动设备平台创建应用程序它包括一个可视化调试工具和集成的GUI版面和外形设计师根据官方描述,QtCreator的设计目标是使开发人员能够利用qt这个应用程序框架更加快速及轻易的完成开发任务在功能方面,QtCreator包括项目生成向导、高级的C++代码编辑器、浏览文件及类的工具、集成了QtDesigner、QtAssitant、QtLinguist、图形化的GDB调试前端,集成qmake构建工具等
2.2mysql数据库介绍MySQL的概述MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司在2008年1月16号被Sun公司收购目前MySQL被广泛地应用在Internet上的中小型网站中由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库MySQL是使用使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性特点;它还支持AIX、FreeBSD、HP-UX、Linux、MacOS、NovellNetware、OpenBSD、OS/2Wrap、Solaris、Windows等多种操作系统;它为多种编程语言提供了API这些编程语言包括C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等;MySQL还支持多线程,充分利用CPU资源并且优化了SQL查询算法,有效地提高查询速度它既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB
2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名提供TCP/IP、ODBC和JDBC等多种数据库连接途径,提供用于管理、检查、优化数据库操作的管理工具,可以处理拥有上千万条记录的大型数据库与其他的大型数据库例如Oracle、DB
2、SQLServer等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQLCluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器由于这四个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统
2.3socket套接字介绍socket套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程Socket套接字包括流套接字(SOCK_STREAM)流套接字用于提供面向连接、可靠的数据传输服务该服务将保证数据能够实现无差错、无重复发送,并按顺序接收流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(TheTransmissionControlProtocol)协议数据报套接字(SOCK_DGRAM)数据报套接字提供了一种无连接的服务该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据数据报套接字使用UDP(UserDatagramProtocol)协议进行数据的传输由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理原始套接字(SOCK_RAW)原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据因此,如果要访问其他协议发送数据必须使用原始套接字
2.4IP网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的IP确认包含一个选项,叫作IPsourcerouting,可以用来指定一条源地址和目的地址之间的直接路径对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵
2.5TCP如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层TCP将包排序并进行错误检查,同时实现虚电路间的连接TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方面向连接的服务(例如Telnet、FTP、rlogin、XWindows和SMTP)需要高度的可靠性,所以它们使用了TCPDNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息
2.5udp协议简介UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务UDP协议基本上是IP协议与上层协议的接口UDP协议适用端口分别运行在同一台设备上的多个应用程序UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等
2.6c/s模式介绍C/S结构,即大家熟知的客户机和服务器结构它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Whttp://baike.baidu.com/view/
3912.htm\thttp://baike.baidu.com/view/_blankeb和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统这也就是目前应用系统的发展方向C/S结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则客户端完成数据处理,数据表示以及用户接口功能;服务器端完成DBMS(数据库管理系统)的核心功能这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式http://baike.baidu.com/picture/268856/268856/0/5366d0160924ab185748c82136fae6cd7b890b4d.htmlfr=lemmact=single\o\thttp://baike.baidu.com/view/_blankClient和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器对应的优点就是客户端响应速度快具体表现在以下两点
(1)应用服务器运行数据负荷较轻最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序二者可分别称为前台程序与后台程序运行数据库服务器程序的机器,也称为应用服务器一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻
(2)数据的储存管理功能较为透明在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,并且通常把那些不同的(不管是已知还是未知的)前台应用所不能违反的规则,在服务器程序中集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络在C/S体系下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据客户端需要安装专用的客户端软件首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高对客户端的操作系统一般也会有限制可能适应于Win98但不能用于win2000或WindowsXP或者不适用于微软新的操作系统等等,更不用说Linux、Unix等传统的c/s体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用而且代价高,效率低C/S架构的劣势还有高昂的维护成本且投资大首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战
2.7多线程技术介绍多线程是指从软件或者硬件上实现多个线程并发执行的技术具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个执行绪,进而提升整体处理性能具有这种能力的系统包括对称多处理器、多核心处理器以及芯片级多处理器(Chip-levelmultithreading)或同时多线程(Simultaneousmultithreading)处理器软件多线程即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象这样的程序运行机制被称为软件多线程如微软的Windows作业系统和Linux就是在各个不同的执行绪间来回切换,被称为单人多任务作业系统而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单工作业系统除此之外,许多系统及处理器也支持硬件多线程技术对称多处理机(SMP)系统具有多个处理器,所以具有真正的同时执行多个线程的能力;CMP技术通过在一块芯片上集成多个核心也具有真正的多线程能力;CMT技术则稍有不同,有的是依靠硬件执行线程切换来获得多线程能力,操作系统不再负责线程切换,因而这部分开销可以减少甚至消除,这方面典型的例子是Sun的UltraSPARCT1,它同时综合了CMP和CMT微软的Windows2000以后的操作系统皆支持多线程与超线程技术
3.系统设计
3.1系统分析
3.
1.1功能需求分析即时通信系统是基于c/s模型的网络通信软件,分为客户端和服务器端两个部分客户端依靠服务器获取所需的网络资源,服务器为客户端提供必需的网络资源服务器端包含数据库模块和消息处理两个模块;数据库模块用于存储用户个人信息、用户好友列表、和用户连接信息;消息处理模块包含查看好友资料、注册处理、登录处理、聊天处理、修改个人信息、添加好友、删除好友具体功能结构图如图
3.1图
3.1服务器功能模块图客户端包含登录和注册两个部分;登录模块包括用户信息修改、好友管理、消息功能三个模块用户信息修改模块实现修改个人信息好友管理模块实现好友的分组显示、添加好友、删除好友、查看好友资料消息功能模块实现发送消息、接收消息、聊天记录客户端功能模块结构如图
3.2图
3.2客户端功能模块图
3.
1.2性能需求分析即时性用户之间通信时彼此的聊天信息能即时的传送给对方服务器的消息记录能即时的更新系统友好性登录界面、聊天窗口、好友信息资料界面、好友在线状态界面要美观简洁,友好大方,操作简单合理恰当安全性用户需要服务器提供相关服务时需通过服务器的身份验证来获取相关服务以此来提高系统的安全性可扩展性可以很容易扩展系统功能和系统功能的更新
3.
1.3数据需求分析本系统服务器端需要用到MySQL数据库;以此来存放用户的个人信息、用户好友列表、客户端与服务器通信的登录信息及网络连接信息相关数据库表如下用户信息表userinfo:名称字段类型长度说明账户useridvarchar24Primarykeynotnull密码UserpwdVarchar24Notnull昵称userNickvarchar24Notnull姓名userNamevarchar24Notnull性别userSexvarchar24Notnull年龄userAgeint12Notnull个人签名iDiographvarchar48所在地cityvarchar24联系方式phonenumbervarchar24在线状态statusint12Other1Other2Other3网络连接表connectinfo:名称字段类型长度说明账户(id)userIdvarchar24PrimarykeynotnullIp地址ipAddressvarchar24Notnull端口Portint12Notnull用户登录表friendtable:名称字段类型长度说明当前账户userIdvarchar24PrimarykeyNotnull账号friendidvarchar24notnull备注remarkvarchar24好友类型friendkindint12好友总数friendtotalint12昵称nicknamevarchar24好友状态statusint
123.2系统设计
3.
2.1工作流程本系统由服务器先启动然后客户端通过已经注册的账号和密码来登录服务器,登录成功后客户端从服务器获取用户信息和好友列表,客户端向服务器发送相应的请求可以实现对用户的信息修改、好友的添加、删除、查看好友的资料、聊天等一系列操作聊天时客户端向服务器请求好友的连接信息,客户端得到好友的连接信息后再利用此链接信息将聊天信息发送给好友.
3.
2.2服务器设计登录验证服务器接收客户端发来的账户和密码,创建一个通信线程来接收客户端的请求在线程中实行数据库中的用户信息账户和密码的比对,判断登录认证通过与否及用户是否在线;认证通过后将用户的好友列表及用户的个人信息返回给客户端之后才能实现正常在线、好友聊天、添加好友、删除好友、修改个人信息等操作客户端连接信息存储客户端登陆成功后将客户端的账号、ip地址以及端口号存入数据库中的客户端的连接信息表中,并将数据库用户信息表的中的用户状态置为1;当客户端退出登录时将客户端的账号、ip地址及端口号从数据库中的连接信息表中删除,并将数据库中用户信息表中的用户状态置为0用户注册客户端发来注册请求时,服务器将用户的注册信息存入数据库的用户信息表中,并通知用户注册成功与否添加好友服务器收到添加好友请求后将好友存入数据库中的好友列表删除好友服务器收到删除好友请求后将好友从数据库中的好友列表删除查看好友信息服务器收到查看好友信息请求时,从数据库中的用户信息表中查询好友信息,再将查询的信息发送到对应的用户修改用户信息服务器收到用户信息修改请求时将相应的数据库中的用户信息表更新好友聊天服务器收到聊天请求时在数据中查询好友的连接信息并将好友的ip地址及端口号返回给用户
3.
2.3客户端设计用户登录从客户端输入登录信息判断账号密码不为空时才向服务器发送登录请求用户注册客户端在注册界面填写用户注册信息后在把填写的信息发送给服务器注册成功后在登录界面输入账号和密码就可以登录用户信息修改客户端点击修改个人信息按钮,出现填写个人信息资料的窗体,将要修改的个人信息填写到窗体的列表中,再将修改的个人信息发送到数据库中好友分组客户端登录服务器验证通过后,客户端收到来自服务器的好友列表信息,客户端对好友进行分组显示及好友状态显示双击分组可以展开或收拢分组添加好友用户在主界面点击添加好友按钮出现添加好友的界面在该界面中填写好友的账号即可实现好友的添加删除好友用户在好友列表的好友信息一栏上点击右键即可实现好友的的删除查看好友资料用户在好友列表的好友信息一栏上点击右键,选择查看资料就可以发送查看好友资料的请求并将服务器发来的好友资料信息以列表的形式加入窗体显示聊天用户在好友列表的好友信息一栏上点击右键,如果好友在线选择聊天客户端就会发送请求获取好友的ip地址和端口号服务器收到请求后就发送连接信息给相应的客户端,客户端利用此连接信息与好友实现通信聊天聊天时有聊天窗体,聊天窗体包括与好友聊天的聊天记录显示,用户发送聊天信息的发送编辑区域及与哪个好友聊天的标题4系统关键技术实现
4.1服务器实现服务器主要有myServer类、myThread类和MainWindow类;其中MainWindow类主要实现服务器窗口显示、开启、关闭myServer类主要实现通信线程的创建、删除myThread类主要实现通信的处理,即从客户端接收请求消息、数据库处理、向客户端发送消息服务器连接数据库关键代码intmainintargcchar*argv[]{QApplicationaargcargv;db=QSqlDatabase::addDatabaseQMYSQL;db.setHostNamelocalhost;db.setUserNameroot;db.setPasswordroot;db.setDatabaseNamedb_user;boolok=db.open;qDebugdb.driver;qDebugdb.userName;ifok{qDebugopendatabasesuccess;}else{qDebugerroropendatabasebecausedb.lastError.text;}MainWindoww;w.show;returna.exec;}当服务器启动时创建服务器启动界面,点击启动服务器进入监听状态,界面显示服务器的ip地址和端口号其关键代码如下voidMainWindow::openServer{if!server-listenQHostAddress::LocalHost9901{QMessageBox::criticalthistr多线程服务器tr无法启动%
1..argserver-errorString;close;return;}else{ui-serverStatuslabel-setTexttr服务器运行在端口%
1.\n.argserver-serverPort;ui-displayEdit-setTextserver-serverAddress.toString;}}如图
4.1所示图
4.1服务器端当服务器接收连接请求时通过套接字描述符创建一个单独的通信线程,当客户端失去连接时删除该通信线程其关键代码如下voidmyServer::incomingConnectionintsocketDescriptor{mythread=newmyThreadsocketDescriptor0;connectmythreadSIGNALclientDisconnectSignalQStringmythreadSLOTdeleteLater;connectmythreadSIGNALsendchatFinishSignalthisSLOTupdateChatMsgSlot;connectmythreadSIGNALreceiveChatMessagethisSLOTgetMsgFromListMessage;connectthis-mythread-tcpsocketSIGNALdisconnectedthis-mythreadSLOTdisconnectProcees;mythread-start;}myThread类的主要槽及信号槽槽及成员函数返回值功能disconnectProceesvoid客户端失去连接时进行相应的数据库处理receiveDatavoid接收客户端的请求sendDataMessagemsgvoid响应客户端的请求,将反馈的信息发送给客户端sqlProcessMessagemsgvoid数据库处理信号信号返回值功能loginSuccessSignalMessagevoid登录成功信号getFriendTableMessagevoid获取好友列表信号registerSuccessSignalMessagevoid注册成功的信号getinfoFinishSignalMessagevoid获取用户成功信号clientDisconnectSignalQStringvoid客户端失去连接信号客户端在失去连接时调用disconnectProcees槽函数更新数据库信息关键代码QSqlQueryquerydb;query.prepareUPDATEuserinfoSETstatus=0WHEREuserid=:userid;query.bindValue:useridsourceid;query.exec;qDebugquery.size;qDebugclientidsourceidhasdisconnect;query.preparedeletefromconnectinfowhereuserid=:userid;query.bindValue:useridsourceid;query.exec;qDebugdeleteconnectinfotablesuccess;emitclientDisconnectSignalsourceid;
4.2客户端实现客户端主要有addfriendForm类、chatForm类、friendInfoForm类、ListWidget类、Form类、registerForm类和Widget类Widget类实现用户登录界面,与服务器建立连接,向服务器发送请求消息以及接收服务器反馈的消息,通过信号与槽关联其他类的槽函数和信号ListWidget类实现创建好友列表及好友中右键菜单栏显示及相应功能的部分实现addfriendForm类实现创建好友添加界面chatForm类实现聊天界面的创建registerForm类实现用户注册界面的创建friendInfoForm类实现好友信息显示界面的创建Form类实现客户端主界面的创建Widget类主要的槽及信号槽及主要成员函数返回值功能loginrequestvoid登录请求receiveDatavoid接收消息on_registerButton_clickedvoid注册账号sendDataMessageDatavoid向服务器发送消息addFriendslotvoid创建添加好友界面friendInforFormvoid创建好友信息界面信号返回值功能createFriendChatchatwithFriendvoid创建聊天界面信号Form类主要槽及信号槽及主要成员函数返回值功能createFriendchatSlotchatwithFriendpivoid创建好友聊天界面recUdpMessagevoid接收聊天消息ListWidget类主要的槽及信号槽及主要成员函数返回值功能scan_friendSlotvoid获取好友id,改变消息类型deleteactionSlotvoid获取好友id,改变消息类型startChatSlotvoid获取好友id,改变消息类型,触发startChatSignalMessage信号getfriendidQStringclvoid处理获取的字符串得到好友id信号返回值功能getfriendinfoSignalMessagemsgvoid获得好友信息的信号deletefriendSignalMessagemsgvoid删除好友信息的信号startChatSignalMessagemsgvoid开始聊天信号chatForm类主要信号和槽槽及主要函数返回值功能PUSH_SEND_BUTTONvoid发送聊天消息主要功能截图及关键代码客户端登录界面关键代码voidWidget::loginrequest{if!tcpsocket-UnconnectedState{//tcpsocket-abort;//取消所有连接tcpsocket-connectToHost
127.
0.
0.19901;msg.msgKind=LOGIN;msg.sender=ui-userlineEdit-text;msg.text=ui-pwdlineEdit-text;msg.receiver=server;sendDatamsg;}else{QMessageBox::aboutthis用户登录状态用户正在登录中...;}}如图
4.2所示图
4.2客户端登录界面注册界面关键代码voidregisterForm::submitslot{ifui-useridEdit-text.isEmptyui-pwdlineEdit-text.isEmpty{qDebuguseridorpwdcantbeempty;QMessageBox::aboutthis错误账号和密码不能为空;}else{msg.msgKind=REGISTER;msg.nickName=ui-nickNamelineEdit-text;msg.userAge=ui-agelineEdit-text.toInt;msg.city=ui-citylineEdit-text;msg.idiograph=ui-idiographTextEdit-toPlainText;msg.userPwd=ui-pwdlineEdit-text;msg.phoneNumber=ui-phonelineEdit-text;msg.sender=ui-useridEdit-text;msg.userName=ui-usernamelineEdit-text;msg.userSex=ui-sexlineEdit-text;qDebugmsg.msgKindmsg.sendermsg.userPwdmsg.userNamemsg.nickNamemsg.userAgemsg.citymsg.phoneNumbermsg.userSexmsg.idiograph;emitregisterSignalsmsg;}}如图
4.3所示图
4.3客户端注册界面主界面实现主界面窗体的创建绑定udp套接字,接收udp数据报文关键代码Form::FormQWidget*parentpersonInfomsg:QWidgetparentuinewUi::Form{ui-setupUithis;QImageimage:/new/prefix1/image/
42.png;//三个好友列表friendlist1=newListWidget;friendlist2=newListWidget;friendlist3=newListWidget;//用户信息栏groupbox1=newQGroupBox;imagelabel=newQLabel;useridlabel=newQLabel;useridlabel-setText账号;nicklabel=newQLabel;nicklabel-setText昵称;imagelabel-setPixmapQPixmap::fromImageimage;imagelabel-resizeQSize55;vlayout1=newQVBoxLayout;vlayout1-addWidgetuseridlabel;vlayout1-addWidgetnicklabel;hlayout1=newQHBoxLayout;hlayout1-addWidgetimagelabel;hlayout1-addLayoutvlayout1;groupbox1-setLayouthlayout1;groupbox1-setStyleSheetborder:none;//去除边框//好友列表栏toolbox=newQToolBox;groupbox2=newQGroupBox;hlayout2=newQHBoxLayout;hlayout2-addWidgettoolbox;groupbox2-setLayouthlayout2;groupbox2-setStyleSheetborder:none;//工具表栏addfriendButton=newQToolButton;defaultButton=newQToolButton;hlayout3=newQHBoxLayout;hlayout3-addWidgetaddfriendButton;addfriendButton-setText添加好友;hlayout3-addWidgetdefaultButton;defaultButton-setText修改个人资料;groupbox3=newQGroupBox;groupbox3-setLayouthlayout3;groupbox3-setStyleSheetborder:none;//整体布局vlayout2=newQVBoxLayout;vlayout2-addWidgetgroupbox1;vlayout2-addWidgetgroupbox2;vlayout2-addWidgetgroupbox3;setLayoutvlayout2;//好友分类列表toolbox-addItemfriendlist1我的好友;toolbox-addItemfriendlist2室友;toolbox-addItemfriendlist3网友;friendlist1-fri.friendKind=MYFRIENT;//我的好友friendlist2-fri.friendKind=BESTFRIENT;//室友friendlist3-fri.friendKind=NETFRIENT;//网友//窗体基本属性设置this-setWindowTitle主界面;this-setMaximumSize300650;this-setMinimumSize300650;groundimag.load:/new/prefix1/background/e25fc3e464caad511dcb52cf0b0466ed.jpg;this-setStyleSheetborder:none;this-setBackgroundImagegroundimag;//this-setWindowFlagsQt::FramelessWindowHint;//无边框//this-setAttributeQt::WA_TranslucentBackgroundtrue;//窗体透明设置//创建udpsocket套接字绑定到本地端口;和ip地址recUdpSocket=newQUdpSocketthis;//绑定当前用户的ip地址和端口号this-userid=msg.userid;qDebug**********************************;qDebugmainformhasstart.....readygetlocaluseridipport;qDebuguseridisuserid;this-ip=msg.ip;this-port=msg.port;qDebugportisport;qDebugipisip;qDebugrecUdpsocketbindissuccessrecUdpSocket-bindportQUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint;//此处的bind是个重载函数,连接本机的port端口,采用ShareAddress模式即允许其它的服务连接到相同的地址和端口,特别是//用在多客户端监听同一个服务器端口等时特别有效,和ReuseAddressHint模式重新连接服务器//connectudpSocketSIGNALreadyReadthisSLOTprocessPendingDatagrams;//向外广播上线消息//tcp初始设置//信号与槽连接//connectaddfriendButtonSIGNALclickedthisSLOTaddfriendButtonSlotconnectthis-recUdpSocketSIGNALreadyReadthisSLOTrecUdpMessage;}如图
4.4所示图
4.4主界面添加好友关键代码voidaddfriendForm::addfriendSlot{msg.msgKind=ADD_FRIEND;inti=kindCombobox-currentIndex;ifi==0{msg.friendkind=MYFRIENT;//我的好友}ifi==1{msg.friendkind=BESTFRIENT;//室友}ifi==2{msg.friendkind=NETFRIENT;//网友}msg.friendid=this-friendidEdit-text;//好友id不能为空;if!msg.friendid.isEmpty{qDebugmsg-_msg.msgKind;qDebugmsg-_msg.friendid;qDebugmsg-_msg.friendkind;emitaddfriendSignalmsg;}else{QMessageBox::aboutthis好友添加好友信息不能为空!!!;}}如图
4.5所示图
4.5添加好友查看好友资料关键代码friendInfoForm::friendInfoFormQWidget*parentpersonInfopi:QWidgetparentuinewUi::friendInfoForm{ui-setupUithis;ui-useridlineEdit-setTextpi.userid;ui-nicknamelineEdit-setTextpi.nickName;ui-agelineEdit_3-setTextQString::numberpi.age10;ui-citylineEdit_5-setTextpi.city;ui-idiotextEdit-setTextpi.idiograph;ui-phonelineEdit_6-setTextpi.phone;ui-sexlineEdit_4-setTextpi.Sex;}如图
4.6所示图
4.6好友资料界面好友聊天包括接收好友消息和发送好友消息接收好友消息关键代码voidForm::recUdpMessage{QByteArrayblock;QStringmsgType;QStringaccid;//当前账户idQStringfriendid;//与好友聊天的idQStringsendText;quint16size;QHostAddresspeerIp;chatwithFriendcw;//聊天好友连接信息quint16peerPort;block.resizerecUdpSocket-pendingDatagramSize;qDebug********************************;qDebugrecMessagehasstart......;qDebugrecUdpsocketdatasizeisthis-recUdpSocket-readDatagramblock.datablock.sizepeerIppeerPort;QDataStreaminblockQIODevice::ReadOnly;in.setVersionQDataStream::Qt_4_6;insizemsgType;ifCHAT_MSG==msgType{//发送的时候先发本身的id再发好友id//那么接收的时候先接收的id就为当前聊天的好友id//后接受的id就为本生的idinfriendidaccidsendText;qDebuguseridisaccid;qDebugsizesize;qDebugmsgTypeismsgType;qDebugfriendidisfriendid;qDebugsendtextissendText;cw.userid=this-userid;cw.ip=peerIp.toString;cw.port=peerPort;cw.friendid=friendid;qDebugchatfriendconnectinfoinrecupdsocketcw.userid:cw.useridcw.ipcw.portcw.portcw.friendid:cw.friendid;qDebugsender:friendidreceiver:useridmsgtext:sendText;ifchatformHash.containsfriendid{chatform=chatformHash.valuefriendid;}else{chatform=newchatForm0cwthis-recUdpSocket;chatformHash.insertfriendidchatform;}chatform-show;QStringstr;str=cw.friendid+say:+sendText;//chatform-displayChatMsgsendText;chatform-displayChatMsgstr;}}发送聊天消息关键代码voidchatForm::PUSH_SEND_BUTTON{qDebug***********************************;qDebugsendmessagehasstart......;QStringsendText=ui-inputtextEdit-toPlainText;qDebughaspushsendbutton...;qDebugsendtextissendText;if!sendText.isEmpty{QStringmsgType=CHAT_MSG;QByteArrayblock;QDataStreamoutblockQIODevice::WriteOnly;out.setVersionQDataStream::Qt_4_6;outquint160msgTypethis-useridthis-friendidsendText;qDebuguseridisthis-userid;qDebugfriendidisthis-friendid;qDebugsendTextissendText;out.device-seek0;outquint16block.size-sizeofquint16;qDebugsendblocksizeisblock.size;qDebugudpsocketwritedatasizeisudpsocket-writeDatagramblock.datablock.sizeQHostAddresspeeripquint16peerport;QStringstr;str=this-userid+say:;ui-msgDisplaytextEdit-appendstr;ui-msgDisplaytextEdit-appendsendText;}else{QMessageBox::aboutthis聊天错误窗体发送的信息不能为空;}ui-inputtextEdit-clear;}如图
4.7所示图
4.7聊天界面5系统测试
5.1测试的意义及目的系统测试是为了发现程序的错误而执行程序的过程,目的是为了在投入生产性运行之前,尽可能多地发现并排除软件中潜藏的错误,优化软件质量,提高软件性能
5.2软件测试的方法软件测试的基本方法有黑盒测试和白盒测试两种黑盒测试又叫功能测试或数据驱动测试黑盒测试是在程序接口上进行测试,主要是为了发现以下错误是否有不正确或者是遗漏了的功能,在接口上,输入能否正确的接受,能否输出正确的结果;是否有数据结构错误或者外部信息访问错误;性能上是否满足要求;是否有初始化或终止性错误;用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的结果白盒测试测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试;通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致因此白盒测试又称为结构测试或数据驱动测试白盒测试主要对程序模块进行如下检查所有独立的执行路径至少测试一次对所有的逻辑判定,取真和取假的两种情况都至少测试一次在循环的边界和运行界限内执行循环体测试内部数据结构的有效性等
5.3测试用例主要是在编写功能代码中对其功能进行相应测试,对程序的执行进行详细的跟踪来检查功能的实现与否以及对系统的整体测试以此来检查功能的完整性测试系统部分功能测试行为测试结果正常开启服务器点击启动服务器服务器界面显示本地ip和端口号,调试信息显示数据库打开成功客户端登录服务器在客户端输入账户admin密码admin数据库中connectinfo表中多了一条admin的连接信息,并且用户表中admin的状态为
1.出现主界面并正常显示好友列表及用户的基本信息客户端退出服务器关闭客户端数据库中的connectinfo表中少了一条用户admin的连接信息,并且用户表中的admin的状态变为0查看好友资料选中好友ffgg单击右键选择查看资料客户端创建了好友个人信息的界面,并且每个对应的textedit中有好友ffgg的个人信息好友聊天登录两个账号,一个账号为admin密码为admin另一个为账号ffgg密码为admin并彼此聊天Admin的客户端能收到了好友ffgg的消息,而ffgg也能收到好友admin发送的消息
5.4测试结论本系统在实现各部分功能时都进行了简单的测试,在测试的过程中也遇到了不少问题,例如在刚开始时编写程序时用到的消息结构体,之后在编程过程中随着功能的不断完善,消息结构体中的数据也在不断增加在服务器端设计通信线程时,用户可以正常登录,但再次登录时连接不上服务器,后来经过多次调试,跟踪调试,查询多方面的资料才知道是客户端失去联系时在服务器端没有进行正确的处理数据库中的数据也没有实时更新,创建的通信线程也没有在适当的时候撤销当然在其他功能模块的调试过程中,也遇到过一系列代码上的问题导致系统不能正常运行,大部分原因都是代码逻辑错误,函数引用错误,语法结构缺失等问题;通过在qtcreator断点调试及自己添加相应的输出语句,在调试栏查看变量的实时信息,及错误的提示信息就可以很容易的找出问题并且改正有些不能解决的问题就通过查阅相关方面的资料,基本已经解决在这一系列的测试,调试中,系统的功能也不断完善,例如在登录时用户的密码和账户不能为空,添加好友的界面中好友账号不能为空,聊天时发送聊天信息也不能为空,否则会给予相应的提示该系统基本实现了用户登录、用户注册、查看好友个人资料、好友分组、好友在线状态显示、删除好友、添加好友、修改个人资料及最重要的实现与好友的实时聊天总结经过大半学期的紧张的毕业设计,基于局域网的即时通信聊天系统基本完成,系统基本功能基本实现、测试、调试也基本运行正常该系统完成了服务器数据库的连接与操作,对客户端消息请求的的处理、用户登录、注册、查看好友资料、好友分组、添加好友、删除好友、好友聊天这一系列的功能该系统操作简单、界面友好性好、可扩展性强基于局域网的即时通信系统作为我的毕业设计课题,是对我4年学习的理论知识和实践相结合的一次综合检验虽然大学选修过qt相关的课题,但由于之前学过c/c++、java、c#这一系列的编程语言,让我在qt语法和界面的学习时没有想象中的那么难了在qt的学习之中虽然遇到过一系列问题,但大学期间提高的独立思考能力和独立学习能力让我倍感受益在本次设计的全过程中,我对四年的理论知识有了一个比较系统的认识和理解特别是在网络编程方面,之前只能对c/s模式及通信原理达到理解程度,经过本次毕业设计达到了基本会用的程度,对数据库的使用也熟稔于心对tcp协议和udp协议的优缺点有了更深的了解该设计涉及到各方面的知识,大大扩大了我的知识面,同时使我学会了如何使用所学的知识去解决一些实际问题但在本次毕业设计中也让我认识到了自己本身的一些不足之处在设计中深知自己掌握的知识还远远不够,掌握的理论知识并不能很好的做到学以致用,在编写代码时总会出现这样那样的问题,在整个毕业设计的过程中,开始并没有很好的把握方向,以为先把服务器做完再做客户端就可以了,但这样在编写代码时并不能即时的发现问题,有些功能在之后可能还要大量的更改不过幸好及时的发现这一问题之后设计是服务器写完一个功能,在客户端写相应的功能,调试正确后再进行下一功能的设计这样做大大加快了完成毕业设计的步伐也了解到对多线程技术操作的不熟悉,对线程的互斥量的了解很少通过本次毕业设计让我深深的了解到光知道书本上的知识是远远不够的,一定要把理论知识和实践结合起来,要做到理论联系实践这样才能深入的理解所学的知识此外,此系统还有很多功能有待完善、增强由于时间及精力有限,只能实现系统的基本操作,对其他功能日后通过不断的学习想进一步完善这次毕业设计的时间并不算太长,但我对网络编程、qt语言本身、设计流程有了更深刻的认识深刻的了解查询资料和阅读相关文献的重要性、学习专业知识的重要性、向同学和老师学习的重要性;学习到了对待任何事情都要有耐心和恒心,遇到问题要冷静的思考,将问题化整为零,逐一解决转眼间大学阶段就要完结了通过这次毕业设计,我更深刻的认识到实践教学在大学课程中的重要性,同时发现自己在动手能力方面存在很大的问题,在以后的学习工作中我会努力改进自身的不足、不断提高自己的动手实践能力和自身的综合能力参考文献
[1]StephenPrata著孙建春、韦强译.c++PrimerPlus第五版中文版.人民邮电出版社
2005.5
[2]斯蒂芬斯.SQL入门经典.人民邮电出版社
2009.
5.1
[3]刘增杰,张少军.《MySQL
5.5从零开始学》.清华大学出版社
2001.6
[4]JasminBlanchette,MarkSummerfield著.c++GUIProgrammingwithQT4SecondEdition.电子工业出版社.
2008.8
[5]罗莉琴,詹祖桥主编.windows网络编程.人民邮电出版社,
2011.4
[6]BobQuinnDavaShute著.WindowsSocketsNetworkProgramming.机械工业出版社,
2012.8
[7]周佩德.数据库原理及应用.北京电子工业出版社,
2004.
[8]张海藩.软件工程导论.北京清华大学出版社,
2003.
[9]王珊,萨师煊.数据库系统概论(第四版).北京高等教育出版社,2006]
[10]张海藩.软件工程(第二版)[M].北京人民邮电出版社,2006.
[11]张莉王强.SQLServer数据库原理及应用教程[M].清华清华大学出版社出版2003
[12]高海茹.SQLServer网络数据库技术精粹.北京机械工业出版社,2002
[13]谢希仁.计算机网络(第五版).北京电子工业出版社,
2008.1
[14]汤小丹,梁红兵,哲凤屏,汤子瀛.计算机操作系统(第三版).西安电子科技大学出版社,
2007.5
[15]杨大全拱长青董伟嗣范艳芳著.Socket编程术[C].沈阳工业大学学报2000年.
[16]杨文龙著.软件工程[P].电子工业出版社,1999年.
[17]施炜李铮秦颍编著.WindowsSockets规范及应用-Windows网络编程接口[M].1996
[18]汪翔袁辉.visualc++实践与提高网络编程篇[M].中国铁路出版
2001.
[19]张虹.软件工程与软件开发工具[D].清华大学出版社2004:
9.
[20]赵松涛.SQLServer2000应用与实例集锦[N].人民邮电出版社
1999.
[21]清汗计算机工作室.VisualC++
6.0数据库与网络开发实例[S].机械工业出版社
2001.致谢历时将近两个多月的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了尤其要强烈感谢我的论文指导老师—***老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进感谢这篇论文所涉及到的各位学者本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!。