原创毕业设计论文:局域网聊天系统

更新时间:2024-06-04 03:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

摘要 .................................................................................................................................................. I Abstract ........................................................................................................................................... II 1 引 言............................................................................................................................................. 1

1.1 课题背景及意义: ........................................................................................................... 1 1.2 课题现状 ......................................................................................................................... 1 1.3 本文的主要工作: ........................................................................................................... 2 1.4开发平台与技术的选择及介绍 ........................................................................................ 2

1.4.1 开发环境的介绍 ............................................................................................... 2 1.4.2 WINDOWS SOCKETS网络编程接口概述 ............................................................ 3 1.4.3 VC++6.0开发平台简介 .................................................................................... 3

2 需求分析及可行性研究 ............................................................................................................... 3

2.1 需求分析: ....................................................................................................................... 3

2.1.1 时间要求 ............................................................................................................. 3 2.1.2 功能要求 ............................................................................................................. 3 2.1.3 系统基本流程图 ................................................................................................. 4 2.1.4 性能要求 ............................................................................................................. 4 2.1.5 测试环境规定 ..................................................................................................... 4 2.2 可行性研究: ................................................................................................................... 4 3 相关开发技术的原理性说明 ....................................................................................................... 5

3.1 win32编程原理及MFC框架 .......................................................................................... 5

3.1.1 WIN32编程原理 ................................................................................................ 5 3.1.2 MFC框架 .............................................................................................................. 6 3.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口 ....................................................... 8

3.2.1 TCP/IP协议简介 ................................................................................................ 8 3.2.2 WINDOWS SOCKETS网络编程接口概述 .......................................................... 10 3.3 多线程编程技术 ............................................................................................................. 11

3.3.1 进程及线程概述 ............................................................................................... 11 3.3.2 Win32 API对多线程编程的支持 .................................................................. 12

4 总体设计..................................................................................................................................... 13

4.1体系结构设计 .................................................................................................................. 13 4.2 功能模块划分 ................................................................................................................. 14 4.3 数据结构设计 ................................................................................................................. 15 4.4 用户界面设计 ................................................................................................................. 15

4.4.1 服务器端显示界面: ....................................................................................... 15 4.4.2 客户端显示界面: ......................................................................................... 16

5 详细设计及编码实现 ................................................................................................................. 16

5.1 主框架及用户界面模块详细设计 ................................................................................. 16 5.2 网络扫描模块详细设 ..................................................................................................... 18 5.3 信息发送模块详细设计 ................................................................................................. 18 5.4 信息接收模块详细设计 ................................................................................................. 20 6 测 试......................................................................................................................................... 20 结 论 .............................................................................................................................................. 21

致 谢 .............................................................................................................................................. 22 参考文献 ........................................................................................................................................ 23

摘要

随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。所以本文提出了一个更加合理的设计,并在WINDOWS平台上加以了实现.在本实现内将客户端和服务端综合在一个程序之内,用多线程实现不同的并行任务。并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。本文通过局域网聊天系统来具体共享内存实现进程间的数据交换,利用windows消息机制实现进程间的同步,两种机制结合使用。

关键词:局域网;即时通信;客户端;服务端;多线程;共享内存;信息

I

Abstract

Along 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 of 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 program 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

II

局域网聊天系统

1 引 言

1.1 课题背景及意义:

近年来,随着全球信息化进程的不断发展,网络也在飞速发展。出于高效、快速地处理各种事务的目的,越来越多的企业在其内部使用局域网来进行工作。在内部局域网的帮助下,企业得以简化信息流程,提高信息交换的速度,从而提高工作效率。然而,随着企业规模的扩大,业务量的增加,在局域网上运行的应用越来越多,如知识库、网络会议、数据库应用和数据的同步与备份等,这些应用对局域网的信息吞吐、处理能力的要求也越来越高。这些在企业内部原有局域网设计之初未曾考虑到的新情况的出现使得局域网不堪重负,容易发生信息阻塞,此时,局域网不但不能提高生产效率,反而成为企业发展的瓶颈。

为了解决上述矛盾,人们提出了许多方法。提升网络带宽及增加服务器的吞吐能力是解决此矛盾的一种方法。然而,从企业运行的成本方面考虑,无论是单纯地提升网络带宽或增加服务器的吞吐能力都不能从根本上解决局域网资源紧张的问题,对旧有局域网的大规模硬件改造反而会增加企业的负担。

我在本文中将讨论一种基于Socket的局域网通信工具的设计与实现方法。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。

