局域网聊天系统的设计与实现设计.docx
《局域网聊天系统的设计与实现设计.docx》由会员分享,可在线阅读,更多相关《局域网聊天系统的设计与实现设计.docx(37页珍藏版)》请在冰豆网上搜索。
![局域网聊天系统的设计与实现设计.docx](https://file1.bdocx.com/fileroot1/2023-6/28/e2baeed0-abcc-4126-b85c-5415b254ccd2/e2baeed0-abcc-4126-b85c-5415b254ccd21.gif)
局域网聊天系统的设计与实现设计
第一章绪论
1.1课题背景
随着Internet的不断发展普及,网络通讯成为人们生活中的一部分。
网络聊天已和手机等一样,成为人们运用最为广泛的通信工具之一。
即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSNMessenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。
而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。
IM软件的历史并不久远,但是它的出现,就立即受到大家的喜爱,并风靡全球。
在它的发展史上,以色列人是功不可没的。
正是四位以色列年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”——“ISeekYou”,简称ICQ了。
直到现在,ICQ已经推出了它的2002a版本,在全球即时通讯市场上占有非常重要的地位。
目前,国内最为流行的即时通讯软件是OICQ(简称QQ)。
它以良好的中文界面和不断增强的功能形成了一定的QQ网络文化。
Messenger虽出道较晚,但依托微软的强大背景,实力也不可小视。
作为WindowsXP的一部分,Messenger整合了操作系统的许多功能,体现出了微软的真正实力所在,如多种形式的聊天选择、多人的单窗口讨论式交流以及充分的文件与桌面共享功能等。
它的令人耳目一新的中文界面和注册方式,连同它强大的功能,着实吸引了众多的眼球的注视,此外还有许多有特点的IM软件。
我们经常听到TCP/IP和UDP(用户数据报协议)这两个术语,它们都是建立在更低层的IP协议上的两种通讯传输协议。
TCP/IP是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。
而UDP是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
聊天功能是IM软件最基本、也是最重要的功能,基本上每一种IM软件在这个功能上的操作都差不多:
如果使用者想与自己的联系人进行聊天,可以双击IM中联系人的头像,在弹出的对话框中输入文字信息发送即可。
QQ的特点是可以给不在线的朋友发送信息,对方下次上线的时候可以收到,MSN虽然不具备这样的功能,但是它在聊天过程中可以使用各种漂亮的表情图标为聊天添加了不少情趣。
如果打字聊天的方式已不能满足,现在的主流IM软件还提供了实时语音聊天,首先您得有音箱或者耳机、麦克风,然后就可以向您的网友发送连接请求,通过后双方不仅可以用文字聊天,还可以直接讲话。
此外QQ还有传送语音功能利用此功能可以传送语音信息。
首先用鼠标左键单击在线好友的头像,选择“传递语音”命令,然后就会弹出一个对话框,录音以后就可以发送了。
1.2课题意义
本设计主要目的是为了满足人们通讯交流的便捷,实现灵活、全面的音、视频信息的传递和服务。
本毕业设计主要实现语音视频聊天、文字聊天等功能,能够在局域网里进行视频聊天的系统软件。
本设计开发采用C/S结构,即客户机与服务器结构,在VC6.0开发环境下,使用C++编程语言进行本软件的开发。
在本文中,将讨论一种基于MFCSocket的局域网通信系统的设计与实现方法。
基于MFCSocket的局域网通信软件可以为局域网提供一种良好、安全、快速的通信机制,在局域网内部通信、教学、讨论等应用中都具有一定的实用价值,它同时很好地诠释了MFCSocket通信的原理。
基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟,比如较早的Icq、MSN、Yahoo!
通等国外开发的产品,还有国产的有名的QQ、XXhi!
,中国移动通信fetion等,这些工具统统都实现了广域网上的即时通信。
所有上述软件都实现了网络即时的文字,视频语音聊天功能。
这些软件,在使用方面各有特色,在实现方面也各有所长,但由于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层TCP/IP,或者UDP/IP协议的软件产品。
在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要简单,但是可以借此理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。
1.3课题任务
本设计主要任务是设计一个基于WINDOWS平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发软件所用的相关技术,具体分析本软件的各个功能及实现方法,说明本软件的设计思想及方法。
本设计在VC6.0环境下使用C++语言编写而成,其主要功能是完成局域网内的IM的基本功能,其中包括:
文字聊天、语音聊天、视频聊天、录音传输等功能。
第二章软件开发技术的工具与环境说明
2.1WIN32SDK编程
所谓的Win32开发,就是在C++语言的层面上,直接使用Win32API(ApplicationProgrammingInterface:
系统开放出来,给程序员使用的接口。
)开发Windows应用程序或者系统程序。
所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是相对应的。
下面是进行直接的Win32SDK方式编程的基本思路或者说是一个框架。
一个Windows程序分为程序代码和UI(UserInterface用户界面)资源两大部分,两部分最后以RC编译程序编译为一个完整的EXE文件。
所谓UI资源是指功能菜单、对话框外貌、程序图标、光标形状等等。
这些UI资源的实际内容借助各种工具产生,并以各种扩展名存在,如.ico.bmp.cur等等。
程序员必须在一个所谓的资源描述档(.rc)中描述它们。
RC编译器(RC.EXE)读取RC文件的描述后将所有UI资源文件集中制作出一个.Res资源文件,再与程序代码结合在一起,这才是一个完整的Windows可执行文件。
1.WinMain函数
main()函数是C++程序的进入点,而WinMain函数则是Windows程序的进入点。
2.Msg结构体
定义了一个Msg结构体,是Windows内设的一种数据格式,在Windows程序中,消息是由MSG结构体来表示的。
3.注册窗口
RegisterClass()完成注册窗口类的功能,设定窗口的属性:
边框、颜色、标题、位置等等。
4.创建窗口
CreateWindow函数可以用于创建父窗口、弹出窗口以及子窗口,在创建窗口时它可以确定窗口类、窗口标题、窗口风格、大小以及初始化位置。
5.显示窗口
创建窗口后需要使用ShowWindow函数用于显示窗口。
6、刷新窗口
调用UpdateWindow函数来刷新窗口。
7.消息循环
初始化工作完成后,WinMain进入所谓的消息循环,使用while循环,不断的GetMessage,再使用TranslateMessage将消息转化,用DispatchMessage将消息传递给窗口函数去处理。
8.获取消息
GetMessage功能函数从消息队列中获取消息,如果消息队列中没有消息,此功能函数则会一直等得消息。
9.转换消息
将特定的消息转换为不同的消息,例如消息队列中同时有WM_KEYDOWN和WM_KEYUP消息时,意味着用户同时按下了键盘上的某几个键,此时TranslateMessage将其转换为一个WM_CHAR消息。
10.将消息发送到回调函数
DispatchMessage通过USER模块的协助将消息送到该窗口的窗口函数去了,但是DispatchMessage并没有指定函数名,却可以将消息传送过去,这是因为消息发生的时候,OS已经根据当时状态,为它标明了所属窗口,而窗口所属的窗口类亦是明确的。
11.WinMain函数返回值
returnmsg.wParam;//返回结构体变量msg中的wParam的值。
12.WindowProc窗口函数
窗口中的生命枢纽:
窗口函数WindowProc。
WindowProc是一个callback函数,常利用switch/case方式判断消息的种类,以决定处理方式。
2.2TCP/IP协议及WINDOWSSOCKETS网络编程接口
2.2.1TCP/IP协议简介
TCP/IP已成为当今计算机网络最成熟、应用最广的互联协议。
Internet采用的就是TCP/IP协议,网络上各种各样的计算机上只要安装了TCP/IP协议,它们之间就能相互通信。
运行TCP/IP协议的网络是一种采用包(分组)交换网络。
TCP/IP协议是由100多个协议组成的协议集,TCP和IP是其中两个最重要的协议。
通常包含了一系列与“TCP(传输控制协议)”和“IP(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。
这些协议的示例是:
UDP(UserDatagramProtocol)协议、ICMP(InternetControlMessageProtocol)协议、ARP(地址解析协议)和其他一些协议的协议组。
TCP和IP两个协议分别属于传输层和网络层,在Internet中起着不同的作用。
2.2.2WindowsSocket网络编程简介
Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。
应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。
WindowsSockets规范定义了一套开放的、支持多种协议的、Windows下的网络编程接口。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数,也包含了一组针对Windows的扩展库函数,使得程序员能充分地利用Windows消息驱动机制进行编程。
现在的WindowsSockets已经基本上实现了与协议无关,你可以使用WindowsSockets来调用多种协议的功能,但较常使用的是TCP/IP协议。
2.3MFC(MicrosoftFoundationClass)
2.3.1MFC简介
MFC是在1992年随微软的MicrosoftC/C++7.0编译器发布的,是建立在WindowsAPI之上的C++类库(C++ClassLibrary),意图是使Windows程序设计过程更有效率,更符合面向对象的精神。
现在MFC已经成为了Windows环境上标准的C++API。
MFC使得开发Windows应用程序变得简单容易,将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。
同时,在VisualC++内部也内建了很多对MFC的非常实用的东西,例如类向导这样的支持,减少软件开发的时间,使用类向导可以生成从helloworld这样的简单程序到活动文档服务器这样的复杂程序。
MFC的消息映射机制也避免了使用性能较低的庞大虚函数表。
MFC在整个Windows家族中都是兼容的。
2.3.2MFC与C语言API的关系
设置Microsoft基本类库与其它Windows类库所不同的唯一特征就是它与C语言编写的WindowsAPI的紧密的映射关系。
而且,可以将直接调用WindowsAPI与调用类库自由地混合起来使用。
这种直接访问并不意味着类可以完全取代API。
开发者有时必须直接调用一些Windows函数,例如,SetCursor和GetSystemMetrics。
只有在有明显优势时,一个Windows函数才被一个类成员函数所替代。
2.3.3MFC类库
MFC类库是一个很大的、扩展了的C++类层次结构,与传统上使用C语言直接访问WindowsAPI相反,MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的Windows程序所必需的,因此用MFC编写的程序要比用C语言编写的程序小得多,当然MFC所编写的程序的性能也毫无损失。
必要时,也可以MFC可以用面向对象的方法来调用WindowsAPI,因为MFC不修改也不隐藏Windows程序的基本结构。
MFC是很庞大的。
例如,版本4.0中包含了大约200个不同的类。
事实上,你可能只需要使用其中的十多个不同的类,就可以建立一个非常漂亮的程序。
MFC层次结构大约可分为几种不同的类型的类:
1.根类:
Cobject
Microsoft基本类库中的大多数类都是由在类层次表中根上的唯一的一个基类派生而来的。
2.MFC应用结构类
MFC应用构造类有助于一个框架应用的构造。
它们对大多数应用提供了通用功能。
可以在框架中填写对于应用特定的功能。
3.窗口、对话和控件类
类CWnd和它的派生类封装了HWND,它是一个Windows窗口。
CWnd可被自己使用,也可以作为派生新类的基类。
类库提供的派生类表示各种窗口。
CWnd是所有窗口的基类。
可以使用CWnd派生出来的一个类,也可以从其中派生出自己的类。
4.绘画和打印类
在Windows中,所有的图形输出都是在一个可视的绘图区上。
这叫作一个设备上下文(或DC)。
MFC提供了封装不同DC类型的类,也提供了对Windows绘图工具,例如位图、刷子、调色板和笔的封装。
5.文件和数据库类
这些类允许将信息存储在一个数据库或一个磁盘文件中。
有两个数据库类的集合─DAO和ODBC─它们提供了相似的功能。
6.Internet和网络类
这些类允许和其它使用ISAPI的计算机或一个WindowsSocket交换信息。
还有创建ISAPI扩展DLL的类的集合和操作Windows套接字的类的集合。
支持连接的类的分类:
ISAPI类、Windows套接字类、Win32Internet类。
7.其它还有简单的数据类型类、OLE类、调试和异常类、数组列表和映射类。
2.4MFC对多线程编程的支持
Win32SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。
VisualC++6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。
CWinThread对象代表在一个应用程序内运行的线程。
运行的主线程通常由CWinApp的派生类提供;CWinApp由CWinThread派生。
另外,CWinThread对象允许一给定的应用程序拥有多个线程。
CWinThread支持两种线程类型:
工作者线程和用户界面线程。
工作者线程没有收发消息的功能:
例如,在电子表格应用程序中进行后台计算的线程。
用户界面线程具有收发消息的功能,并处理从系统收到的消息。
CWinApp及其派生类是用户界面线程的例子。
其它用户界面线程也可由CWinThread直接派生。
CWinThread类的对象存在于线程的生存期。
如果你希望改变这个特性,将m_bAutoDelete设为FALSE。
要使你的代码和MFC是完全线程安全的,CWinThread类是完全必要的。
框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread对象管理。
由于依赖
CWinThread来处理线程局部数据,任何使用MFC的线程必须由MFC创建。
例如,由运行时函数_beginthreadex创建的线程不能使用任何MFCAPI。
为了创建一个线程,调用AfxBeginThread函数。
根据你需要工作者线程还是用户界面线程,有两种调用AfxBeginThread的格式。
如果你需要用户界面线程,则将指向你的CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。
如果你需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。
对于工作者线程和用户界面线程,你可以指定可选的参数来修改优先级,堆栈大小,创建标志和安全属性。
AfxBeginThread线程将返回指向新的CWinThread对象的指针。
与调用AfxBeginThread相反,你可以构造一个CWinThread派生类的对象,然后调用CreateThread。
如果你需要在连续创建和终止线程的执行之间重复使用CWinThread对象,这种两步构造方法非常有用。
创建线程也可以使用API函数:
CreateThread函数完成。
其它还有挂起线程、结束线程等函数,将不再一一详解。
2.5VFW简介
VFW是Microsoft1992年推出的关于数字视频的一个软件包,它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。
VFW的一个关键思想是播放时不需要专用硬件。
为了解决数字视频数据量大的问题,需要对数据进行压缩。
它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。
VFW给程序员提供VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
用户不必专门安装VFW,在安装Windows时,安装程序会自动地安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。
VFW主要由以下六个模块组成:
1.AVICAP.DLL:
包含了执行视频捕获的函数,它给AVI文件、I/O和视频音频设备驱动程序提供一个高级接口;
2.MSVIDEO.DLL:
用一套特殊的DrawDib函数来处理屏幕上的视频操作;
3.MCIAVI.DRV:
此驱动程序包括对VFW的MCI命令的解释器;
4.AVIFILE.DLL:
支持由标准多媒体I/O(mmio)函数提供的更高的命令来访问AVI文件;
5.压缩管理器(ICM):
管理用于视频压缩/解压缩的编解码器(CODEC);
6.音频压缩管理器ACM:
提供与ICM相似的服务,不同的是它适于波形音频。
VisualC++在支持VFW方面提供有vfw32.lib、msacm32.lib、winmm.lib等库。
特别是它提供了功能强大、简单易行、类似于MCIWnd的窗口类AVICap。
AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在将视频流捕获到硬盘上的过程中进行控制。
AVICap支持实时的视频流捕获和单帧捕获,并提供对视频源的控制。
虽然MCI也提供数字视频服务,比如,它为显示AVI文件的视频提供了AVIVideo命令集,为视频叠加提供了overlay命令集,但这些命令主要是基于文件的操作,不能满足实时地直接从视频缓存中获取数据的要求。
对于使用没有视频叠加能力的捕获卡的PC机来说,用MCI提供的命令集是无法捕获视频流的。
而AVICap在捕获视频方面具有一定的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高。
同时,它也可将数字视频捕获到文件。
在视频捕获之前需要创建一个捕获窗,所有的捕获操作及其设置都以它为基础。
用AVICap窗口类创建的窗口(通过capCreateCaptureWindow函数创建)被称为“捕获窗”,其窗口风格一般为WS_CHILD和WS_VISIBLE。
实际上,捕获窗类似于标准控制(如按钮、列表框等)。
捕获窗具有下列功能:
1.将视频流和音频流捕获到一个AVI文件中;
2.动态地同视频和音频输入器件连接或断开;
3.以Overlay或Preview模式对输入的视频流进行实时显示;
4.在捕获时可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件;
5.设置捕获速率;
6.显示控制视频源、视频格式、视频压缩的对话框;
7.创建、保存或载入调色板;
8.将图像和相关的调色板拷贝到剪贴板;
9.将捕获的一个单帧图像保存为DIB格式的文件。
AVICap在显示视频时提供的两种模式:
1.预览(Preview)模式:
该模式使用CPU资源,视频帧先从捕获硬件传到系统内存,接着采用GDI函数在捕获窗中显示。
在物理上,这种模式需要通过VGA卡在监视器上显示。
2.叠加(Overlay)模式:
该模式使用硬件叠加进行视频显示,叠加视频的显示不经过VGA卡,叠加视频的硬件将VGA的输出信号与其自身的输出信号合并,形成组合信号显示在计算机的监视器上。
只有部分视频捕获卡才具有视频叠加能力。
灵活编写AVICap提供的回调函数还可满足一些特殊需求。
比如,将宏capCaptureSequenceNoFile同用capSetCallbackOnVideoStream登记的回调函数一起使用,可使应用程序直接使用视频和音频数据。
在视频聊天的应用程序中可利用这一点来获得视频帧,回调函数将捕获的图像传到远端的计算机。
应用程序可用捕获窗来登记回调函数(由用户编写,而由系统调用),以便在发生下列情况时,它能通知应用程序,作出相应的反应:
捕获窗状态改变;出错;视频帧和音频缓存可以使用;在捕获过程中,其它应用程序处于让步(Yield)地位。
视频捕获编程也要用到涉及视频捕获的结构、宏、消息和函数。
令人高兴的是,发送AVICap窗口消息所能完成的功能都能调用相应的宏来完成。
例如,SendMessag(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)与capDriverConnect(hWndCap,0)的作用相同,都是将创建的捕获窗同视频输入器件连接起来。
视频部分主要是利用VideoCapture函数库来获取影像的。
VideoCapture主要提供下列功能:
连接驱动程序;获取影像、声音资料,并显示在屏幕上或者是存成AVI文件;获取单张影像显示在屏幕上,拷贝至剪贴簿,或者是存成DIB(Device-IndependentBitmap)文件。
VideoCapture的主要结构:
结构体CAPTUREPARAMS主要包含一些获取图像的参数:
DWORDdwRequestMicroSecPerFrame代表相邻两个frame的获取时间间隔;BOOLfYield值为TRUE,则表示Windows会以另一个thread来捕获影像,值为FALSE,程序会在捕捉影像后显示忙碌状态;BOOLfCaptureAudio其值表示是否需要同时获取声音资料。
结构体BITMAPINFO和点阵图有关,主要定义了影像获取之后显示在屏幕上、存储在文件中的格式,它包含两个成员:
BITMAPINFOHEADERbmiHeader描述影像性质的结构,其成员记载了影像的大小、颜色深度和压缩的方式,该成员在VideoCapture、VideoCompressionManager和DrawDib函数库中,以及有关于点阵图的应用中;RGBQUADbmiColors指向colortable第一个元素的位置。
结构体COMPVARS主要是记录所有和压缩相关的信息,重要的成员:
DWORDfccHandler为compressor句柄;LPBITMAPINFOlpbiIn指向待压缩影像BITMAPINFO的指标;LPBITMAPINFOlpbitOut:
指向压缩完影像BITMAPINFO的指标;LONGlKey代表key-framerate,而所谓keyframe是指此frame在解压缩时不需要依赖前面的frame;LONGlQ代表影像压缩后的品质,取值为1~10000的整数。
VideoCompressionFunctions主要