毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc

上传人:西安人 文档编号:3281134 上传时间:2019-08-07 格式:DOC 页数:62 大小:565.04KB
返回 下载 相关 举报
毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc_第1页
第1页 / 共62页
毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc_第2页
第2页 / 共62页
毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc_第3页
第3页 / 共62页
毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc_第4页
第4页 / 共62页
毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-C++语言解决局域网聊天系统的设计与实现.doc(62页珍藏版)》请在三一文库上搜索。

1、 用VC+语言解决局域网聊天系统的设计与实现 第 62 页 共 62 页 目 录摘要IAbstractII1 引 言11.1 课题背景及意义:11.2 课题现状11.3 本文的主要工作:21.4开发平台与技术的选择及介绍21.4.1 开发环境的介绍21.4.2 WINDOWS SOCKETS网络编程接口概述31.4.3 VC+6.0开发平台简介32 需求分析及可行性研究32.1 需求分析:32.1.1 时间要求32.1.2 功能要求32.1.3 系统基本流程图42.1.4 性能要求42.1.5 测试环境规定42.2 可行性研究:43 相关开发技术的原理性说明53.1 win32编程原理及MFC

2、框架53.1.1 WIN32编程原理53.1.2 MFC框架63.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口83.2.1 TCP/IP协议简介83.2.2 WINDOWS SOCKETS网络编程接口概述103.3 多线程编程技术113.3.1 进程及线程概述113.3.2 Win32 API对多线程编程的支持124 总体设计134.1体系结构设计134.2 功能模块划分144.3 数据结构设计154.4 用户界面设计154.4.1 服务器端显示界面:154.4.2 客户端显示界面:165 详细设计及编码实现165.1 主框架及用户界面模块详细设计165.2 网络扫描模块

3、详细设185.3 信息发送模块详细设计185.4 信息接收模块详细设计206 测 试20结 论21致 谢22参考文献23摘要随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本文提出了一个更加合理的设计,并在WINDOWS平台上加以了实现.在本实现内将客户端和服务端综合在一个程序之内,用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理

4、,又易于扩展以及个性化定制。本文通过局域网聊天系统来具体共享内存实现进程间的数据交换,利用windows消息机制实现进程间的同步,两种机制结合使用。关键词:局域网;即时通信;客户端;服务端;多线程;共享内存;信息 AbstractAlong with the high-speed development of the computer network technology, various of applications based on network was born, like information releasing, data sharing . The development o

5、f the LAN is the same fast. Some governments, enterprises and schools constitute a LAN first ,then join into INTERNET. So the instant messenger in LAN was borned. So I make a new design, and implement it on WINDOWS platform. In my implementation the client and the server were integrated in one progr

6、am with multi thread mechanism. And had a good GUI,it was very easy to use it. And the function is very realizable. At last, it is also easy for expanding.Key words: LAN, instant messaging, client, server, multi thread,share memory,Information 1 引 言1.1 课题背景及意义:近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各

7、种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。 为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无

8、论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。 我在本文中将讨论一种基于Socket的局域网通信工具的设计与实现方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。 基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教

9、学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。1.2 课题现状 基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现 ,开发技术已经比较成熟,比如较早的ICQ,MSN Messanger,Yahoo 通这些国外开发的产品,还有国产的有名的QQ,新浪UC,LAVA-LAVA

10、等,这些工具统统都实现了广域网上的即时通信,尽管都是即时通信,实现了即时聊天,以及文件传输的主要功能,但是也各有各的特色,比如ICQ的巨大客户群,MSN的个性化表情,YAHOO通的易操作性等。而QQ也具有一个相当方便的屏幕截图功能,另外就是,所有上述软件都实现了网络即时的视频,语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络