基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。

基于Socket的局域网通信软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。

1.2 课题现状

基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现 ,开发技术已经比较成熟,比如较早的ICQ,MSN Messanger,Yahoo 通这些国外开

1

局域网聊天系统

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

1.3 本文的主要工作:

本文主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。

1.4开发平台与技术的选择及介绍

1.4.1 开发环境的介绍

我所设计的是一个面向中小型机构内部通信需求的局域网即时信息软件,要在短时间内开发出来并且要满足客户要求,无论是硬件还是软件都要选择合适,要求如下:开发设备应该完备;开发机器的性能必须稳定;操作系统的选择必须恬当;开发出的程序可以在尽可能多的平台上运行;要求运行机配置尽可能低档。对此,我们选择的硬件环境和软件环境如下: (1) 硬件环境

开发该系统应尽可能采用高档的硬件。因此,在应用时应采用更好的配置。 处理器:Intel Pentium PIII或更高处理器。 内存:128MB或更高。 网络:局域网。 (2) 软件环境

选择好的操作系统和好的编程语言是系统优劣的关键,我们要求系统在尽可能多的环境下运行,故选择Windows XP平台,对于一些无法在98中运行的API函数,一律不采用,并采取优化的算法编写程序。因VC6.0具有友好的集成开

2

局域网聊天系统

发界面、面向对象的可视化开发模式、良好的数据库及多媒体应用支持以及高效的软件开发与程序运行,功能更大,开发效率更高,不仅是网络环境下的优秀前端开发语言和工具,也是服务器端Web编程的优秀工具。加之我本人对本系统的操作最为熟练,所以选择该平台为开发环境。

操作系统:Windows XP或Window2000。 开发工具:VC++6.0。

1.4.2 WINDOWS SOCKETS网络编程接口概述

既然选定了WINDOWS平台,而又要开发网络通信程序,所以可以选择WINDOWS的SOCKETS编程接口,Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Winsockets无疑是我们进行网络编程的利器。 1.4.3 VC++6.0开发平台简介

开发平台我选用了VC6.0,因为一直以来都使用VC6进行学习,对这个IDE最为熟悉,再者VC同样是由微软开发的系统,与其操作系统,网络接口具有最为密切的契合优点,所以选择了VC6.0。

2 需求分析及可行性研究

2.1 需求分析:

2.1.1 时间要求

本项目作为大学本科毕业设计题目,从3月8号接受选题开始,在5月10号之前完成系统设计,编码实现工作,在5月20号之前完成毕业设计论文初稿,6月1号之前最终完成论文。 2.1.2 功能要求

(1)用户端之间的信息发送,本程序需要实现的最基本的功能 (2)在线用户主机名列表的维护。

(3)在C/S模式中,服务器与客户端是相互依赖的。在客户端启用以后,需要查看服务器端是否在线,服务器在线才能正常使用客户端,如果服务器不在线,则在检测一定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向服务器端发送信息的,服务器认为客户端下线;客户端在一定时间内未收

3

局域网聊天系统

到服务器端信息的,认为服务器已经下线,则提示用户并建议退出,在用户一定时间后没有退出的则自动关闭客户端程序。 2.1.3 系统基本流程图

图2-1 聊天系统工作流程图

2.1.4 性能要求

首先要求程序要完全可靠,可以应付种种由于系统问题产生的错误,比如初始网络失败,对方突然下线等。要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。

程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。

开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能够清晰的理解整个系统的设计思路以及实现细节。

要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。并且不发生内存泄漏之类影响系统运行的错误事件。并且要求易于维护及扩展。所以应该采用模块化开发,各个模块之间不要有太多的联系,以免维护困难。 2.1.5 测试环境规定

在开发完成以后,自己进行一个全面的测试。

2.2 可行性研究:

(1)成本可行性分析

因为本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。

4

局域网聊天系统

(2)技术可行性分析

首先我已经搭建好开发所需要的软硬件平台,并进行了合理而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与VC开发环境的严密契合能力,加之相类似的更大规模的INTERNET通信工具产品也已有例在先,所以这个程序的开发可行性在技术上是完全可行的。

3 相关开发技术的原理性说明

3.1 win32编程原理及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编译程序整合为一个完整的EXE文件。所谓UI资源是指功能菜单、对话框、程序图标、光标形状等等东西。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如 .ico .bmp .cur等等。程序员必须在一个所谓的资源描述档(.rc )中描述它们。RC编译器( RC.EXE )读取RC 文件的描述后将所有UI资源文件集中制作出一个.RES 文件,再与程序代码结合在一起,这才是一个完整的 Windows可执行文件。

