




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科生毕业论文(设计)基于VC聊天工具的设计与实现所 在 系:专 业:姓 名:学 号:指导教师: 计算机科学与技术 网络工程 论文完成日期: 2012 年 05 月 02 日目 录摘要3一、概述11.1 本课题的研究背景11.2 国内外研究现状11.3 开发工具的简介11.3.1 Visual C+11.3.2 Access 2000数据库简介2二、网络通讯程序的设计原理和过程22.1 MFC框架22.2 TCP/IP协议32.3 客户机/服务器模型42.4 Windows Sockets网络编程接口52.5 系统功能描述5三、需求分析53.1可行性研究53.2 系统需求分析63.3 系统目标63.4 系统开发环境6四、总体设计74.1系统流程设计74.2 服务器端的设计74.2.1 服务器端工作流程图74.2.2 服务器的界面设计84.3 客户端的设计84.3.1 客户端工作流程图84.3.2 客户端的界面设计104.4 数据库设计10五、系统程序实现105.1 服务器端105.2 客户机端13六、软件测试156.1 软件测试的意义156.2 软件测试的重要性166.3 软件测试的范围166.4 软件测试的方法166.5 软件测试的目的和原则16七、总结18参考文献19致谢20摘要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们日常生活带来便利。它已在不知不觉中进入人类社会的各个领域并发挥着越来越重要的作用,人们的生活正在被它潜移默化的影响着。21世纪聊天已成为人们相互交流的一种方式,与E-mail、电话相比,聊天服务更具有时效性。本聊天工具利用C+作为前端的应用开发工具,Access作为后台的数据库,采用客户端/服务器(C/S)的模型构建,结构健壮灵活,在数据处理、人机界面、数据通信、系统维护等方面具有功能全面、实用等特点。包括服务器端和客户端两个模块,客户端通过服务器端进行通信。该软件采用多线程技术支持多用户操作,并采用相关技术进行了优化,加快了文字传递速度。关键字:C+ ;Access;聊天工具AbstractAlong with increasing enhancement of science and technology, computer has been matured day after day, its formidable function makes our life convenient. It plays vital role in every field in Humans society, with civilizing influence on us. In the century of 21st, chatting on the Internet has been one important way to communicate for people, compared with E-mail and telephone, it is more time-sensitive.This tool for chatting will be developed by MSVC, database will be set up by Access, construct with model C/S, it is comprehensive and practical from data preceding, User Interface, data channel and system maintenance because of the robust and flexible structure.This tool has two modules: Server and Client, Client transmit messages through Sever. It uses multi-thread technology to transmit faster and it can provide multi-user service.Key words: C+; Access;Tool of Chatting;分类号:TP311.1文献标识码:A一、 概述1.1 本课题的研究背景随着Internet的不断发展普及,网络通讯越来越被千家万户所接受,成为人们生活中的一部分。网络聊天已和手机等一样,成为人们运用最为广泛的通信工具之一。21世纪是网络的世界,现在网络发展的不可估量了,它可以包括我们生活中的方方面面,小到上网购物、查找资料,大到网上理财、网上会议,可以说网络把我们的世界变小了,即使在天涯海角,有网络的地方我们就可以随时联系。最简单的形式就是进行网络聊天了,这个很简单的聊天工具,可以随时拉近你我的距离。现在我借助于简单的网路知识和编程技巧模拟MSN等聊天软件,通过VC和Winsock实现聊天程序的全过程。1.2 国内外研究现状随着网络宽带业务的推广与普及,加之视频产品设备(如摄像头、耳机、麦克风等)的成熟,普通用户可以轻松地借助网络视频通讯软件,实现“面对面”的网络交流。信息的无限量扩大,交通工具的便捷,视频技术的充分应用等导致了行业间竞争的全球化,这就要求现代部门、企业要具备更加灵敏的神经,更扁平化的管理,更快速的反应和决策,更贴切的市场宣传和服务。所有这一切是由信息技术的发展所带来的,同样也要求有先进的信息技术来提高部门、企业的竞争力。现代通讯已经是越来越普及了,必须有效合理的运用视频产品类设备来提高信息的传递和交流。在同一个局域网中,充分、合理的运用摄像头、耳机、麦克风等设备来实现文字聊天和语音视频聊天更是我们生活、学习、工作的便利所在。1.3 开发工具的简介1.3.1 Visual C+Visual C+即VC,微软公司出品的高级可视化计算机程序开发工具。他提供了一套开发环境:Visual Studio,Visual Studio本身包括一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档,借助这套工具,用户可以随心所欲地开发出各种功能的应用软件以及借助OpenGL和DirectX技术开发游戏软件。Visual C+可以识别C/C+并编译,支持MFC类库,并提供了一系列模板,常用的有MFC AppWizard(EXE/DLL),MFC ActiveX Control Wizard,Win32 Application,Win32 Console Application,ATL COM AppWizard。这种可视化编程环境可以令程序员花更多精力在程序功能的实现上,而不是底层的建设上,这就大大加快了程序开发速度和效率,这也是Visual C+一个显著的特点。利用Visual C+编译出的程序空间小,运行快,比其他的编译工具编译出的软件占据较多优势。现在常用的版本有Visual C+ 6.0/.Net/2005。 Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft 公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+ 7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT 4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(Integrated Development Environment, IDE)。Visual C+ 6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Visual C+它大概可以分成三个主要的部分:1Developer Studio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C+”,所以很多人理所当然的认为,那就是Visual C+了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。71.3.2 Access 2000数据库简介过去的一些数据库软件是基于命令行上面的,在操作上、数据库建立、维护等等都需要敲入命令行,相当复杂且不易使用,但是在具备了窗口的GUI(Geographical User Interface,图形用户界面)特性的Access数据库推出之后,数据库的建立不再是困难的事情,我们可以在PC上简单而快速的建立出一套符合自己的数据库。不但如此,在Access 2000 推出以后,我们发现数据库的建立更加的快速,但是功能却更加强大,用户不用再去记忆那一大堆的文件名称,或是为数据库的文件管理大费周章,通过Access的人性化管理接口把数据库的管理整理,便于维护;此外,在报表的制作上也是相当容易的,完全的视觉开发向导设计,让人使用起来很舒服。但是美中不足的是Access对于主从式结构的安全性管理不足,由于Access可以快速的通过ODBC连接到数据库服务器上(Database Server),并浏览所有表格或是相关对象转成HTML基本上,Access对建立一个数据库所具备的每一个对象,其中包括了表、查询、窗体、报表、宏、模块。其功能分别叙述如下:表对象打开已经存在的表格、对已存在的表格字段数据进行修改、新建表格。查询对象可以用直接拖放的方式,建立表格之间的关联与对应关系,自动产生SQL语法查询出我们想要的数据。窗体设计对象可以设计用户接口,用来输入并处理数据。报表对象利用视图向导的开发方式,简单、快速的建立出需求报表或标签。宏对象提供许多的宏功能,您可以把这样的宏连接到窗体设计中的任意一个对象,以达成一些复杂的功能。模块对象撰写VB的程序模块,处理较复杂的问题与需求,该功能是采用事件驱动的模式,类似VB的处理方式。1二、 网络通讯程序的设计原理和过程 2.1 MFC框架微软用C+的类机制将绝大部分的API函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了Win32开的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。它就是Microsoft Foundation Classes,简称为MFC,可以说它是VC开发环境的一个核心构件。MFC构架了一个庞大的类体系结构,在4.0时代就多达189个类,程序代码达252个文件,58个头文件,共10MB之多,MFC4.2时又多加了29个类,但是最为主干的是下面类结构示图2.1所示的一些类: 图2.1 MFC类框架主体4构建一个基于MFC框架的程序,可以使用MFC的向导程序,一个基于MFC的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同的程序属性。使用其向导以及控件编程,使得不论是界面编写,还是程序内核设计,都更加的简单。其中有合理的消息映射机制,有方便的运行时类型识别功能,更有文档/视图结构设计,文档串行化功能等非常多的优秀功能。2.2 TCP/IP协议 TCP/IP是国际互联网所采用进行网际互连的通信协议。IP互连协议(Internet Protocol),负责主机之间的传输数据。TCP传输控制协议(Transmission Control Protocol),负责在应用程序之间传递数据。实际所称的TCP/IP协议包括了在国际互联网上应用的一组协议,互联网协议组是此协议组的另一个名字。这个协议组包括几种工作在不同层次上的网络协议,UDP用户数据报协议(User Datagram Protocol),提供给用户进程的无连接协议,也负责在应用程序之间无连接传递数据,但不执行正确性检查。ICMP互连网控制报文协议(Internet Control Message Protocol),处理主机间的差错和传送控制。ARP地址解析协议(Address Resolution Protocol),负责将网络层地址转换成链路层地址。RARP反向地址解析协议(Reverse Address Resolution Protocol),负责将链路层地址转换成网络层地址。 TCP/IP协议的核心是传输层协议(TCP、UDP)、网络层协议(IP)和物理接口层,这三层通常在操作系统的内核中实现。TCP/IP网络环境下的应用程序设计是通过网络系统编程界面Socket实现的,Socket提供应用程序与系统内核之间的网络编程接口。协议可以是可靠的可以是不可靠的。可靠的协议意味着当数据通过协议传递时,协议保证数据正确传输。可靠传输包括几个特征。首先,为了确保数据正确传送,协议在通信应用程序之间互相交换确认信息。也就是说,程序每次发送一个报文时,都期望对方发送一个相当于说:“我得到这个报文”的确认信息。如果发送程序没有收到这样一个确认信息,程序将自动重新发送此报文,直到得到应答信息为止。其次,为了确保传输的数据有效,可靠协议在每次传输时,都包含一个或更多的校验和(CRC)。接收计算机重新计算校验和,与收到的校验和进行比较。如果不匹配,就表明在传输过程中发生了错误。 传输控制协议TCP是一个使用校验和、确认信息以及其它可靠数据传输技术的可靠协议。相比之下,不可靠协议不能确保数据正确传输。协议试图传输数据,但不保证成功。而且,不可靠协议在传输失败后,并不通知发送方应用程序。可将不可靠数据传输比作没有返回地址的信件。如果发送地址是锗误的,由于邮递系统不能将信退回给你,所以你就不知道信件有没有送到。即使发送地址是正确的,也不能保证邮递系统不丢失信件。 TCP/IP协议组中存在的两个基本数据服务是:字节流服务和数据报服务。使用字节流的协议将信息看作一串字节流进行传输。协议不管要求发送或接收数据的长度和传送数目,只是将数据看作一个简单的字节串流。使用数据报的协议将信息视作一个独立单元进行传输。协议单独发送每个数据报数据报之间不相互依赖。例如,假设你使用字节流协议发送5个数据段(每个有10字节)和一个包含50字节的数据段(总共100字节)。连接的接收方可以按每次20字节读数据(要读5次)。传输控制协议是字节流协议。 字节流协议不关心每个数据段的长度。如果应用程序使用字节流协议发送数据,则协议能够保证连接的另一端按照发送的顺序接收数据。相比之下,传输到同一目的地的多个数据报可能不会按发送顺序到达。如果接收方应用程序要求数据顺序一致,应用程序必须在数据到达后,校对这些数据。用户数据报协议和互连网协议使用数据报传输数据。数据报类似于信件。如果你在同一天给同一个人邮寄两封信,你无法知道那个人先收到那封信。同样,如果连续两天给两个人邮信,你也不能知道哪封信先收到。收到信的顺序和发送顺序可能相反。在TCP/IP术语中,端口(Port)类似于IP地址,IP地址与主机地址是相联系的,端口和协议相联系。IP数据报保存目的和源地址,同样传输协议也保存源和目的端口号。Internet包括像FTP、Telnet和Mail这样广泛使用的应用程序采用的应用协议,在Internet上,这些应用程序使用一种叫做“通用口分配”的端口。通用口分配是特定应用程序广泛使用的一个协议端口。像PC程序员使用打印端口LPT1用于打印,Internet程序员也对具体应用程序使用许多协议端口。例如,文件传输协议(FTP)的通用口分配是端口号21的。Telnet的通用口分配是端口号23。92.3 客户机/服务器模型 客户机/服务器模型也是一种网络模型,但与前述的模型不同,它并不是定义了网络的层次结构,而是描述了一种网络程序运行的方式。 客户机/服务器模型将网络应用程序分为客户和服务器两部分。客户方对服务器方发送信息请求,服务器方对其做出相应回答,提供服务。在TCP/IP网络应用中,多数网络应用程序是使用客户机/服务器模型设计的。服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户程序提出了请求信息。此时,服务程序被唤醒并且为客户提供服务,对客户的请求做出适当的反应。虽然基于连接的服务是设计客户/服务器应用程序的标准,但有些服务也是可以通过数据报Socket提供的。 通常,网络应用程序包含两个独立的应用程序:客户程序和服务器程序。但是,也可以设计同时完成这两种功能的程序,例如,一些服务器程序如果不能完成一个服务请求时,它将转而充当客户程序,向其它服务器程序请求信息。这方面的一个典型例子就是提供Internet从域名到IP地址映射服务的DNS服务器。 当建立服务器程序时,应该将服务器程序设计成等候客户的请求。TCP传输层通过协议端口和应用程序(像服务器和客户)通信,也就是说,为了接收客户请求,服务器程序必须对传输层的一个特定协议端口进行侦听。当服务器配置Socket接口时,它使用bind()函数让Socket执行体登记一个协议端口。也就是说,程序告诉Socket执行体使用哪一个协议端口进行数据传送。Socket执行体接着告诉传输层某个特定协议端口已被使用,并将其收到的所有数据传送给Socket API。 使用无连接协议的程序和使用面向连接协议的服务器程序之间的主要相似之处是它们都必须对一个协议端口进行侦听。例如,无连接和连接服务器程序必须在协议端口侦听客户请求。同样,由于无连接客户程序没有和远地主机建立直接连接,所以它也必须对协议端口进行侦听,以便接收以对它服务请求产生的数据报应答。Socket API中的bind()函数让程序将一个本地地址(包括主机地址和协议端口)和一个Socket联系起来。 下面程序行显示了一个典型的函数调用: result=bind(socket_handle,local_structure,socket_address,address_length)9无连接客户程序也对一个协议端口进行侦听。使用无连接协议的程序不和远地主机建立直接连接。无连接客户程序使用数据报发送网络服务请求,它不建立点到点连接。因此无连接客户程序必须在一个协议端口,对应答数据报进行侦听。与服务器程序一样,无连接客户程序也使用bind()函数让Socket执行体登记协议端口。也就是说,类似服务器程序,无连接客户程序告诉Socket执行体使用哪个协议端口进行数据传输。Socket执行体处理传输层内UDP软件模块和客户程序之间的接口9。2.4 Windows Sockets网络编程接口选定Windows平台开发网络通信程序,可以选择Windows的Sockets编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Windows Sockets无疑是我们进行网络编程的利器。所有的Windows Sockets实现都支持流套接口和数据报套接口。应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。2.5 系统功能描述 聊天交流是目前互联网提供的主要内容。聊天系统有多种实现方式,类似ICQ属于一种点对点的聊天系统;还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登陆统一的聊天服务器。在基于Socket的聊天系统中,主要有两种角色:服务器和客户端,不同的客户端登陆集中式的服务器,通过服务器将一个客户端发出的信息推送到其他所有客户端。基于Socket的聊天系统最早实现是使用网页刷新方式,通过客户端不断地自动刷新,将服务器端整个页面内容下载到客户端显示,这种方式的聊天速度慢,而且有刷屏现象,很快被更新的聊天技术所替代。聊天系统在客户端和服务器之间主要传送的是文字信息,服务器端只需要把最近的文字信息推送到客户端,这样减少了网络传输内容,节省了网络传输的时间,无疑提高了聊天速度。这种“推”技术是目前基于Socket聊天系统的主要实现技术。在基于Socket的聊天系统,客户端和服务器必须保持随时随地的连接。三、 需求分析3.1可行性研究(1)成本可行性分析因为本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。(2)技术可行性分析首先我已经搭建好开发所需要的软硬件平台,并进行了合理而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于Windows,将要使用网络通信技术,而Windows有完善成熟的网络通信接口,以及与VC开发环境的严密契合能力,加之相类似的更大规模的Internet通信工具产品也已有例在先,所以这个程序的开发可行性在技术上是完全可行的。3.2 系统需求分析本系统是聊天工具,设计能实现聊天服务器端与客户端的功能。主要实现如下功能:(1)服务器端:实现与客户端的连接,接收来自客户端的聊天消息。并实现对客户端登录用户的管理与控制;实现客户端聊天信息的监控与保存。(2)客户端:实现与服务器端的连接,建立和维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接受对方的响应。3.3 系统目标聊天已经成为人们工作生活中传递信息、交流感情的重要工具。网络版的聊天软件种类繁多,如QQ、OICQ、MSN等,实现了随时随地上网聊天,给人们带来了很大的方便。但是这些聊天软件也存在以下不足:用户必须连接Internet;用户在工作时容易沉迷于网络聊天。为了方便内部的信息交流,减少不必要的财力和人力资源浪费,开发一个局域网聊天软件是非常必要的。我们一般设计系统都要完成以下的几个要求,以便于用户进行操作。这样才能使系统易学易用。(1)合理的设计数据库 尽量合理地减少数据库数据的冗余,使重复的数据保持在最小限度,这样将不必要的多占用存储空间,减少产生混乱影响的危险,还能提高计算机的运行速度。(2)设计出友好的界面 界面的友好与否是用户评价一个软件优劣的重要方面之一,使用户有一个良好的心情。3.4 系统开发环境(1)开发环境操作系统:Windows XP Professional开发工具:Visual Studio 2010(C+)数据库选择:Access(2)程序运行环境a软件配置操作系统:Windows XP Professional数据库选择:Access开发平台: Visual Studio 2010(C+)b硬件配置CPU:Intel Dul-core T4200 2.0GHz 2.0GHz(服务器/客户机)内存:2G(服务器/客户机)硬盘:320GB(服务器/客户机)四、 总体设计通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答。4.1系统流程设计 只有充分地了解了聊天程序的工作流程,才能对整个系统的理解更加深刻。本聊天程序的流程设计图如下:加载套接字库初始化套接字绑定本地机到套接字向指定IP地址发送数据关闭套接字库结束聊天创建线程用于接受数据图4.1系统流程设计图4.2 服务器端的设计4.2.1 服务器端工作流程图 服务器端的工作主要是配置服务器并开启服务,其工作流程如图4.2所示。 输入服务器IP是否存在开启服务Y关闭服务器N主界面配置服务器是否配置成功YN退出服务器 图4.2 服务器端工作流程4.2.2 服务器的界面设计服务器界面设计有启动服务器、关闭服务器功能,还有接收客户机信息记录空间,服务器向客户机发送消息的文本框。4.3 客户端的设计4.3.1 客户端工作流程图 在本系统中,客户端需要将用户输入的聊天信息发往服务器,那么建立一个线程一直实现发送功能,由于客户端监视用户输入也有一个监视线程在运行。这样,有两个线程各司其职。一个负责监视输入,另外一个线程负责将输入发送出去。那么再这两个线程之间如何通信?最经常使用的办法是使用队列(Queue)模式。Queue模式是处理消息通信的基本办法,如图4.3所示。提取加入队列Queue图4.3 队列Queue模式本系统中应用Queue模式有一个问题,加入动作是由用户输入决定的,一旦有用户输入,就会发生加入动作,那么,提取线程会在队列另外一段进入死循环不断的读取,这样才能在队列中一旦有对象事件时,能够被立即提取出来,因此必须使用while(!Terrupted()实现死循环。但是我注意到,每次循环中的提取动作执行是有前提条件队列中有对象事件。如果在有对象事件时,再通知提取线程,这样可以避免提取线程一直霸占使得CPU“空转且占用”,使用线程的Monitor.Wait(Object obj)和Monitor.PulseAll(Object obj)可以达到这个目的。提取线程的循环体内设置Monitor.Wait(Object obj)进行中断等待,加入对象后,执行Monitor.PulseAll(Object obj),这样提取线程将中断等待,从Queue中读取加入的对象。线程在中断等待时,将释放CPU的占用,这样就有效率地利用了CPU,如图4.4所示。提取队列QueueWait加入图4.4改进后的队列Queue模式由此可见,并不是说使用了多线程就能提高系统性能,更重要的是还要注意提高CPU使用效率,防止Block发生。提高多线程的使用效率还必须了解下列几点:(1)线程运行的次序并不是按照创建他们时的顺序来运行的,CPU处理线程的顺序是不确定的,如果需要确定,那么必须手工介入。(2)要避免大量线程运行时发生堵塞现象,可以通过设置线程优先级来实现,但是同时又必须注意到,再大量线程被堵塞时,最高优先级的线程先运行,但不表示低级别线程不会运行,只是运行概率较小而已。(3)检查所有可能Block的地方,尽可能多的使用sleep;尽可能延长sleep(毫秒数)的时间。但是,当多线程数量很多时,每次启动线程的开销也非常大,有时创建新线程的服务器再创建和销毁线程上花费的时间和消耗的资源,可能要比花再处理应用逻辑运算的时间和资源要多得多。除了创建和销毁线程的开销之外,活动的线程也会消耗系统资源。当应用系统突然遭遇巨量访问时,服务器内存中会创建太多的线程,直至资源完全消耗,这对于应用系统的正常运行是有致命伤害的。为了能在访问时限制线程开启数目,以及减少线程频繁创建和销毁带来的系统开销,提高系统的大量访问量处理性能和速度,需要事先创建一定数量的线程供调用者循环反复使用,这也就是“池”技术。6线程池的基本原理也是基于队列Queue,通过不断查询队列Queue是否有可以运行的线程。如果有,就立即运行线程;如果没有,就锁定等待,直至有新的线程加入被出发解锁。本系统中,聊天系统核心功能的处理可以采取线程池设计,这样可以加快对每次聊天信息的处理时间和提高处理速度。整个系统的核心底层是非堵塞I/O技术,通过使用这一新技术,可以实现底层网络I/O的无堵塞、流畅地读写,为整个系统的高性能运行奠定了坚实的基础。非堵塞的Socket I/O有两大部分:服务器和客户端。在两端都将采取这一新技术,根据TCP/UDP不同,又分别有两套Socket详细实现。4.3.2 客户端的界面设计客户机的界面设计有设置连接服务器的IP,昵称,开始连接、屏蔽连接按钮,消息记录框,消息输入框,以及聊天的状态(在线、离开、隐身、忙碌)。4.4 数据库设计数据库需要设计一个表,记录聊天内容。表的字段包括:编号、写入时间、内容及形式。其表的结构如下:图4.5 数据库表五、 系统程序实现5.1 服务器端服务器端运行以后,显示服务器界面,包括启动服务器、关闭服务器、清除、历史、发送、退出程序按钮,以及,昵称输入框、消息输入框,记录消息面板,在线、离开、隐身和忙碌状态。如图5.1所示图5.1 服务器端当其点击启动服务器按钮时,其代码实现如下:void CInfoDlg:OnButton() /启动连接UpdateData(true);m_listenSocket.Create(8888);m_listenSocket.Listen();m_strState=网络服务启动,等待客户机连接.n;UpdateData(false);GetDlgItem(IDC_BUTTON)-EnableWindow(false);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(true);和客户机连接上以后,需要获取当前的年月日,向客户机发送消息的时候需处理消息是否成功发送,如未成功发送,需提示“发送消息失败,请确认已经正确连接”,发送消息成功,该消息存储于数据库表中,其关键代码实现如下:CString CInfoDlg:GetNow()/取得当前的年月日CTime time=CTime:GetCurrentTime();int m_nYear=time.GetYear();/年int m_nMonth=time.GetMonth();/月int m_nDay=time.GetDay();/日int m_nHour=time.GetHour();/小时int m_nMinute=time.GetMinute();/分钟int m_nSecond=time.GetSecond();/秒CString m_strTime=time.Format(%Y-%m-%d %H:%M:%S); return m_strTime;void CInfoDlg:OnButtonSend() /调用函数OnSend();void CInfoDlg:OnSend()/发送消息内容UpdateData(true);if(m_Msg!=)CString tmp,tmp1;GetDlgItem(IDC_EDIT1)-GetWindowText(tmp);tmp1=tmp+ +GetNow()+:+m_Msg;m_strMsg=m_strMsg+tmp1+rn;if(m_connectSocket.Send(LPCTSTR(tmp1),tmp1.GetLength() =SOCKET_ERROR)m_strState=发送消息失败, 请确认已经正确连接!n;UpdateData(false);elseCInfoApp* app=(CInfoApp*)AfxGetApp();CString strTemp1;GetDlgItem(IDC_EDIT_MSG)-GetWindowText(strTemp1);app-m_DB.ExecuteSQL(insert into 流水(WriteDate,Content,Type) values(+GetNow()+,+strTemp1+,发送);UpdateData(false);void CInfoDlg:OnReceive()/处理接收消息char *pbuffer=new char1025;int bufferSize=1024;CString str;int iReceived=m_connectSocket.Receive(pbuffer,bufferSize);if(iReceived=SOCKET_ERROR)m_strState=接受消息失败!;UpdateData(false);elsepbufferiReceived=NULL;str=pbuffer;/解析strm_strMsg=m_strMsg+str+rn;UpdateData(false);CInfoApp* app=(CInfoApp*)AfxGetApp();app-m_DB.ExecuteSQL(insert into 流水(WriteDate,Content,Type) values(+GetNow()+,+str+,接收);void CInfoDlg:OnButtonClose() OnClose();void CInfoDlg:OnClose()/关闭连接m_connectSocket.Close();m_listenSocket.Close();isConnection=false;GetDlgItem(IDC_BUTTON)-EnableWindow(true);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(false);m_strState=服务器已经关闭n;UpdateData(false);5.2 客户机端客户机端运行以后,显示客户机界面,包括开始连接、屏蔽连接、清除、历史、发送、退出程序按钮,以及,昵称输入框、消息输入框,记录消息面板,在线、离开、隐身和忙碌状态。如图所示图5.2 客户机端连接服务器的关键代码实现如下:void CInfoDlg:OnButton() /连接服务器UpdateData(true);GetDlgItem(IDC_BUTTON)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(TRUE);m_connectSocket.Create();this-m_You_IP.GetWindowText(m_strName);m_connectSocket.Connect(m_strName,8888);m_strState=正在连接到服务器(如果长时间无响应,请确认服务端程序是否处于侦听状态).n;UpdateData(false);void CInfoDlg:OnConnect()/接收连接请求m_strState=已经和 服务器 建立了连接n;UpdateData(false);GetDlgItem(IDC_BUTTON_SEND)-EnableWindow(true);isConnection=true;和服务器连接上以后,需要获取当前的年月日,向服务器发送消息的时候需处理消息是否成功发送,如未成功发送,需提示“发送消息失败,请确认已经正确连接”,发送消息成功,该消息存储于数据库表中,其关键代码实现如下:void CInfoDlg:OnButtonSend() OnSend();void CInfoDlg:OnSend()UpdateData(true);if(m_strMsg!=)CString tmp,tmp1;GetDlgItem(IDC_EDIT1)-GetWindowText(tmp);tmp1=tmp+ +GetNow()+:+m_strMsg;m_Send=m_Send+tmp1+rn;if(m_connectSocket.Send(LPCTSTR(tmp1),tmp1.GetLength() =SOCKET_ERROR)m_strState=发送消息失败, 请确认已经正确连接!n;UpdateData(false);elseUpdateData(false);void CInfoDlg:OnReceive()char *pbuffer=new char1025;int bufferSize=1024;CString str;int iReceived=m_connectSocket.Receive(pbuffer,bufferSize);if(iReceived=SOCKET_ERROR)m_strState=接受消息失败!n;UpdateData(false);elsepbufferiReceived=NULL;str=pbuffer;m_Send=m_Send+str+rn;CInfoApp* app=(CInfoApp*)AfxGetApp();app-m_DB.ExecuteSQL(insert into 流水(WriteDate,Content,Type) values(+GetNow()+,+str+,接收);UpdateData(false);void CInfoDlg:OnButtonClose() OnClose();void CInfoDlg:OnClose()/断开服务器连接m_connectSocket.Close();m_listenSocket.Close();GetDlgItem(IDC_BUTTON)-EnableWindow(true);GetDlgItem(IDC_BUTTON_CLOSE)-EnableWindow(false);m_strState=已经和 服务器 断开了连接n;UpdateData(false);isConnection=false ;设置状态有在线、离开、隐身、忙碌,其关键代码如下:void CInfoDlg:OnRadio4() if(isConnection)CString tmp,tmp1;GetDlgItem(IDC_EDIT1)-GetWindowText(tmp);tmp1=tmp+ +GetNow()+:忙碌;m_connectSocket.Send(tmp1,tmp1.GetLength();void CInfoDlg:OnRadio3() if(isConnection)/发送状态CString tmp,tmp1;GetDlgItem(IDC_EDIT1)-GetWindowText(tmp);tmp1=tmp+ +GetNow()+:隐身;m_connectSocket.Send(tmp1,tmp1.GetLength();void CInfoDlg:OnRadio6() if(isConnection)/发送状态CString tmp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论