11、结构本身比广域网要复杂,但是又可以借些理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。1.3 本文的主要工作:本文主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。1.4开发平台与技术的选择及介绍1.4.1 开发环境的介绍我所设计的是一个面向中小型机构内部通信需求的局域网即时信息软件,要在短时间内开发出来并且要满足客户要求,无论是硬件还是软件都要选择合适,要求如下:开发设备应该完备;开发机器的性能必须稳定;操作系统的选择必须

12、恬当;开发出的程序可以在尽可能多的平台上运行;要求运行机配置尽可能低档。对此,我们选择的硬件环境和软件环境如下: (1) 硬件环境 开发该系统应尽可能采用高档的硬件。因此,在应用时应采用更好的配置。 处理器:Intel Pentium PIII或更高处理器。 内存:128MB或更高。 网络:局域网。 (2) 软件环境 选择好的操作系统和好的编程语言是系统优劣的关键,我们要求系统在尽可能多的环境下运行,故选择Windows XP平台,对于一些无法在98中运行的API函数,一律不采用,并采取优化的算法编写程序。因VC6.0具有友好的集成开发界面、面向对象的可视化开发模式、良好的数据库及多媒体应用支

13、持以及高效的软件开发与程序运行,功能更大,开发效率更高,不仅是网络环境下的优秀前端开发语言和工具,也是服务器端Web编程的优秀工具。加之我本人对本系统的操作最为熟练,所以选择该平台为开发环境。 操作系统:Windows XP或Window2000。 开发工具:VC+6.0。 1.4.2 WINDOWS SOCKETS网络编程接口概述既然选定了WINDOWS平台,而又要开发网络通信程序,所以可以选择WINDOWS的SOCKETS编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsoc

14、k来调用多种协议的功能,但较常使用的是TCP/IP协议。Winsockets无疑是我们进行网络编程的利器。1.4.3 VC+6.0开发平台简介开发平台我选用了VC6.0,因为一直以来都使用VC6进行学习,对这个IDE最为熟悉,再者VC同样是由微软开发的系统,与其操作系统,网络接口具有最为密切的契合优点,所以选择了VC6.0。2 需求分析及可行性研究2.1 需求分析:2.1.1 时间要求本项目作为大学课程设计题目,从6月26号接受选题开始,在7月2号之前完成系统设计,编码实现工作,在7月5号之前完成课程设计论文初稿,7月9号之前最终完成课程设计。2.1.2 功能要求(1)用户端之间的信息发送,本

15、程序需要实现的最基本的功能(2)在线用户主机名列表的维护。(3)在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。2.1.3 系统基本流程图图2-1 聊天系统工作流程图2.1.4 性能要求首先要求程序要完全可靠,可以应付种种由于系统问题产生的错误,比如初始网络失败,

16、对方突然下线等。要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能够清晰的理解整个系统的设计思路以及实现细节。要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。并且不发生内存泄漏之类影响系统运行的错误事件。并且要求易于维护及扩展。所以应该采用模块化开发,各个模块之间不要有太多的联系

17、,以免维护困难。2.1.5 测试环境规定在开发完成以后,自己进行一个全面的测试。2.2 可行性研究:(1)成本可行性分析因为本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。(2)技术可行性分析首先我已经搭建好开发所需要的软硬件平台,并进行了合理而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与VC开发环境的严密契合能力,加之相类似的更大规模的INTERNET通信工具产品也已有例在先,所以这个程序的开发可行性在技术上是完全可行的。3 相关开发技术的原理性说明3.1 win32编程原

18、理及MFC框架3.1.1 WIN32编程原理所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。虽说现在直接用Win32 API开发应用程序的人已经不多了,但是深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的良好途径。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。下面是进行直接的WIN32 SDK方式编程的基本思路或者说是一个框架:一个WINDOWS程序分为程序代码和UI(User Interface 用户接口)资源两大部份,两部份最后以RC编译程序整合为一个完整的EX