与控制台程序相同的是,一个WIN32程序也必须有一个程序入口点,但是在这儿它不再叫main(),而叫做WinMain(),当WINDOWS的SHELL检测到用户欲执行一个EXE程序,就会调用加载器把程序进行加载,然后调用C startup code,后者再调用WinMain(),程序的执行就开始了,WinMain()函数的原型为:

int

CALLBACK

WinMain(

HINSTANCE

hInstance,HINSTANCE

hPrevInstance,LPSTR lpCmdLine,int nCmdShow);

5

局域网聊天系统

图3-1 32位WINDOWS程序的开发流程

下面程序必须进行必要的初始化工作-产生窗口,第一步是注册一个窗口类:用API函数:RegisterClass(),而这个函数需要一个已经定义好的系统结构:WNDCLASS,这个结构里面定义了窗口的种种属性,需要自己定义,但是许多属性都有默认值。然后调用CreateWindow()函数来产生具有上述定义属性的已注册窗口,但是需要注意的是它只是生成窗口,但并不显示之,所以还需要调用一个函数ShowWindow()将它显示在屏幕上,做完这些初始化工作以后,系统将进入消息循环:

while (GetMessage(&msg, NULL, 0, 0)){

TranslateMessage(&msg);

DispatchMessage(&msg);}

当消息循环捕捉到消息以后将交由窗口函数WndProc()窗口函数进行相应的处理。这样,一个基于消息事件驱动的WIN32程序的雏形就建立了起来。 3.1.2 MFC框架

由上面的介绍可以看出,直接用API函数开发一个WIN32程序是相当麻烦的,有好多既定的重复性的工作要做,所以微软就用C++的类机制将绝大部分的API函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了WIN32开的的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。它就是Microsoft Foundation Classes,简称为MFC,可以说它是VC开发环境的一个核心构件。MFC构架了一个庞大的类体系结构,在4.0时代就多

6

局域网聊天系统

达189个类,程序代码达252个文件,58个头文件,共10MB之多,MFC4.2时又多加了29个类,但是最为主干的是下面类结构示图所示的一些类:

CObject CcmdTarge CwinThread CWnd CDocument

图3-2 MFC类框架主体 CObject 是 MFC 类库的根类。

MFC 类库包括:

(1)CCmdTarget 类:是 CObject 类的子类,它是 MFC 库中所有具有消息映射属性的类的公共基类。它的子类有 CWinThread 类, CWnd 类、 CDocument 类,从 CCndTarget 类派生的类能在程序运行时动态创建对象,并处理命令消息。

(2)CWinThread 类:是 CCmdTarget 的子类。 CWinThread 是所有线程类的基类,封装了应用程序操作的多线程功能。应用程序类 CWinApp 是 CWinThread 的子类,封装了初始化、运行、终止应用程序的代码。

(3)CWnd 类:窗口类,是 CcmdTarget 类的子类,从 CWnd 派生的类可以拥有自己的窗口,并对它进行控制。窗口框架类 CFrameWnd 和 CView 类是 CWnd 的子类,前者创建和维护窗口的边框、菜单栏、工具栏、状态栏,负责显示和搜索用户命令,后者负责为文档提供一个或几个视图。视图的作用是为修改、查询文档等任务提供人机交互的界面。

7

局域网聊天系统

(4)文档类 CDocument 类:是 CCmdTarget 类的子类,负责封装和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。

一个 MFC 应用程序并不直接操作上述类,而是以上述类为基类派生新的类,构建 Windows 应用程序的基本框架。

构建一个基于MFC框架的程序,可以使用MFC的向导程序,但首先要明白,一个基于MFC的程序可以有几种类型:基于单文档结构的程序,基于多文档结构的程序以及基于对话框的应用程序,不同类型的程序具有不同的程序属性。使用其向导以及控件编程,使得不论是界面编写,还是程序内核设计,都更加的简单。其中有合理的消息映射机制,有方便的运行时类型识别功能,更有文档/视图结构设计,文档串行化功能等非常多的优秀功能。

3.2 TCP/IP 协议及WINDOWS SOCKETS网络编程接口 3.2.1 TCP/IP协议简介 (1)TCP/IP协议

通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议、ARP(地址解析协议)和其他一些协议的协议组。应用的示例:telnet(远程登录)、ftp(文件传递协议)、http等。 (2)逻辑结构:

8

局域网聊天系统

图3-3 逻辑结构

这是TCP/IP协议的分层结构在互连网计算机上的表示,用互连网技术互相通信的每台计算机都有这样的分层结构。这样的分层结构决定了计算机在internet上互相通信的方式。数据通过这样的分层结构从上层传到底层,然后通过网线把数据传送出去。底层的水平线代表以太网网线,“O”代表收发器,“*”代表IP地址,“@”代表网址,理解这样的分层结构是理解INTERNET技术的基础。 (3)本论文涉及到的协议:IP、TCP

IP(Internet Protocol)是TCP/IP的心脏,也是网络层中最重要的协议。 IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

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

9

局域网聊天系统

3.2.2 WINDOWS SOCKETS网络编程接口概述

在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被\惊醒\并且为客户提供服务-对客户的请求作出适当的反应。

为了方便这种Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。

Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。如下图所示:

图3-4 面向连接的套接字的系统调用图

10

局域网聊天系统

微软为Visual C++定义了Winsock类如CAsyncSocket类和派生于CAsyncSocket 的CSocket类,它们简单易用,我们当然可以使用这些类来实现自己的网络程序,但是为了更好的了解Winsock 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 进程及线程概述

进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。

线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。

每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。

多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。

Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的

11

局域网聊天系统

各种同步、互斥和临界区等操作。Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。 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);

该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄。

(2) DWORD SuspendThread(HANDLE hThread);

该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。 (3) DWORD ResumeThread(HANDLE hThread);

该函数用于结束线程的挂起状态,执行线程。 (4) VOID ExitThread(DWORD dwExitCode);

该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。

(5) BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。

使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。

(6)BOOL PostThreadMessage(DWORD wParam,LPARAM lParam);

12

idThread,UINT Msg,WPARAM

该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程

局域网聊天系统

处理时便返回。

调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。

4 总体设计

4.1体系结构设计

通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答。如下图所示:

图4-1客户机/服务器通信结构示图

13

局域网聊天系统

在客户端启动后,客户端计算得到本地网络的广播地址,进行广播查找服务器端,服务器接收到客户端的广播信息后返回服务器地址,则客户端接收、验证信息并记录服务器端地址,然后客户端启动定时期,定时发送信息到服务器,以告知服务器自己在线,然后服务器返回在线用户列表,服务器依靠客户端发送的信息来更新维护在线用户列表。在客户端与服务器尽心数据交换,拥有了在线用户列表后,就可以选择IP进行客户端之间的点对点信息交流了。如果服务器不在线,则客户端会提示用户退出,在一定的时间后自动退出。

4.2 功能模块划分

根据以上的系统需求分析,以及体系结构设计,可以对系统进行如下的功能模块划分如下图所示。

图4-2 功能模块图

其中主线程模块完成对网络的初始化,然后启动两个子线程:服务端监听线程以及网络扫描模块线程,然后由网络扫描模块得到当前的网络用户分布情况,并填充相关的数据结构,然后生成用户列表界面显示给用户。

通信模块又包括两个子模块:数据接收模块和数据发送模块,这两个模块都由系统定义的网络事件来触发。

输入/输出模块用来响应用户双击用户列表的某一项要准备发送信息时的消息,以及当系统接收到某个网络用户发送来的消息,要将其显示给用户的时候。

网络扫描模块是由主线程模块启动,进行网络扫描,确定哪些用户当前处于可到达状态,以及哪些可到达状态的用户安装有相应的通信软件,并启动之可以与之进行通信。

14

局域网聊天系统

4.3 数据结构设计

(1)在线用户信息结构体: struct USERINFO {

CString ip; BOOL on_line; 链表中删除

USERINFO *next; };

//存储IP

//用于判断次IP是否更新过,未更新则从单向//下一个存储单元的地址,最后一个为NULL

注:用于构建服务器端的在线用户单向链表。

(2)从服务器端发送到客户端的在线用户列表信息结构: (3)传输到线程的信息结构体:

客户端:

struct RECVPARAM {

SOCKET sock; //存储接口套接字 HWND hwnd; //存储窗口句柄 };

服务器端:

struct RECVPARAM {

SOCKET sock; //存储接口套接字 HWND hwnd; //存储窗口句柄

BOOL endtread; //存储用于判断是否退出线程循环 USERINFO *userhead; //存储在线用户单向链表的头指针 };

注:线程函数为静态函数,无法调用成员变量和成员函数,所以需要将需要的数据传送进去。

4.4 用户界面设计

在能够完全满足软件所需功能,设计界面要清爽、操作要简单易懂的基本原则下,本软件的界面设计如下: 4.4.1 服务器端显示界面:

15

局域网聊天系统

图4-3服务器端界面图

4.4.2 客户端显示界面:

图4-4 客户端显示界面

5 详细设计及编码实现

5.1 主框架及用户界面模块详细设计

16

局域网聊天系统

主框架模块由两个类构成:CserverDlg类和CserverApp类。类结构如下:

图5-1 服务器端主框架模块图

其中前面为红色方块的为类成员函数,浅蓝色方块的为类成员数据。 CserverApp类为应用程序主框架类,它在后台完成了一个基于MFC的应用程序的所有基本的初始化工作,如果用户需要在程序的初始化时加入一些自定义的操作,只需在其中的InitInstance()函数中加入就可以了。在本程序中,只需要将WIN SOCKETS的网络初始化工作完成。代码为: if (!AfxSocketInit())

{ }

在每一个基于MFC的WIN32程序中,它都是通过一个由全局对象启动整个初始化过程的机制,因为根据C++的设计,一个全局对象的生成即其构造函数的调用要先于程序的入口函数。所以,在这个对象的构造函数中可以做很多准备工作,这个对象就是程序主框架类的对象,具体到本程序中,即是上面讲到的CserverDlg类。

17

AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return FALSE;

局域网聊天系统

服务端线程的具体作就是首先创建一个SOCKETS,然后将该套接字绑定到本地主机的某一个固定的端口上,在本程序中选择了3127端口。接着将该套接字设置为异步非阻塞模式,并为它注册各种网络异步事件,最后开始监听。

5.2 网络扫描模块详细设

图5-2网络扫描示意图 5.3 信息发送模块详细设计

18

局域网聊天系统

beginUpdateData(TRUE);填充NETMESSAGE结构体获得列表框中的用户strcpy(netMessage.to,_T(\m_bWhispering密语发送消息(\所有人\strTo==_T(\MessageBox(\请选择对方!\错误\return;netMessage.type=PTC_WHISPERING;发送消息 图5-3 信息发送模块流程图

19

局域网聊天系统

5.4 信息接收模块详细设计

图5-4 信息接收模块流程图 以上即各个模块的详细设计的主要实现过程。

6 测 试

用二台机器通过集线器构成一个局域网,进行正确的网络配置,三台机器上都安装了WINDOWS操作系统,经过测试可正常运行。

20

局域网聊天系统

结 论

在当今电脑网络密布的世界当中,一个简单高效的局域网通信工具是如此的具有实用性,所以我们应当重视对它的相关研究与开发。在这次的毕业设计中,我应用了VC++6.0开发工具在WINDOWS平台上开发了一个基于WINDOWS平台的局域网通信工具,在这一重要的领域进行了相关的实践,不管是对我的研究能力,还是实际动手能力,还是资料查阅能力,都起了相当大的益处。通过此次毕业设计,我了解了进程间通讯的两种基本方法共享内存和消息,在实例中具体体会到了共享内存和消息的使用方法。所以,我决定认真总结这次毕业设计的经验,以及学习到的知识,来更加的充实自己的头脑和完善自己的知识结构。

另外,我也在这次设计中看到了自己的许多不足之处,由于初次接触到语言类问题,很多步骤都是自己临时学习,大大影响了系统的开发进度。

既然设计已经完成,论文也写到结论的地方,我希望自己能以一个良好的心态顺利毕业,走向社会。

21

局域网聊天系统

致 谢

首先要感谢陈琳老师,是她在整个毕业设计过程中给我提供了毕业设计所需要的资料,帮助解答毕业设计中遇到的问题。其次要感谢电科实验室的老师们,是他们毕业设计中为我准备好了毕业设计的工作环境,在翻译版图的整个过程中给予了我指导,再次是要感谢和我一起做毕业设计的同学们,正是有了他们,我们才在遇到问题时,相互鼓励,最终解决了问题,圆满地完成了毕业设计的各项工作。

22

局域网聊天系统

参考文献

[1]侯俊杰.深入浅出MFC[M].华中科技大学出版社.2001

[2]孙鑫.VC++深入详解[M].电子工业出版社. ISBN 7-121-02530-2

[3]黄强.WINDOWS网络编程[M].人民邮电出版社. ISBN 978-7-115-10961-3

23

本文来源:https://www.bwwdw.com/article/hw16.html

Top