摘 要
随着Internet技术的飞速发展,网络已经成为人们生活中不可缺少的一部分,通过聊天室在线聊天已成为网络上人与人之间沟通、交流和联系的一种方式。
为此,越来越多的网站开始提供在线聊天的功能。与此同时,聊天室也以其方便、快捷、低成本等优势受到众多企业的青睐,很多企业的网站中也加入了聊天室模块,以达到增进企业与消费者之间、消费者与消费者之间相互交流的目的。
本文是软件工程在线聊天室系统的开发说明,重点运用软件工程知识对系统进行分析、设计实现和测试的思想的具体描述,其中包括软件生命周期的三个主要方面:软件定义(问题定义、可行性研究、需求分析)、软件开发(总体设计、详细设计、编码、测试)和运行维护。通过实际的运用软件工程知识处理问题,加强程序的规范性、清晰性、可靠性,并且使得程序易于维护。本软件使用JAVA进行编写,具有良好的兼容性且易于实现。聊天室操作简洁容易上手、结构简单、查找方便、实用性强。
关键字:网络、通信、套接字、连接
1
目录
序言....................................................3 第一章 VisualC++及Socket套接字介绍.....................5 一 VisualC++ 介绍...................................5 二 Socket套接字介绍.................................6
第二章 软件需求分析.....................................15 一 系统客户要求.....................................15 二 系统详细设计.....................................16
三 系统开发目标.....................................17 四 系统开发思路.....................................17 五 需求总结.........................................18 第三章 系统具体实现....................................21 一 概要设计..........................................21 二 定义服务器端和客户端的通信结构及含义..............22 三 服务器端的实现流图................................25
四 客户端的实现流图..................................28 第四章 系统测试 .....................................30 第五章 系统运行和维护.................................32 第六章 结束语.........................................33 参考文献...............................................34
2
序 言
随着现代技术的不断输入和信息化的广泛普及,网络作为一种新兴事物,在近些年得到了前所未有的普及和深入,网络上的各种应用层出不穷,给各个阶层、各个年龄段的用户提供了不同的个性化的服务。而现代中小型企业的领导认识到进一步提高企业信息化的必要性。为使企业能在瞬息万变的信息时代生存下去,适应激烈的市场竞争,现代企业要求正加员工之间的交流和通信能力,尤其是领导和员工之间的共同能力,实时的交流系统就是在这种条件下诞生的。系统开发是一个十分复杂的系统工程。这里对系统开发的基本过程和方法进行介绍,列出相关文档的示例并加以说明。
要提高市场竞争力,就要对市场作充分的调查和详细的研究,同时也要有好的客户服务。企业要在复杂的环境下作出对策。员工与员工 员工与领导间的即时交流尤为重要,网络在线聊天系统对于企业来说就是一种交流和通信的平台,本系统能够成为中小型企业的交流通信的理想平台。如能做到信息的及时的反馈,即时的处理并作出相应的行动,将能进一步提高中小型企业在现代经济市场的竞争能力。
网络通信是网络应用的重要体现方面。网上即时通信则是网络应用的重要体现方面。本聊天系统主要应用于小型企业,学校或小型局域网内部使用。本应用程序使短距离交流更加快捷和便利。更能高效率的体现现代即时通信的特点。
本系统能够满足中小型企业,学校的内部网络即时通信的需要,在内部网络正常环境的运营下,提供即时通信的能力,本系统使用Visual
3
C++开发,本系统能够为中小型企业协同工作,相互间的交流提供了有力的工具,运用在局域网的本系统,能够为企业员工的交流提供帮助,有利于提高工作效率。
4
第一章 VisualC++及Socket套接字介绍
一 Visual C++ 介绍
和其他编程工具相比,Visual C++在提供可视化编程方法的同时,适应于编写直接对系统进行底层操作的程序.其生成代码的质量,也要优于许多其他开发工具.
Visual C++所提供的
MFC(Microsoft
基本类库),对
Window98/NT/2000所用的Win32 API(应用程序接口)进行了彻底的封装,这使得可以使用完全的面向对象的编程方法来进行Windows程序的开发,并能够大大缩短程序的开发周期,降低开发成本,把Windows程序员从大量复杂的劳动中解放出来.
Visual C++给应用程序的开发人员提供了丰富的功能,Visual C++通过MFC库提供了一个完整的应用程序的骨架,开发人员可以忽略应用程序的入口点和结束地点,并且可以忽略消息在应用程序的流动顺序,通过MFC的支持Visual C++也提供了Document-View(文档视图)的应用程序的结构,开发人员可以将数据保存在Document类的对象上,而在屏幕的显示的数据由View类的对象来负责。通过MFC的支持Visual C++也实现了面向对象领域的RTTI(RunTime Type Information 运行时类型识别)、Dynamic Creation(动态创建)、(Persitence)永久保存机制,同时他也实现了Windows下的Message Mapping(消息映射)和Command Routing(命令传递),通过MFC的Cdatabase和Crecordset类Visual C++可以实现数据库的应用,通过ChtmlStream、CHttpFilter、CHttpFilterContext、ChttpServer等ISAPI(Internet Server API)可
5
以很好的支持Internet上的http协议相关的操作。由于MFC涉及到应用程序开发的各个领域,其Visual C++成为倍受欢迎的开发工具。
二 Socket套接字介绍
Winsock是一套开放的,支持多种协议的Windows下网络编程接口,是Windows网络编程实是上的标准.应用程序通过调用Winsock的API实现相互间的通信,而Winsock利用下层的网络通信协议功能和操作系统调用实现实际的通信工作.
1 套接字(Sockets)
套接字是通信的基石,是支持TCP/IP协议的网络通信的操作单元.可以将套接字看作不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面.套接字存在于通信域中.通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念.套接字通过通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序).Winsock规范支持单一的通信域,即Internet域.各种进程使用这个域互相之间用Internet协议簇来进行通信(Winsock 1.1以上的版本支持其他的域)。
套接字可以根据通信性质分类,这种性质对于用户时可见的.应用程序一般仅在同一类的套接字间通信.不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信
进入九十年代后,随着计算机和网络技术的发展,很多数据处理系统都采用开放系统结构的客户机/服务器网络模式,即客户机提出任务请求,通过网络发送给服务器,由服务器做相应处理,执行被请求的任务,
6
然后将结果返回给客户机。例如:银行ATM的前置机和数据处理的主机之间即构成客户机/服务器网络模式;电话银行的前置机和银行数据处理机之间也构成这种网络模式结构等。这样,如何在前置机和数据主机之间进行信息交换,即进程网络通信,就成为实现这种网络模式的基础。而TCP/IP的套接字技术是解这一问题的有力工具。它从提出时就一直发挥着愈来愈重要的作用,并已成为UNIX操作系统下TCP/IP网络编程标准;甚至WINDOW、JAVA都配有它的通用接口。有了这个强有力的工具,我们可以实现异种机、异种操作系统应用程序间的相互连接和通信。套接字(sockets)是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。它构成了在单个主机内及整个网际间的编程界面。一般来说,跨机应用进程之间要在网络环境下进行通信,必须要在网络的每一端都要建立一个套接字,两个套接字之间是可以建立连接的,也是可以无连接的,并通过对套接字的“读”、“写”操作实现网络通信功能。类似于UNIX系统中的I/O概念,像文件那样有打开、读、写、关闭的方式。根据传输数据类型的不同,套按字可分为面向连接的数据套接字(streamsockets)和无连接的数据报套接字(datagramsockets)两种类型:
(1)字节流套接字
字节流不按记录定界,在TCP/IP协议簇中对应TCP协议,即传输控制协议(TransmitionControlProtocol)。它是一个提供给用户进程可靠的全双工的面向连接的协议,大多数INTERNET应用程序如ftp、telnet使用TCP协议。通信端点使用TCP对应的INTERNET地址互相连接,可保
7
证按正确的顺序以及单一和可靠的地址传输数据。由于它是字节流,所以包长包没有限制,信包传输也不重复,因而是一种常用的套接字类型。
流套接字提供双向的,有序的,无重复并且无记录边界的数据流服务,它适应于处理大量数据.网络传输层可以将数据分散或集中到合适尺寸的数据包中。
流套接字是面向连接的,通信双方进行数据交换之前,必须建立一条路径,这样即确定了它们之间存在的路径,又保证了双方都是活动的,可彼此相应的,但在通信双方之间建立一个通信信道需要很多开支.除此以外,大部分面向连接的协议为保证发送无误,可能会需要执行额外的计算机来验证正确性,为此会进一步增加开支。
(2)数据报套接字
数据报对应记录型数据流,在TCP/IP协议簇中对应UDP协议,即用户数据报协议(UserDatagramProtocol)。利用数据报服务可实现一些简单的网络服务,如网点检测程序PING。由于不建立连接,数据报协议比连接协议快。但不能保证所有数据都准确有序地到达目的地。不保证顺序性、可靠性和无重复性。它是无连接的服务,以独立的信包进行传输,通信端点使用UDP对应的INTERNET地址。双方不需互连,按固定的最大长度进行传输,因而适用于单个报文传输,或较小文件的传输。
数据报套接字支持双向的数据流,但不保证数据传输的可靠性,有序性,和无重复性.也就是说,一个从数据报套接字接受信息的进程有可能发现信息重复,或者和发出时间顺序不同的情况.此外,数据报套接字的一个重要特点是它保留了记录边界。
8
数据报套接字是无连接的,它不保证接受端是否在监听,类似邮政服务:发信人把信装入邮箱即可,至于收信人是否收到这封信或邮局是否会因为暴风雨未能按时将信件投入收信人处等等,发信人都不得而知.因此,数据报并不十分可靠,需有程序员负责管理数据的排序和可靠性)。 2套接字的编程要点及过程
不论何种套接字编程,均采用客户机/服务器方式,其运作过程基本类似,限于篇幅,这里仅介绍字节流套接字。字节流套按字的服务进程和客户进程,在通信前必须创建各自的套接字以建立连接,然后对相应的套接字进行“读”、“写”操作,实现信息的交换。服务器进程创建套接字。服务进程总是先于客户进程启动,服务进程首先调用socket()函数创建自已端的一个字节流套接字,并提供三个参数:网络地址类型,一般取AF_INEF(AdressfamilyInterNET);套接字类型,这里取SOCK_STREAM;网络协议,缺省为TCP/IP协议,对应参数为0。给套接字地址变量赋初值。在生成套接字后,要用服务器的地址先对sockaddr_in结构变量赋初值。sockaddr_in它只适用INTERNET地址类型,含有INTERNET套接字地址类型、IP端口号、IP地址等信息。地址类型可取定为AF_INET,IP地址对服务器可取任意合法地址INADDR_ANY。IP端口号可由用户设定,但要注意主机字节顺序向网络字节顺序的转换。给套接字命名。由socket()函数创建的套接字是没有名字的。所谓命名,就是用bind()函数将服务器地址捆绑到创建的套接字上。服务器进程准备接受来自客户机的连接请求。首先调用listen()函数,让服务器进程进入监听状态;然后调用accept()函数,准备接受客户机的连接信号。无连
9
接请求时,服务进程被阻塞。客户进程调用socket()函数创建已端的套接字。给客户端的sockaddr_in结构体变量赋值。地址类型仍可取AF_INET,端口号和服务器方的端口号相同,欲连服务器的地址通过调用inet_addr()转换得到。也可通过gethostbyname()函数将名字转换为指向hostent结构变量的指针,再将hostent结构变量的地址成员用bcopy()复制到sockaddr_in结构变量上。客户方调用connect()函数向服务进程发出连接请求。当连接请求到来后,被阻塞服务进程的accpet()函数生成一个新的字节流套接字,并返回客户机的sockaddr_in结构变量,从而在服务器应用程序中用新的被赋予客户机地址的套接字同客户进程进行连接,然后向客户方返回接受信号。一旦客户机的套接字收到来自服务器的接受信号,则表示客户机与服务器双方已实现连接。任一方均可向对方发送,也可接收对方发来的数据。这既可通过send()、recv()函数来实现。也可通过read()、write()函数来交换数据。服务进程和客户进程可通过调用shutdown()和colse()关闭套接字上的所有发送和接收操作,撤销套接字并中断连接
3 基本概念 (1)带外数据
带外数据,也称为TCP紧急数据,它是相连的每一对流套接字间的一个逻辑上独立的传输通道,带外数据是独立于普通数据传输给用户的,这一抽象要求带外数据设备必须支持每一时刻仅有一个带外数据信息等候发送。对于仅支持带外数据的通信协议来说(例如紧急数据是与普通数据在同一序列发送),系统通常把紧急数据从普通数据中分离出来单独存
10
放。这就允许用户可以在顺序接受紧急数据和非顺序接收紧急数据之间作出选择。 (2)广播
数据报套接字可以用来向许多系统支持的网络发送广播数据包。要实现这种功能,网络必须支持广播功能。为此系统软件并不提供对广播功能的任何模拟。广播信息将会给网络造成极重的负担,为此它们要求网络上的每台主机都为他们服务,所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接字中。广播通常应用于以下两种情况:
一个应用程序希望在本地网络中找到一个资源。而应用程序对该资源的地址又没有任何先验的知识。
一些重要功能,例如路由要求把它们的信息发送给所有可以找到的邻机。
被广播信息的目的地址取决于这一信息将在何种网络上广播。Internet域中支持一个速记地址-INADDR_BROADCAST用于广播。由于使用广播以前必须绑定一个数据包套接字,所以所有收到的广播消息都带有发送者的地址和端口。 (3)字节顺序
不同的计算机有时使用不同的字节顺序存储数据。例如,基于Intel处理器的计算机和Macintosh计算机使用了相反的字节排序顺序。Intel的字节顺序被成为“Little-Endian”,它与网络的字节排序顺序“Big-Endian”排序顺序相反。
任何从Winsock函数对IP地址和端口号的引用和传送给Winsock函
11
数的IP地址和端口号均是按照网络顺序组织的,这也包括了sockaddr_in这一数据结构中的IP地址域和端口域
考虑到一个应用程序通常用与“时间”服务对应的端口来和服务器连接,而服务器提供某些机制来通知用户使用另一端口。为此getservbyname函数返回的端口已经是网络顺序了,可以直接使用来组织成一个地址,而不需要进行转换。然而如果从主机顺序转换成网络顺序。相应地,如果应用程序希望显示包含于某一地址中地端口号,则这一端口号就必须在被显示前从网络顺序转换到主机顺序。 (4)阻塞和非阻塞
套接字可以处于阻塞模式或非阻塞模式。调用任何一个阻塞模式地函数,都回产生相同地后果-耗费或长或短地时间等待操作地完成。而当套接字处于非阻塞模式时,API函数的调用会立即返回,大多数情况这些调用都回“失败”,并返回一个WASEWOULDBLOCK的错误,它意味着请求的操作在调用期间没有时间完成。Winsock的套接字I/O模型可以帮助应用程序判断一个套接字何时可供读写.
套接字的行为在Windows 9X 和Windows NT中与在 Windows 3.1中不同.在32位操作系统中,可以采用多线程编程,在不同的线程中使用套接字,这样即使某个线程中的套接字被阻塞,也不会影响应用程序的其他操作,同时也不会在阻塞线程上耗费CPU时间。 (5) Winsock编程原理
进入20世纪90年代后,随着计算机和网络技术的发展,很多数据处理系统都采用开放系统结构的客户机/服务器(Client/Server)网络模型,
12
即客户机向服务器提交请求,服务器对请求做相应的处理兵执行被请求的任务,然后将结构返回给客户机。这种方式隐含了在建立客户机/服务器间通信是的非对称性。
客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受),这一套惯例包含了一套协议,它必须在通信的两头都被实现。根据不同的实际情况,协议可能是对称的或非对称的。在对称的协议中每一方都有可能扮演主从角色;在非对称协议中一方被不可改变地认为是主机,而另一方则是从机。一个对称协议地例子是Internet中用于终端仿真地Telnet,而非对称协议地例子是Internet中的http。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在客户进程和服务进程。
一个服务程序通常在一个众所周知地地址监听客户对服务地请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务地址提出连接请求。在这个时刻,服务程序被“惊醒”并且为客户提供服务-对客户地请求作出适当的反应。这一请求/响应的过程可以简单地用以下图表表示,虽然基于连接地服务器应用程序时的标准,但有时服务也可以通过数据报套接字提供。 (6) MFC Windows Socket类
Visual C++对众多的socket函数进行了封装,MFC提供的封装类是:CAsyncSocket和CSocket类,它们使编程工作变得相对简单尤其是CSocket类:
CAsyncSocket类所提供的唯一的抽象就是将与套接字相联系的
13
Windows消息以回调函数的形式表示,因此它带来的唯一方便就是程序员无需自行处理Winsock的I/O模型,而对于如阻塞处理、字节顺序差异以及Unicode等依然负有责任并有灵活的控制权。
CSocket类是CAsyncSocket类的派生类,它提供了对通过Carchive对象使用套接字工作的更高级抽象。CSocket类的使用比CAsynCSocket类更加容易,它继承了CAsyncSocket类的许多封装了API的成员函数,并且管理了通信的大多数方面,这使得用户从原来不得不使用原始API或者CAsyncSocket类的烦杂的工作中解脱出来。更加重要的是CSocket和Carchive类提供了对于同步操作Carchive对象十分重要的阻塞功能,且CSocket通过与CSocketFile和Carchive一起使用来管理对象数据的发送和接收,使发送数据和操作变得简单明了。以下使CSocket对象与串行化技术及CSocket类的编程模型。
14
第二章 软件需求分析
一 系统客户要求
需求分析是软件分析中的一个重要步骤。它的基本任务是要准确地分析出系统应用者的需要,以及系统目标必须具备哪些功能。这些功能必须准确地,完整地体现出用户的要求
根据网络应用程序的特点,网络在线聊天系统应就有即时,快速的特点。服务器端和客户端应就有不同的功能特性。对于服务器端应能够正确地建立与客户端的连接并能正确地断开,能即时地接收、处理和发送接收到的数据。能及时地通知在线用户当前好友在线状况,能够处理非正常数据的能力。对于客户端应能够快速地检查是否能够连接到服务器端。能正确的获得和反映当前好友在线情况。能够正确的与特定好友交流。能及时地接收到服务器端地数据,并能即时处理数据,并能将处理结果反映给用户。
服务器端:
能够正确地、无冲突地启动服务器。 监听指定的端口,等待用户的连接。
建立与客户端的逻辑连接,并能通知其他好友。 向新进入的好友发出已上线的好友名单。
接收客户端的消息请求,并能正确无误地处理消息,并能发出消息到客户端。
反映当前在线人数和在线好友状况。 及时地反映发出地消息和聊天消息。
15
当好友断开与服务器端地连接时,服务器能够正确地断开连接,并通知其他用户。
当用户违反聊天系统规定时,服务器系统管理员能够断开与此用户的连接。
当服务器关闭时,应通知所有用户。 客户端:
能够正确启动应用程序,并能向服务器发出连接请求。 反映当前好友在线情况。 能够向群体或指定好友发出消息
能够及时接收好友发出消息,并通知用户。 能够正确地断开与服务器端地的连接。
二 系统详细设计
对现行管理业务进行了详细调查研究,了解了系统需求和进行了系统分析与设计工作。对员工进行全面、细致而充分的调查研究和到生产和管理的现场去,并通过座谈、询问后,自上而下逐步细化的进行了了解,调查的内容涉及到企业的发展目标、经营管理情况,通过系统流程图中的部分图形工具来描述管理业务活动,进行规范化说明。流程图如下:
16
不存在同名,用户登陆到聊天室,等待好友消息或向好友发出消息 填写用户姓名 提交到服务器 用户运行客户端端应用程用户名存在,从新填写 三 系统开发目标
1 实时好友登陆 当好友登陆或离开聊天室,服务器端有能力通知所有其他在线用户。
2 收发消息同步 当一用户向其他的好友发出消息,发送接收端的用户应能及时接收到消息。
3 服务器关闭通知 当服务器因故障或维护需要暂时关闭,应有通知在线用户的能力。
4 隐私消息模式 当用户选择发送消息为私聊的模式。其他在线用户不能看到此条消息。
四 系统开发思路
尽量采用公司现有的硬件环境,及先进的管理系统开发方案,从而达到充分利用公司现有资源,提高系统开发水平和应用效果的目的。
17
1.
系统应符合员工日常的规定,满足公司日常工作需要,并达到操作过程中的直观、方便、实用、安全等要求。
2. 系统采用C/S模型。服务器端和客户端均使用Visual C++并使用Sockets模型开发实现
3. 系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充和维护。
五 需求的总结
首先,经过和用户的讨论将系统要实现的功能列出来。主要模块有登陆模块、连接模块 、发送消息模块和接收和处理模块。
其次,对软件的性能指标的需求。主要有人机界面交互反应时和运行时间限制在 2 秒之内,系统启动运行不超过 5 秒,占用内存不超过 20M,外存不超过 200M(不包括数据库部分) 。
然后,提出软件运行的环境需求。该公司的运行环境设置为:具有 1GB以上的cpu , 128MB的内存, 20GB硬盘规模的服务器和数台普通可连网微机;软件采用windows 2000(服务器)和windows 98以上作为系统和网络软件。该软件的使用对象是公司的管理人员,只要会用一般的微机操作即可。
从数据流和数据结构出发,逐步细化所有的软件功能,找出系统各元素之间的联系,接口特性和设计上的限制,分析它们是否满足功能要求,是否合理。
在该系统的分析和综合中,经过多次与用户的交流形成了如下所示的各功能模块图如下。
18
接收 连接请求 消息 接收传输数据消息 接收客户端退出消息 发出用户登陆成功消息 发出用户重名消息 发出 传输数据消息 发出好友名单消息 发出添加好友消息 发出好友离开消息 发出聊天室关闭消息 用户请求连接 在线聊天系统服务器端启接收消息 发出消息 服务器端系统功能模块图
19
客户端系统功能模块图
20
在线聊天系统服务器接收消息 发出消息 发出用户登陆成功消息 发出用户重名消息 发出 传输数据消息 发出好友名单消息 发出好友离开消息 发出聊天室关闭消息 接收 连接请求 消息 接收传输数据消息 接收客户端退出消息
第三章 系统具体实现
一 概要设计
根据调查和研究,得到系统所要处理的数据可流程,如图所示:
用户运行客户端端应用程
客户端数据流图
21
用户名存在,从新填写 填写用户姓名 提交到服务器 不存在同名,用户登陆到聊天室 接收服务器端的在线用户列表 发送消息给好友 接收好友消息 接收好友下线或登陆
服务器端正常启动 等待接收用户连接若消息为用户登陆,则查看是否后同名用户登陆 若有,这发出此用户已存在消息,否则,发送登陆成功消息,并发送在线好友名单, 并发送此用户名称给已在线用户 若消息为用户通讯消息,则转发给该接收的用户 若消息为用户退出消息,这断开连接,同时发送其他用户此用户退出消息 服务器端数据流图
二 定义服务器端和客户端的通信结构及含义
struct CMessage {
char m_strText[200]; char from[20]; char to[20]; int type; }
结构体的含义定义如下:
22
to[20]的含type定义 义 MSG_FIRST 用户请求建立连接 方向由客户端到服务器端 MSG_SUCCESS 建立连接成功 方向由服务器端到客户端 MSG_MESSAGE 好友间传输的消息 服务器和客户端双向 MSG_USER_ADD 添加好友名称消息 方向由服务器端到客户端
m_strText[20]含义 to[20]的含义 请求建立连接的好友名称 为空 为空 建立成功的好友名称 建立成功的好友名为空 称 发出消息的好友名称 默认接收消息好友聊天内容 名称 为空 添加的好友名称 为空 23
MSG_USER_REMOVE 好友离开时删除好友名称 方向由服务器到客户端 MSG_QUIT_CLIENT 客户端退出消息 退出的好友为空 方向又客户端到服务器端 MSG_QUIT_SERVER 客户端退出消息 为空 方向又服务器端到客户端 MSG_RENAME 通知用户此用户名已存在,应更改用户名再登陆 方向又服务器端到客户端
24
为空 删除地的好友名称 为空 为空 名称 为空 为空 存在重名的空 好友名称 空
三 服务器端具体实现
服务器端有个CSocket的派生类CListenSocket对象指针来监听端口等待用户登陆,而用另一个CSocket的派生类对象CClientSocket的指针组来处理和每一个客户端的交互过程。派生类 CListenSocket的回调函数OnAccpet()与客户端建立套接字层次的连接。派生类CClientSocket的回调函数OnReceive()与接收每一个已连接的数据传输。由于应用Visual C++的MFC编程,应体现View/Document体系结构,所以CListenSocket的OnAccpet和CClientSocket的OnReceive函数放到应用程序的Document的实现类实现,又由于服务器端是基于对话框的应用程序,所以以上两个函数的实际处理代码再工程的主体类CServerDlg的ProcessPendingAccept和ProcessPendingRead来处理 工程中的cpp文件及其包含的重要函数: ListenSocket.cpp:(CListenSocket的实现文件) OnAccept(int nErrorCode)
ClientSocket.cpp:(CClientSocket的实现文件) OnReceive(int nErrorCode)
ServerDlg.cpp:(CServerDlg的实现文件)
void InsertListAction(CMessage &msg,BOOL bDirection = FALSE);用于更新服务器端的消息列表。
void NotifyName(LPCTSTR lpszText, int i)用于更新服务器端的在线用户显示
void OnButtonKick()用于服务器端的管理员断开与指定用户的连接
25
void OnInitDialog()用于初始化主窗体对话框,并且建立套接字并绑定端口,和一些界面的初始化工作。
void ProcessPendingAccept()处理客户端和服务器端的连接工作。并将连接的套接字的对象指针保留到数组中。
void ProcessPendingRead()处理客户端发送到服务器端的数据。并对消息做一定的处理。
SendUserNameToClient(CClientSocket *pSocket,CMessage msg) 将用户名称发送到指定的套接字对应的用户 UpdateClients(CMessage mmsg, int nBufferSize) 将mmsg结构发送给所有用户,即模拟广播发送
CPtrList m_connectionList; 连接到客户端的套接字指针链表 CListenSocket * m_pSocket; 监听套接字的对象指针 int m_iConnNum;当前连接数
26
CServerDlg::OnInitDialog()
m_pSocket = new CListenSocket(this); 创建监听套接字 m_pSocket->Create(1213); 绑定本地的1213端口 m_pSocket->Listen(); 开始监听 客户端的请求连接 CListenSocket::OnAccpet() CServerDlg::ProcessPendAccept() 接收客户端包含的WM_FIRST请求 CServerDlg::ProcessPendRead() 分析包的内容,并查看是否存在同名用若不存在同名 构造包含MSG_SUCCESS的CMessage对象,调用CSocket::Send()通知用户已建立连接 若存在同名构造包含MSG_RENAME的CMessage对象,调用CSocket::Send(),通知存在重名 构造包含MSG_USER_ADD的CMessage对象,调用CSocket->Send(),发送给该用户已构造包含MSG_USER_ADD的CMessage对象,调用 CSocket->Send(),发送给其他用服务器端具体的建立连接的过程
27
触发退出聊天室退出事件 构造包含MSG_QUIT_SERVER的CMessage的对象,用UpdateClients来使所有连接的客户端都断开连接, 服务器退出并通知用户过程
构造包含MSG_USER_REMOVE的CMessage 对象,并调用UpdateClients()来通知当前在线好友好友离开 接收到的包的type为MSG_MESSAGE,则调用UpdateAllClients来通知所有用户 接收到的包的type为MSG_QUIT_CLIENT,则将此用户对应的套接字从套接字链表中删除,并断开连接 CClientSocket::OnReceive()调用CServerDlg::ProcessPendRead()来分析获得的包的内容 接收到数据包 服务器端接收到包含MSG_MESSAGE或MSG_QUIT_CLIENT消
息的处理过程
四 客户端的实现流图
28
启动应用程序 添加用户名称,调用CClientDlg::ConnectSocket 调用 CClientSocket的 Connect建立连接 发送包含WM_FIRST和用户名的 CMessage的对象 客户端的启动和尝试建立连接的过程
包的标志为MSG_SUCCESS,标记者进入聊天室成功 包的标志位位MSG_RENAME标记此用户名称已被使用, 包的标志位为MSG_MESSAGE,则处理好友的消息,并显示 CclientSocketDoc::ProcessPengingRead() 接收到数据包 CClientSocket::OnReceive() 包的标志位为MSG_USER_ADD,添加用户到好友列表 包的标志位为MSG_USER_REMOVE,则将好友名称从好友列表中删除 包的标志位为MSG_QUIT_SERVER,断开与服务器的连接,并通知用户 客户端接收到数据和处理过程
29
第四章 系统测试
一 系统验收测试
经过对系统的软、硬件的验收测试系统满足用户的要求。其中硬件测试主要包括硬件设备的清单、启动运行正常与否等。重点是软件部分的测试,首先对软件的功能进行测试,然后进行了全系统的72小时连续运行测试,系统稳定性强。
系统功能测试细则表 序号 测试项目 1 可登陆性 功能与指标 用户可以随时登陆,进入聊天室 可以发出消息给好友 用户能接收到其他好友发出的消息 在登陆状态下,能够接收上下线通知 测试方法 按界面提示输入名称 在消息框输入消息,并选择好友 当接受到数据时,在窗口显示 启动多个客户端,连接到服务器端,并退出 预期结果 出现主窗口和各个菜单项 好友收到消息, 结论 正确完 成 正确完 成 正确完 成 正确完 成 2 发出消息给好友 3 接收到消息 显示接收到的消息 4 登陆后的好友上线或下线通知 其他好友先显示上线,然后在下线 二 使用说明书
由于该软件的操作人员具有较高的计算机使用水平,能够在使用指导时学会操作和控制该软件,并根据帮助正确的操作。所以使用说明书省写。
三 交付使用
软件在开发编程过程中一直处在开发环境中,开发完后转换成运行环
30
境中的可执行的软件后,交付测试和使用。
首先,生成了一个安装盘,内容包括安装说明、软件实体等。其次,提供了用户手册。整体交付包括软件开发阶段的需求报告、总体设计报告(概要设计)、技术设计文档(详细设计)等。
31
第五章 系统运行与维护
一 系统试运行
系统测试后,并没有立即投入正式运行,而是经过了一段时间的试运行的考验,为保证用户正常工作先保留了原系统。 注意了以下几点:
(1) 在准工作模式下对新系统进行全负荷的实际测试,进一步发现系统 中存在的错误;同时,让操作人员对系统有了一定的认识,对操作的方便性数据项的合理性提出自己的意见。 (2) 新系统在准工作环境中不冒险。 (3) 同时对操作人员进行了培训。 (4) 验证使用手册的正确性。
二 运行与维护方法
软件交付使用后,不免存在bug,制定相应的软件运行维护手段和方法。对软件文档进行保管与补充,保留了开发环境建立维护手册。
32
第六章 结束语
结束语:
在指导教师的帮助下,及时完成了毕业论文和毕业设计。本次设计锻炼了实践能力,增长了我发现问题、解决问题的能力,大大丰富了自己的专业知识和技能。
由于各种原因,系统的功能还没有得到进一步的完善,系统存在一定的缺陷,如服务器端负担过重、没有实现可以插入图形功能。以后会继续努力,在今后的学习过程中,不断地提高自己
系统在交付使用后,用户基本满意,运行比较稳定。用户对界面设计给予了很多的好评,称其非常友好。对于操作性能给予好评。
33
参考文献:
[1] 齐治昌 《软件工程》 高等教育出版社 1997年7月 [2] 侯君杰 《深入浅出MFC》 华中科技大学 2001年2月 [3] 谢希仁 《计算机网络》 大连理工大学出版社 2000年6月 [4] 周金萍 《Windows系统编程》人民邮电出版社 2002年4月 [5] 王强 《Windows API for 2000/XP 实例精解》电子工业出版社 2002年8月 [6] 陈坚 《Visual C++ 网络高级编程》 人民邮电出版社 [7] 张海藩,软件工程导论(第5版),清华大学出版社,2008 [8] 李建刚等,JSP网络编程技术与实践,清华大学出版社,2008 [9] 汤一平,Java语言程序设计,科学出版社,2006 [10] 孙卫琴,java面向对象编程[M],电子工业出版社, 2006 2002年4月
34
因篇幅问题不能全部显示,请点此查看更多更全内容