19、E文件。所谓UI资源是指功能菜单、对话框、程序图标、光标形状等等东西。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur等等。程序员必须在一个所谓的资源描述档(.rc )中描述它们。RC编译器( RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.RES 文件,再与程序代码结合在一起,这才是一个完整的 Windows可执行文件。与控制台程序相同的是,一个WIN32程序也必须有一个程序入口点,但是在这儿它不再叫main(),而叫做WinMain(),当WINDOWS的SHELL检测到用户欲执行一个EXE程序,就会调用加

20、载器把程序进行加载,然后调用C startup code,后者再调用WinMain(),程序的执行就开始了,WinMain()函数的原型为:int CALLBACK WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);图3-1 32位WINDOWS程序的开发流程下面程序必须进行必要的初始化工作产生窗口,第一步是注册一个窗口类:用API函数:RegisterClass(),而这个函数需要一个已经定义好的系统结构:WNDCLASS,这个结构里面定义了窗口的种种属性,需要自己定义,但是许

21、多属性都有默认值。然后调用CreateWindow()函数来产生具有上述定义属性的已注册窗口,但是需要注意的是它只是生成窗口,但并不显示之,所以还需要调用一个函数ShowWindow()将它显示在屏幕上,做完这些初始化工作以后,系统将进入消息循环:while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);当消息循环捕捉到消息以后将交由窗口函数WndProc()窗口函数进行相应的处理。这样,一个基于消息事件驱动的WIN32程序的雏形就建立了起来。3.1.2 MFC框架由上面的介绍可以看出,直接用

22、API函数开发一个WIN32程序是相当麻烦的,有好多既定的重复性的工作要做,所以微软就用C+的类机制将绝大部分的API函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了WIN32开的的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。它就是Microsoft Foundation Classes,简称为MFC,可以说它是VC开发环境的一个核心构件。MFC构架了一个庞大的类体系结构,在4.0时代就多达189个类,程序代码达252个文件,58个头文件,共10MB之多,MFC4.2时又多加了29个类,但是最为主干的是下面类结构示图所示的一些类: CObjectCWn

23、dCDocumentCwinThreadCcmdTarge 图3-2 MFC类框架主体 CObject 是 MFC 类库的根类。 MFC 类库包括: (1)CCmdTarget 类:是 CObject 类的子类,它是 MFC 库中所有具有消息映射属性的类的公共基类。它的子类有 CWinThread 类, CWnd 类、 CDocument 类,从 CCndTarget 类派生的类能在程序运行时动态创建对象,并处理命令消息。 (2)CWinThread 类:是 CCmdTarget 的子类。 CWinThread 是所有线程类的基类,封装了应用程序操作的多线程功能。应用程序类 CWinApp 是

24、 CWinThread 的子类,封装了初始化、运行、终止应用程序的代码。 (3)CWnd 类:窗口类,是 CcmdTarget 类的子类,从 CWnd 派生的类可以拥有自己的窗口,并对它进行控制。窗口框架类 CFrameWnd 和 CView 类是 CWnd 的子类,前者创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图。视图的作用是为修改、查询文档等任务提供人机交互的界面。 (4)文档类 CDocument 类:是 CCmdTarget 类的子类,负责封装和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。

25、 一个 MFC 应用程序并不直接操作上述类,而是以上述类为基类派生新的类,构建 Windows 应用程序的基本框架。构建一个基于MFC框架的程序,可以使用MFC的向导程序,但首先要明白,一个基于MFC的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同的程序属性。使用其向导以及控件编程,使得不论是界面编写,还是程序内核设计,都更加的简单。其中有合理的消息映射机制,有方便的运行时类型识别功能,更有文档/视图结构设计,文档串行化功能等非常多的优秀功能。3.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口3.2.1 TCP

26、/IP协议简介(1)TCP/IP协议通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、http等。 (2)逻辑结构: 图3-3 逻辑结构这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。这样的分层结

27、构决定了计算机在internet上互相通信的方式。数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“”代表网址,理解这样的分层结构是理解INTERNET技术的基础。(3)本课程设计涉及到的协议:IP、TCP IP(Internet Protocol)是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何

