网络聊天系统的设计与实现(共29页).doc
精选优质文档-倾情为你奉上 网络教育学院本 科 生 毕 业 论 文(设 计) 题 目:网络聊天系统的设计与实现学习中心: 层 次: 专科起点本科 专 业: 年 级: 年 春/秋 季 学 号: 学 生: 指导教师: 完成日期: 年 月 日专心-专注-专业内容摘要随着互联网技术的飞速发展,网络已经成为人们生活中不可缺少的一部分,通过网上聊天已经成为人与人之间的网络通信的聊天,交流和联系的一种方式。因此,更多的网站开始提供在线聊天功能。与此同时,以其方便,快捷,成本低的优势,聊天室众多企业的青睐,许多企业网站也加入了聊天室,从而促进消费者与消费者和消费者之间的通信模块。本文是一个软件工程的在线聊天系统,专注于系统的开发,使用系统的分析,设计和思维测试软件工程知识来实现的描述,其中包括三个主要方面的软件生命周期:软件定义(问题定义,可行性研究,需求分析),软件开发(总体设计,详细设计,编码,测试)和运行维护。通过运用软件工程知识处理实际,加强的问题,清晰,可靠的标准化,使得程序易于维护。该软件使用JAVA编写,具有良好的兼容性,易于实现。操作简单,使用方便结构简单,易于搜索,实用的聊天室。关键词:网络;通信;套接字目 录引 言 随着不断投入的信息技术,网络,作为一种新生事物,近年来现代技术的普及得到了前所未有的深入,网络应用不断涌现层出不穷,所有的层级和所有年龄的用户提供不同的个性化服务。现代小型和中小型企业的领导人认识到,进一步提高企业信息化的必要性。为了使企业在瞬息万变的信息时代生存,适应激烈的市场竞争,现代企业的要求是能够特别是领导具有能力的员工,实时通信系统是搭建在员工之间的沟通和交流,是必要的条件。系统开发是一个非常复杂的系统工程。这里,对基本的方法和系统发展的方法进行介绍,和有内容是在论文里列出。 为了提高市场竞争力,我们必须全面调查和对市场的详细研究,同时也有良好的客户服务。企业应该在复杂的环境对策。员工与员工和领导之间的交流立即x性就显得尤为重要,对于企业网上聊天系统是一种交流和沟通的平台,系统可以成为中小企业沟通的理想平台。如果信息能及时反馈,及时处理并做出相应的动作,将能进一步加强在现代经济市场的中小型企业的竞争力。 网络通信是网络应用的一个重要体现。即时通讯是网络应用的一个重要方面。聊天系统,主要用于小型企业,学校或小型局域网。该应用程序使得短距离通信更高效,更便捷,更高效,以反映现代IM的特点。 该系统可满足中小型企业,学校内部网络即时通讯需求的需要,内部网络业务的正常环境下,提供了即时通信的能力,本系统采用的JAVA开发。该系统可为中小型企业的共同努力,相互沟通提供了一个功能强大的工具,在局域网中使用这个系统,可以为企业提供员工沟通的帮助,以提高工作效率。1 概述1.1 课题研究背景和意义 随着现代技术的普及和信息技术的不断普及,网络作为一种新事物,近年来得到了前所未有的普及和深入,网络应用层出不穷,给用户的各个阶层和各个年龄段提供了不同的个性化服务。和现代中小企业的领导认识到进一步提高企业信息化的必要性。为使企业在瞬息万变的信息时代生存下来,适应激烈的市场竞争,现代企业的要求是能够沟通,尤其是领导者和员工之间的共同能力和实时通信系统是在这样的条件下诞生的。系统开发是一个非常复杂的系统工程。介绍了系统开发的基本过程和方法,并对相关文献进行了介绍。 为了提高市场竞争力,我们必须充分调查和详细研究市场,而且还有一个良好的客户服务。企业在复杂环境中应作出对策。员工与员工之间的即时交流和领导是特别重要的,网上聊天系统是企业的一种沟通和沟通的平台,系统可以成为中小企业沟通的理想平台。如果能够及时反馈信息,及时处理并做出相应的行动,将能够进一步提高中小企业在现代经济市场中的竞争力。 网络通信是网络应用的一个重要体现。即时消息是网络应用的一个重要方面。该聊天系统主要用于小企业、学校或小局域网。此应用使短距离通信更高效、方便,更有效地体现了现代通信的特点。 该系统可以满足中小企业的需求,学校内部网络即时通信的需求,内部网络的正常操作环境下,提供即时通信的能力,本系统采用JAVA开发。该系统可以为中小企业的协同工作,相互沟通提供一个强大的工具,利用该系统在局域网中,可以为企业员工沟通提供帮助,提高工作效率。1.2 本文的主要内容及组织结构本文研究的内容为局域网聊天系统的设计与实现。本文的组织结构:全文共分五章。第一章,主要部分是概述。第二章,介绍网络应用系统开发技术介绍。第三章,介绍网络聊天系统的分析与设计。第四章,介绍网络聊天系统详细设计及实现。第五章,介绍相关测试部分的内容。2 网络应用系统开发技术介绍2.1 TCP/IP协议概述 TCP / IP是专为大型网络协议的行业定制标准套件。在TCP / IP协议族包括IPv4和IPv6的套协议。对TCP / IP的标准是发表在一系列的文件名为RFC文档。在一个基于TCP / IP的网络,路由器可以转发给路由器,一个节点或者是主机或路由器。 在一个基于TCP / IP的网络,一个子网是被路由器使用相同的IP地址前缀的一个或多个LAN段,和一个网络是通过路由器连接的两个或更多个子网。2.2 客户/服务器模型 客户/服务架构结构简称C/S结构,是一种网络架构,它把客户端 (Client) (通常是一个采用图形用户界面的程序)与服务器 (Server) 区分开来。每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。有很多不同类型的服务器,例如文件服务器、游戏服务器等。 C/S通过不同的途径应用于很多不同类型的应用程序,最常见就是目前在因特网上用的网页。例如,当你在维基百科阅读文章时,你的电脑和网页浏览器就被当做一个客户端,同时,组成维基百科的电脑、数据库和应用程序就被当做服务器。当你的网页浏览器向维基百科请求一个指定的文章时,维基百科服务器从维基百科的数据库中找出所有该文章需要的信息,结合成一个网页,再发送回你的浏览器。2.3 Socket网络编程套接字是通信的基石,是支持TCP/IP协议的网络通信的操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中。通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通过通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。套接字可以根据通信性质分类,这种性质对于用户时可见的.应用程序一般仅在同一类的套接字间通信.不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。进入九十年代后,随着计算机和网络技术的发展,很多数据处理系统都采用开放系统结构的客户机/服务器网络模式,即客户机提出任务请求,通过网络发送给服务器,由服务器做相应处理,执行被请求的任务,然后将结果返回给客户机。例如:银行ATM的前置机和数据处理的主机之间即构成客户机/服务器网络模式;电话银行的前置机和银行数据处理机之间也构成这种网络模式结构等。这样,如何在前置机和数据主机之间进行信息交换,即进程网络通信,就成为实现这种网络模式的基础。而TCP/IP的套接字技术是解这一问题的有力工具。它从提出时就一直发挥着愈来愈重要的作用,并已成为UNIX操作系统下TCP/IP网络编程标准;甚至WINDOW、JAVA都配有它的通用接口。有了这个强有力的工具,我们可以实现异种机、异种操作系统应用程序间的相互连接和通信。套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。它构成了在单个主机内及整个网际间的编程界面。一般来说,跨机应用进程之间要在网络环境下进行通信,必须要在网络的每一端都要建立一个套接字,两个套接字之间是可以建立连接的,也是可以无连接的,并通过对套接字的“读”、“写”操作实现网络通信功能。类似于UNIX系统中的I/O概念,像文件那样有打开、读、写、关闭的方式。2.4 开发工具与运行环境 本实验的主要开发工具是Eclipse,Eclipse是开放源代码的项目,可以在网上免费下载Eclipse的最新版本,一般Eclipse提供几个下载版本:Release,Stable Build,Integration Build和Nightly Build。Eclipse本身是用Java语言编写,但下载的压缩包中并不包含Java运行环境,需要用户自己另行安装JRE,并且要在操作系统的环境变量中指明JRE中bin的路径。2.5 其他技术诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP 或 POP)、通过 JMS 队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。实际上,对于原型开发这种方法工作得很好,但如果试图部署以这种方式运行的服务器应用程序,那么这种方法的严重不足就很明显。每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。3 网络聊天系统的分析与设计3.1 可行性分析计算机技术的快速发展,特别是计算机网络的发展,越来越深刻的改变了人们生活的方方面面。使得人们能以更低廉的价格,开发出更方便、更实用的网络工具。各种在线服务系统,更是深刻的影响了人们的联系和交流方式,使得人们可以自傲远隔千里之遥随时通讯。过去的种种陈旧的联系方式,已经不能满足现代生活的需要。网上聊天系统作为一种方便人们之间联系的使用系统便应运而生。网上聊天系统是人们进行交流和联系提供的一个平台。通过提供完善的网上聊天系统的管理,可以达到增进人与人之间的交流和沟通。在Internet上,qq,MSN,飞信等网上软件,极大程度方便了各地友人之间的联系,也使世界一下子缩小了,不管你在哪里,只要你上了网,打开这些软件,就可以给你的朋友发信息。现在,企业,机关,学校都纷纷建立起自己的局域网。在局域网里,虽然可以通过文件共享的方式进行通讯吗,但单单使用这种方式,是不方便的。首先在局域网里的网上邻居,只能看到机器名,不清楚对方是谁,也不知道对方机器有什么资源可以共享,而且当局域网机器很多时,这种方式更加麻烦。现在有很多局域网内机器不使用服务器通讯软件,这种软件小巧而且轻便,也能解决一部分问题。但是有服务器通讯的软件,有着不可比拟的优势;可以发送离线信息,不管用户当时是否在线,下线上线时,就可以看到这条信息了;可以保存用户的个人信息或介绍,供人查看。而且,不适用服务器的通讯软件,是以机器为通讯单元的,而有服务器的通讯软件是以人为通讯单元的。总之,有服务器的通讯软件在局域网上,还是有很大的用途的,喂局域网上通讯,带来极大地方便。3.2 需求分析使用JAVA及数据库技术相结合,编写一个聊天系统软件。这个系统提供多个用户及时并发通信的平台。未注册用户可以注册成系统会员,已注册用户可以通过登录进入聊天系统。在系统中用户可以选择进入某一个聊天分区去聊天,也可以与特定的用户聊天。 提供一个在线实时沟通平台。进入系统的用户可以选择自己的聊天对象。用户没有专业的计算机知识,所以需要一个友好简单的界面。用户有娱乐需要,所以需要提供娱乐节点。用户通过软件进行沟通,应提供多种方式,如网络视频,音频聊天等。要求可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。具有宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。3.3 系统总体设计 根据网络应用程序的特点,网络在线聊天系统应就有即时,快速的特点。服务器端和客户端应就有不同的功能特性。对于服务器端应能够正确地建立与客户端的连接并能正确地断开,能即时地接收、处理和发送接收到的数据。能及时地通知在线用户当前好友在线状况,能够处理非正常数据的能力。对于客户端应能够快速地检查是否能够连接到服务器端。能正确的获得和反映当前好友在线情况。能够正确的与特定好友交流。能及时地接收到服务器端地数据,并能即时处理数据,并能将处理结果反映给用户。服务器端能够正确地、无冲突地启动服务器。监听指定的端口,等待用户的连接。 建立与客户端的逻辑连接,并能通知其他好友。 向新进入的好友发出已上线的好友名单。接收客户端的消息请求,并能正确无误地处理消息,并能发出消息到客户端。反映当前在线人数和在线好友状况。及时地反映发出地消息和聊天消息。当好友断开与服务器端地连接时,服务器能够正确地断开连接,并通知其他用户。当用户违反聊天系统规定时,服务器系统管理员能够断开与此用户的连接。当服务器关闭时,应通知所有用户。客户端能够正确启动应用程序,并能向服务器发出连接请求。反映当前好友在线情况。能够向群体或指定好友发出消息能够及时接收好友发出消息,并通知用户。能够正确地断开与服务器端地的连接。3.3.1 系统架构模型 系统的整体结构如图所示,包含了主界面,注册模块,登陆模块,私聊模块,群聊模块,首先要在注册模块完成注册,然后进入登陆模块登入才能进入主界面,主界面是一个选择可以选择进入私聊模块还是群聊模块。3.3.2 功能模块设计登陆模块,需要完成登陆界面,和登陆会话的维持。注册模块,需要完成向数据库插入用户数据然后进行重复性检查。私聊模块,构建两个套接字的连接方式,完成单独的连接。群聊模块,构建一个广播室,所有套接字的发送都回转发到该广播室内的其他套接字当中。3.3.3 系统通信设计客户端主要通过套接字请求发送对方的ID给服务器,服务器在数据库当中确认该用户在线就把对应的用户地址返回给客户端,这个时候客户端就可以主动去连接对应的用户,用户在收到连接请求以后需要确认该请求来自服务器分发的任务,经过验证以后就可以去和客户端建立起套接字的连接。该过程的主体是客户端到服务器的请求,需要遵循预先定义好的协议进行请求,比如发送指令“get userid a”给服务器,并且带上身份验证,也就是密码的加密信息给服务器,服务器进行验证以后就可以在数据库当中查找到对应的客户信心并且把a的信息返回给客户端,这个时候客户端就能够主动发起和a的连接,而不再需要经过服务器的确认了,其中有一个问题就是如果中途因为网络原因断线的话,需要重新请求服务器获取用户的在线状态,这样就能完成短线的重连。当然客户端的直接连接并不是完全没有防御的,必须对被动连接的源进行验证以后才能允许对应的套接字进行连接,比如运用私有协议,或者自定义的加密方式等等,这些手段在端到端上可以起到加密的作用。最后聊天的内容按照自定义的格式,以0xEEFF开头然后紧跟一个时间戳,表示消息发送的时间。3.3.4 数据库设计表3.1user的结构字段名数据类型长度主键否描述id自动编号是自动编号password文本50否密码profile文本256否简介time日期/时间否活跃时间表3.2message的结构字段名数据类型长度主键否描述id文本是发送者dst文本是接受者time日期/时间是发表时间用户表是一个用户注册表,每有一个用户注册,表中就会添加一项,修改密码则对应的是字段的更新。另外消息表是一个消息历史记录的表,每次发送消息的时候都会更新这个表,首先id是指发送着的id,而dst指的是接受者的id,时间以发送方发出消息的时间为准,消息目前只支持文字,不支持其他格式例如图片的信息。4 网络聊天系统详细设计及实现4.1 服务器端设计与实现服务端主要实现的是TCP连接的管理,当有一个消息到的时候需要转发给对应的客户端,这里定义了几个事件,首先是连接,断开,和发送,对于连接事件,确定对应的用户在线,对于断开事件则是把对应用户从在线状态的列表中去除,对于发送事件,确认发送方和接收方同时在线,则把消息发送到接收方。服务器会对逻辑进行处理。图 4.1 消息的状态转换图 4.2 服务器的主流程服务器首先会处理请求,然后用户列表会进行更新,始终保持该列表和在线的用户同步,对于需要转发的请求,发送给对应的接收方,目前的设计是一个单点设计,所有的请求都要经过服务器的转发才能到达接收方,最后达到聊天的目的。4.1.1 服务器等待连接进程/线程设计图4.3 监听线程处理逻辑首先,服务器开启监听线程,当有消息到达的时候就复制处理线程,然后重新进行监听,从而到达并发处理请求的目的。 服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现, 服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。 获得连接,当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。交换数据,服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。这就是服务器端编程的模型,只是TCP方式是需要建立连接的,对于服务器端的压力比较大,而UDP是不需要建立连接的,对于服务器端的压力比较小罢了。4.1.2 服务器处理客户端信息进程/线程设计我们应该充分利用多核的优势,这会是日后的发展方向。让每个进程要么处理大流量小计算量的工作;要么处理小流量大计算量的工作。这样多个进程放在一台物理机器上可以更加充分的利用机器的资源。单线程多进程的设计,个人认为更能发挥多核的优势。这是因为没有了锁,每个线程都可以以最大吞吐量工作。增加的负担只是进程间的数据复制,在网游这种复杂逻辑的系统中,一般不会比逻辑计算更早成为瓶颈。如果担心,单线程没有利用多核计算的优势,不妨考虑以下的例子:计算 a/b+c/d+e/f ,如果我们在一个进程中开三条线程利用三个核同时计算 a/b c/d e/f 固然不错,但它增加了程序设计的复杂度。而换个思路,做成三个进程,第一个只算 a/b 把结果交给第二个进程去算 c/d 于之的和,再交个第三个进程算 e/f 。对于单次运算来算,虽然成本增加了。它需要做额外的进程间通讯复制中间结果。但,如果我们有大量连续的这样的计算要做,整体的吞吐量却增加了。因为在算某次的 a/b 的时候,前一次的 c/d 可能在另一个核中并行计算着。4.2 客户端设计与实现4.2.1 登陆模块登陆模块的实现过程有下面几个步骤:(1)获取用户名,用户选择的头像,服务器的IP地址和端口号的信息;(2)确认登陆后初始化,创建套接字,连接服务器,向服务器发送用户登陆信息,使其他在线用户得到本用户上线的消息;(3)初始化过程中显示在线好友,并且对用户的好友上、下线进行管理。4.2.2 主界面模块整个程序是以服务器与客户端之间的通信事件而驱动的,本程序划分为三大模块,但最基础的都是得到服务器传来的消息,对消息进行判别再分别交给不同模块进行处理。本设计的接收消息过程很抽象,笔者在对设计详述之前首先将客户端接收消息的过程提纯出来,其示意图如图4.1所示。事先已对套接字和端口进行过绑定,一旦端口有数据来到,就会触发CMainSocket对象的CMainSocket:OnReceive()函数。OnReceive()函数中调用的Receive()函数就可以得到端口进来的以Message结构体封装的消息。再将Message的内容作为WM_RECEIVEMESSAGE的WPARAM参数发送。WM_RECEIVEMESSAGE为自定义的消息,CMyQQClientDlg的OnReceiveMessage()为此消息对应的消息处理函数。OnReceiveMessage()函数处理从wParam参数中传送来的以Message结构体封装的消息内容,针对不同的消息类型进行不同的处理。在以下的每个模块中,会将OnReceiveMessage()函数进行分解,各模块只针对自己的部分进行处理。图4.4 接收消息过程管理模块流程图如图4.5所示。管理模块的功能实现最主要由CLoginLoad 、CMyQQClientDlg两个类来实现。在下文介绍具体功能时,会对两个对话框控件进行分析。图4.5 管理模块流程图CLoginLoad :CLoginLoad是用户登陆的对话框,基于CDialog类。CloginLoad的登录对话框的界面如图4-3所示。其主要功能是获取用户名、用户选择的头像等信息,并且填写服务器IP与端口号。此对话框主要有两个按钮,登陆按钮和退出按钮。用户输入昵称和密码后可按登陆按钮,如不想登陆按退出按钮退出程序。图4.6 CLoginLoad用户登陆界面CMyQQClientDlg:CMyQQClientDlg是用户登陆后显示好友列表的对话框,基于CDialog类,CMyQQClientDlg也是本程序最核心的对话框。此对话框只响应用户双击图标的事件,双击后,创建聊天对话框,然后开始进行聊天。CMyQQClientDlg对话框的界面如图4.7所示。图4.7 CMyQQClientDlg好友列表对话框4.2.3 私聊模块发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)用户选择一个好友为聊天对象;(2)识别是否已经与此好友处于聊天状态(有对应的聊天对话框打开),已处于聊天状态的,将该对话框显示到前台,未处于聊天状态的,创建一个新的对话框;(3)用户按下发送按钮后,将聊天内容发送出去(服务器接收);(4)在本地即时聊天内容显示的编辑框中添加发送的内容。2. 接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)判断接收到信息的类型,是否为好友发来信息;(2)若该好友第一次发送信息(没有与此好友聊天的对话框),提示用户有新的消息;(3)用户按下查看消息的提示后,创建新的对话框,加到对话框链表中并显示该对话框,如果已经和此好友处于聊天状态,直接将对应对话框调到前台;(4)在对应的对话框中显示传递过来的消息。图4.8 CchatDialog用户聊天对话框聊天模块主要由CChatDialog、CChatAction两个类来实现。CChatDialog:CChatDialog是与好友进行聊天的对话框,基于CDialog类。CChatDialog共有两个Button控件和两个RichEdit控件。第一个RichEdit用于显示聊天记录,即双方对话的内容,第二个RichEdit用于用户输入消息。发送按钮响应用户的发送请求,即用户在输入消息后按下按钮,程序即将RichEdit的内容发送给服务器。查看聊天记录是用于响应用户查看聊天记录的请求。此部分内容在聊天记录的管理模块中详述。CChatDialog的界面如图4.8所示。CChatAction:CChatAction是用于提醒用户有新消息的提示对话框,基于CDialog类。CChatAction有一个Static Text控件和一个Button按钮。Static Text的静态文本框用于显示“您有一条新消息,请注意查收”的提示信息。Butoon用于响应用户查看新消息的事件。CChatAction的界面如图4.9所示。图4.9 CChatAction对话框基于CSocket类的CMainSocket类中,定义了类型为 CObArray 的m_ChatDlgs成员变量,m_ChatDlgs对所有创建好的聊天对话框进行了管理。是本论文设计的聊天程序中应用到的核心的技术。聊天事件的产生有两种可能性,一是用户自身主动向好友发出聊天请求,二是好友向用户发出聊天请求,用户接受请求。两种事件中,无论是哪种形式,只要聊天事件开始,程序就为用户创建一个新的类型为CChatDialog的聊天对话框,对话框以m_ClientName和m_UserName为标识(因为聊天事件是两方之间的对话,只要双方都确定下来了,就能确定此聊天事件)。再将新建的聊天对话框加入到链表中。对于信息的传送,聊天记录的查看等过程中,都需要对m_ChatDlgs的链表进行操作。m_ChatDlgs与CChatDialog的关系如图4.10所示。在CMainSocket类中,改写了CSocket的OnReceive()函数,一旦有消息进入端口,就会触发OnReceive()函数,在OnReceive()内部调用Receive()函数,就得到了信息的内容。之后可以对消息进行一系列的处理。本设计中自定义了WM_RECEIVEMESSAGE的消息,作为端口得到消息的提示,用SendMessage()将WM_RECEIVEMESSAGE消息发送出,并在程序中添加对应得消息响应函数,来处理端口得到的消息。消息随着WM_RECEIVEMESSAGE的WPARAM流动。图4.10 m_ChatDlgs与CChatDialog的关系发送信息的主要流程如图4.11所示。图4.11 发送信息流程图4.2.4 聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)用户请求查看聊天记录,向服务器发送请求;(2)服务器向用户发送对应的聊天记录,客户端接收信息,识别发送的信息为聊天记录;(3)显示聊天记录;(4)如果用户按下保存聊天记录按钮,则保存聊天记录。用户在进行聊天的过程中,可能会按下“查看聊天记录”的按钮,聊天只关系到用户双方,默认为用户想查看的聊天记录为自己和正在对话的另一方的内容。所以服务器端在进行数据库的查找时,也是以聊天双方的姓名匹配为查找条件的。聊天记录管理模块流程图如图4.12所示。图4.12 聊天记录管理模块聊天记录管理模块中最主要涉及到一个类CReadSession,该类是用于用户请求查看聊天记录后,用于显示聊天记录的对话框。该对话框基于CDialog类。主要有一个Button控件,用于保存聊天记录。该对话框如图4-12所示。图4.13 聊天记录对话框5 测试5.1 软件测试概述 软件测试是这样的一个过程,它执行一个程序或一个系统,目的是发现错误。或者,它包括这样一些活动,只要这些活动是评价一个程序(或系统)的属性和能力、以决定程序或系统是否满足了要求。软件和物理加工不一样,物理加工接受了输入,就产生输出。软件不一样的地方在于它的失效方式不同。绝大部分物理系统以固定(通常比较少)的方式失效。然而,软件却有多种奇异的失效方式。检测所有的失效模式,通常是行不通的。和大多数物理系统不同,软件中的大部分缺陷是设计的错误,不是制造上的缺陷。软件不会用坏,也不会磨损一般地说,若不升级和退市,它就不会改变。所以,软件一旦发布了,设计上的缺陷或者叫就会埋入到软件之中并一直留在那里,直到有一天它会被触发而发作。在一个中等大小的软件模块里,软件的bugs几乎总是存在的。这不是因为程序员的粗心和不负责任,而是因为软件的复杂性通常是不可处理的,人管理复杂性的能力是有限的。还有一点,对应复杂系统,设计的缺陷是不可能根除的。同样由于复杂性,发现软件中设计的缺陷也是很困难的。因为软件和任何数字系统不是连续的,测试边界值对保证其正确性是不够的。所有可能的值都需要测试和验证,但是完全的测试是不可行的。对于一个简单不过的小程序,两个32位的整数相加,会有2的64次方个测试用例,即使每秒钟测试几千个用例,完全测试这个小程序也需要几百年。很显然,对于一个实际的软件模块,其复杂性远远超过刚才举的那个例子。如果输入来自真实世界,问题将变得更加糟糕,因为时间和不可预测的环境因素,以及人的交互,都有可能被考虑成为输入参数。程序的动态性使问题更加复杂。如果在初步测试中发现了一个失效,给代码做了修改,软件可能现在通过了一个原来不能通过的测试用例。但是原来通过的测试用例现在不能再保证通过了。考虑到这种可能性,测试应该重新开始。可测试的费用成本可是有限制的。 5.2 测试策略与结果分析针对本软件项目制定测试计划。1.登陆功能输入条件编号有效等价类编号无效等价类输入昵称1杨颖or许野or王元杰4NULL输入服务器IP2127.0.0.1 or 服务器主机IP地址5NULL6非127.0.0.1 and 非服务器主机IP地址点击确定按钮按钮3单击确定按钮7未单击确定按钮8单机取消按钮测试用例用例编号用例预期输出覆盖等价类输入结果1昵称:杨颖服务器IP:127.0.0.1单击确定按钮登陆成功跳转至主界面1,2,3输入昵称:杨颖输入服务器IP:127.0.0.1单击确定按钮正确2昵称:服务器IP:127.0.0.1单击确定按钮提示连接服务器失败,再试一次?4输入昵称:输入服务器IP:127.0.0.1单击确定按钮不正确3昵称:杨颖服务器IP:单击确定按钮提示连接服务器失败,再试一次?5输入昵称:杨颖输入服务器IP:单击确定按钮不正确4昵称:杨颖服务器IP:128.0.0.1单击确定按钮提示连接服务器失败,再试一次?6输入昵称:杨颖输入服务器IP:128.0.0.1单击确定按钮不正确5昵称:杨颖服务器IP:127.0.0.17输入昵称:杨颖输入服务器IP:127.0.0.1不正确6昵称:服务器IP:127.0.0.1单击取消按钮回到上一界面8输入昵称:杨颖输入服务器IP:127.0.0.1单击取消按钮不正确2.选择聊天方式输入条件编号有效等价类编号无效等价类选择聊天方式1选择私聊3无操作2选择群聊测试用例用例编号用例预期输出覆盖等价类输入结果1选择私聊选择成功跳转至私聊界面1单击私聊按钮正确2选择群聊选择成功跳转至群聊界面2单击群聊按钮正确3无操作依旧停留在主界面3无不正确3.选择聊天对象输入条件编号有效等价类编号无效等价类选择聊天 对象1选择用户3无操作2直接在输入框打字测试用例用例编号用例预期输出覆盖等价类输入结果1选择某一用户用户选择成功跳转至该用户私聊界面1双击击相应用户正确2在输入框打字信息显示在公屏上2双击相应群正确3无操作依旧停留在上一界面3无不正确4.开始聊天输入条件编号有效等价类编号无效等价类输入信息1输入相应的信息或文字3未输入任何东西发送按钮2点击发送按钮4未按下发送按钮测试用例用例编号用例预期输出覆盖等价类输入结果1信息:123单击按钮信息123发送至对方1,2,输入信息:123单击按钮正确2信息:123未单击按钮发送失败4输入信息:123未单击按钮不正确3信息:空单击按钮发送失败3输入信息:空单击按钮不正确4信息:空未单击按钮发送失败3,4输