28、事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 UDP(IP协议号17)是一个无连接的数据报协议。它是一个“best effort”或者“不可靠”协议不是因为它特别不可靠,而是因为它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。UDP的典型性应用是如流媒体(音频和视频等)这样按时到达比可靠性更重要的应用,或者如DNS查找这样的简单查询/响应应用,如果需要建立可靠的连结,哪么所作的额外工作将是不成比例地大。本程序只应用于局域网中,局域网中的数据流传输的可靠性高,故选择UDP协议。3.2.2 WINDOWS

29、SOCKETS网络编程接口概述在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被惊醒并且为客户提供服务对客户的请求作出适当的反应。为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的

30、Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。如下图所示: 图3-4 面向连接的套接字的系统调用图微软为Visual C+定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,我们当然可以使用这些类来实现自己的网络程序,但是为了更好的了解Winsock

31、 API编程技术,本设计中将使用底层的API函数实现 Winsock 平台的即时通信工具。在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误。(1) WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。(2) WSOCK32.LIB: WINSOCK API连接库文件。(3) WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。3.3 多线程编程技术3.3.1 进程及线程概述进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资

32、源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技

33、术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。Visual C+ 6.0中,使用MFC类库也实现了多线程的程序设计

34、,使得多线程编程更加方便。3.3.2 Win32 API对多线程编程的支持Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。 (1) HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);该函数在其调用进程的进程空

35、间里创建一个新的线程,并返回已建线程的句柄。(2) DWORD SuspendThread(HANDLE hThread);该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。(3) DWORD ResumeThread(HANDLE hThread);该函数用于结束线程的挂起状态,执行线程。 (4) VOID ExitThread(DWORD dwExitCode);该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。 (5) BOOL TerminateThread(HANDLE hThread,DWORD dwExit

36、Code);一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。 (6)BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。调用该函数时,如果即将接收消息的线程没有创建消息循

37、环,则该函数执行失败。4 总体设计4.1体系结构设计通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服

38、务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答。如下图所示:图4-1客户机服务器通信结构示图在客户端启动后,客户端计算得到本地网络的广播地址,进行广播查找服务器端,服务器接收到客户端的广播信息后返回服务器地址,则客户端接收、验证信息并记录服务器端地址,然后客户端启动定时期,定时发送信息到服

39、务器,以告知服务器自己在线,然后服务器返回在线用户列表,服务器依靠客户端发送的信息来更新维护在线用户列表。在客户端与服务器尽心数据交换,拥有了在线用户列表后,就可以选择IP进行客户端之间的点对点信息交流了。如果服务器不在线,则客户端会提示用户退出,在一定的时间后自动退出。4.2 功能模块划分根据以上的系统需求分析,以及体系结构设计,可以对系统进行如下的功能模块划分如下图所示。图4-2 功能模块图其中主线程模块完成对网络的初始化,然后启动两个子线程:服务端监听线程以及网络扫描模块线程,然后由网络扫描模块得到当前的网络用户分布情况,并填充相关的数据结构,然后生成用户列表界面显示给用户。通信模块又包

40、括两个子模块:数据接收模块和数据发送模块,这两个模块都由系统定义的网络事件来触发。输入/输出模块用来响应用户双击用户列表的某一项要准备发送信息时的消息,以及当系统接收到某个网络用户发送来的消息,要将其显示给用户的时候。网络扫描模块是由主线程模块启动,进行网络扫描,确定哪些用户当前处于可到达状态,以及哪些可到达状态的用户安装有相应的通信软件,并启动之可以与之进行通信。4.3 数据结构设计(1)在线用户信息结构体: struct USERINFO CString ip;/存储IPBOOL on_line;/用于判断次IP是否更新过,未更新则从单向链表中删除 USERINFO *next;/下一个存

41、储单元的地址,最后一个为NULL;注:用于构建服务器端的在线用户单向链表。(2)从服务器端发送到客户端的在线用户列表信息结构:(3)传输到线程的信息结构体:客户端:struct RECVPARAM SOCKET sock;/存储接口套接字HWND hwnd;/存储窗口句柄;服务器端:struct RECVPARAMSOCKET sock;/存储接口套接字HWND hwnd;/存储窗口句柄BOOL endtread;/存储用于判断是否退出线程循环USERINFO *userhead;/存储在线用户单向链表的头指针;注:线程函数为静态函数,无法调用成员变量和成员函数,所以需要将需要的数据传送进去。

42、4.4 用户界面设计在能够完全满足软件所需功能,设计界面要清爽、操作要简单易懂的基本原则下,本软件的界面设计如下:4.4.1 服务器端显示界面:图4-3服务器端界面图4.4.2 客户端显示界面: 图4-4 客户端显示界面5 详细设计及编码实现5.1 主框架及用户界面模块详细设计主框架模块由两个类构成:CserverDlg类和CserverApp类。类结构如下: 图5-1 服务器端主框架模块图其中前面为红色方块的为类成员函数,浅蓝色方块的为类成员数据。CserverApp类为应用程序主框架类,它在后台完成了一个基于MFC的应用程序的所有基本的初始化工作,如果用户需要在程序的初始化时加入一些自定义

43、的操作,只需在其中的InitInstance()函数中加入就可以了。在本程序中,只需要将WIN SOCKETS的网络初始化工作完成。代码为:if (!AfxSocketInit()AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;在每一个基于MFC的WIN32程序中,它都是通过一个由全局对象启动整个初始化过程的机制,因为根据C+的设计,一个全局对象的生成即其构造函数的调用要先于程序的入口函数。所以,在这个对象的构造函数中可以做很多准备工作,这个对象就是程序主框架类的对象,具体到本程序中,即是上面讲到的CserverDlg类。服务端线程的具体

44、作就是首先创建一个SOCKETS,然后将该套接字绑定到本地主机的某一个固定的端口上,在本程序中选择了3127端口。接着将该套接字设置为异步非阻塞模式,并为它注册各种网络异步事件,最后开始监听。5.2 数据报套接字编程模型 大多数的数据报应用程序使用固定的事件序列完成客户端程序和服务器端程序之间的通信。使用WinSock API进行数据报编程的模型如图5-2所示。Socket()Socket() 客户端应用程序 服务器端应用程序bind() Sendto()recvfrom()recvfrom()Sendto()CloseSocket()CloseSocket()图5-2使用数据报套接字首先,客

45、户端和服务器端都创建一个数据报,接着服务器端调用bind()函数给套接字指定一个端口。客户使用SendTo()函数向服务器端发送数据,服务器端使用recvfrom()函数接收数据。数据报套接字的编程比较简单,它不需要建立连接就可以进行网络通信。通过调用recvfrom()函数可得到数据发送者的信息。随后立刻向数据的发送者进行回复。5.3 流式套接字编程模型流式套接字使用基于连接的协议,它的使用方法与数据报套接字不同。在发送和接收数据之前必须建立连接。首先服务器创建一个用户监听的套接字,为该套接字分配地址之后,调用listen()函数使之处于监听状态,客户端在创建套接字完毕之后,为套接字分配地址,然后调用connection()函数,向服务器端发出连接请求:服务器套接字在接收到客户端的连接请求之后,调用accept()函数,该函数创建一个用于连接的套接字。图5-3描述了使用WinSock API进行流式连接的套接字。通常情况下,一个服务器端应用程序能够处理多个用户的请求,因此在流式套接字的编程模型中,服务器首先创建一个用于连接的套接字 。服务器端使用新建的套接字与客户端进行通信如图5-3所示。Socket()Socket() 客户端 服务器端bind()bind()recv()Socket()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1