局域网聊天系统的设计与实现毕业设计论文.doc_第1页
局域网聊天系统的设计与实现毕业设计论文.doc_第2页
局域网聊天系统的设计与实现毕业设计论文.doc_第3页
局域网聊天系统的设计与实现毕业设计论文.doc_第4页
局域网聊天系统的设计与实现毕业设计论文.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

局域网聊天系统的设计与实现毕业设计第1章 绪论1.1 课题背景随着internet的不断发展普及,网络通讯成为人们生活中的一部分。网络聊天已和手机等一样,成为人们运用最为广泛的通信工具之一。即时通讯(instant messenger,简称im)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的icq,还是国内用户量第一的腾讯qq,以及微软的msn messenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。而且,现在不少im软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。 im软件的历史并不久远,但是它的出现,就立即受到大家的喜爱,并风靡全球。在它的发展史上,以色列人是功不可没的。正是四位以色列年轻人,在1996年7月成立的mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件icq,取意为“我在找你”“i seek you”,简称icq了。直到现在,icq已经推出了它的2002a版本,在全球即时通讯市场上占有非常重要的地位。 目前,国内最为流行的即时通讯软件是oicq(简称qq)。它以良好的中文界面和不断增强的功能形成了一定的qq网络文化。messenger虽出道较晚,但依托微软的强大背景,实力也不可小视。作为windows xp的一部分,messenger 整合了操作系统的许多功能,体现出了微软的真正实力所在,如多种形式的聊天选择、多人的单窗口讨论式交流以及充分的文件与桌面共享功能等。它的令人耳目一新的中文界面和注册方式,连同它强大的功能,着实吸引了众多的眼球的注视,此外还有许多有特点的im软件。 我们经常听到tcp/ip和udp(用户数据报协议)这两个术语,它们都是建立在更低层的ip协议上的两种通讯传输协议。tcp/ip是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而udp是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。 聊天功能是im软件最基本、也是最重要的功能,基本上每一种im软件在这个功能上的操作都差不多:如果使用者想与自己的联系人进行聊天,可以双击im中联系人的头像,在弹出的对话框中输入文字信息发送即可。qq的特点是可以给不在线的朋友发送信息,对方下次上线的时候可以收到,msn虽然不具备这样的功能,但是它在聊天过程中可以使用各种漂亮的表情图标为聊天添加了不少情趣。 如果打字聊天的方式已不能满足,现在的主流im软件还提供了实时语音聊天,首先您得有音箱或者耳机、麦克风,然后就可以向您的网友发送连接请求,通过后双方不仅可以用文字聊天,还可以直接讲话。此外qq还有传送语音功能利用此功能可以传送语音信息。首先用鼠标左键单击在线好友的头像,选择“传递语音”命令,然后就会弹出一个对话框,录音以后就可以发送了。1.2 课题意义本设计主要目的是为了满足人们通讯交流的便捷,实现灵活、全面的音、视频信息的传递和服务。本毕业设计主要实现语音视频聊天、文字聊天等功能,能够在局域网里进行视频聊天的系统软件。 本设计开发采用c/s结构,即客户机与服务器结构,在vc6.0开发环境下,使用c+编程语言进行本软件的开发。在本文中,将讨论一种基于mfc socket的局域网通信系统的设计与实现方法。 基于mfc socket的局域网通信软件可以为局域网提供一种良好、安全、快速的通信机制,在局域网内部通信、教学、讨论等应用中都具有一定的实用价值,它同时很好地诠释了mfc socket通信的原理。基于局域网的即时通信工具,实际上是互联网即时通信工具的一个小规模版本,广域网上的即时通信工具,如今一般采用udp或者 tcp协议体系来实现,开发技术已经比较成熟,比如较早的icq、msn 、yahoo!通等国外开发的产品,还有国产的有名的qq、百度hi!,中国移动通信fetion等,这些工具统统都实现了广域网上的即时通信。所有上述软件都实现了网络即时的文字,视频语音聊天功能。这些软件,在使用方面各有特色,在实现方面也各有所长,但由于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是各种利用各种平台上的网络通信接口,建构基于下层tcp/ip,或者udp/ip协议的软件产品。在局域网内,这些功能的实现跟广域网相比更加简单,因为局域网的网络结构本身比广域网要简单,但是可以借此理解网络协议,以及网络通信工具的实现原理,所以仍然极具研究价值。1.3 课题任务 本设计主要任务是设计一个基于windows平台的局域网即时聊天工具,然后阐述本软件的功能、特点及使用方法,并详细阐述开发软件所用的相关技术,具体分析本软件的各个功能及实现方法,说明本软件的设计思想及方法。本设计在vc 6.0环境下使用c+语言编写而成,其主要功能是完成局域网内的im的基本功能,其中包括:文字聊天、语音聊天、视频聊天、录音传输等功能。第二章 软件开发技术的工具与环境说明2.1 win32 sdk编程所谓的win32开发,就是在c+语言的层面上,直接使用win32 api(application programming interface:系统开放出来,给程序员使用的接口。)开发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可执行文件。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函数返回值return msg.wparam;/返回结构体变量msg中的wparam的值。12. windowproc窗口函数窗口中的生命枢纽:窗口函数windowproc。windowproc是一个callback函数,常利用switch/case方式判断消息的种类,以决定处理方式。2.2 tcp/ip协议及windows sockets 网络编程接口2.2.1 tcp/ip协议 简介tcp/ip已成为当今计算机网络最成熟、应用最广的互联协议。internet采用的就是tcp/ip协议,网络上各种各样的计算机上只要安装了tcp/ip协议,它们之间就能相互通信。运行tcp/ip协议的网络是一种采用包(分组)交换网络。tcp/ip协议是由100多个协议组成的协议集,tcp和ip是其中两个最重要的协议。通常包含了一系列与“tcp(传输控制协议)”和“ip(网际协议)”有联系的网络协议,它包括其它的协议,应用软件,甚至网络媒介。这些协议的示例是:udp(user datagram protocol)协议、icmp(internet control message protocol)协议、arp(地址解析协议)和其他一些协议的协议组。tcp和ip两个协议分别属于传输层和网络层,在internet中起着不同的作用。2.2.2 windows socket 网络编程简介socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有 socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个socket接口来实现。windows sockets 规范定义了一套开放的、支持多种协议的、 windows 下的网络编程接口。它不仅包含了人们所熟悉的berkeley socket 风格的库函数,也包含了一组针对windows 的扩展库函数,使得程序员能充分地利用windows 消息驱动机制进行编程。现在的windows sockets已经基本上实现了与协议无关,你可以使用windows sockets来调用多种协议的功能,但较常使用的是tcp/ip协议。2.3 mfc (microsoft foundation class)2.3.1 mfc 简介mfc是在1992年随微软的microsoft c/c+ 7.0编译器发布的,是建立在windows api之上的c+ 类库(c+ class library),意图是使windows程序设计过程更有效率,更符合面向对象的精神。现在mfc已经成为了windows环境上标准的c+ api。mfc使得开发windows应用程序变得简单容易,将很多应用程序开发中常用的功能自动化,并且提供了文档框架视图结构和活动文档这样的便于自定义的应用程序框架。同时,在visual c+内部也内建了很多对mfc的非常实用的东西,例如类向导这样的支持,减少软件开发的时间,使用类向导可以生成从hello world这样的简单程序到活动文档服务器这样的复杂程序。mfc的消息映射机制也避免了使用性能较低的庞大虚函数表。mfc在整个windows家族中都是兼容的。2.3.2 mfc与c 语言api 的关系设置microsoft 基本类库与其它windows 类库所不同的唯一特征就是它与c 语言编写的windows api 的紧密的映射关系。而且,可以将直接调用windows api 与调用类库自由地混合起来使用。这种直接访问并不意味着类可以完全取代api。开发者有时必须直接调用一些windows函数,例如,setcursor 和getsystemmetrics。只有在有明显优势时,一个windows 函数才被一个类成员函数所替代。2.3.3 mfc类库mfc类库是一个很大的、扩展了的c+类层次结构,与传统上使用 c 语言直接访问 windows api 相反,mfc已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用c编写的 windows 程序所必需的,因此用 mfc 编写的程序要比用c 语言编写的程序小得多,当然mfc 所编写的程序的性能也毫无损失。必要时,也可以mfc可以用面向对象的方法来调用windows api,因为 mfc 不修改也不隐藏 windows 程序的基本结构。mfc 是很庞大的。例如,版本4.0 中包含了大约200个不同的类。事实上,你可能只需要使用其中的十多个不同的类,就可以建立一个非常漂亮的程序。mfc层次结构大约可分为几种不同的类型的类:1. 根类:cobjectmicrosoft 基本类库中的大多数类都是由在类层次表中根上的唯一的一个基类派生而来的。2. mfc 应用结构类mfc 应用构造类有助于一个框架应用的构造。它们对大多数应用提供了通用功能。可以在框架中填写对于应用特定的功能。3. 窗口、对话和控件类类cwnd 和它的派生类封装了hwnd,它是一个windows 窗口。cwnd可被自己使用,也可以作为派生新类的基类。类库提供的派生类表示各种窗口。cwnd是所有窗口的基类。可以使用cwnd 派生出来的一个类,也可以从其中派生出自己的类。4. 绘画和打印类在windows 中,所有的图形输出都是在一个可视的绘图区上。这叫作一个设备上下文(或dc)。mfc 提供了封装不同dc 类型的类,也提供了对windows 绘图工具,例如位图、刷子、调色板和笔的封装。5. 文件和数据库类这些类允许将信息存储在一个数据库或一个磁盘文件中。有两个数据库类的集合 dao 和odbc它们提供了相似的功能。6. internet 和网络类这些类允许和其它使用isapi 的计算机或一个windows socket 交换信息。还有创建isapi 扩展dll 的类的集合和操作windows 套接字的类的集合。支持连接的类的分类:isapi 类、windows 套接字类、win32 internet 类。7. 其它还有简单的数据类型类、ole 类、调试和异常类、数组列表和映射类。2.4 mfc对多线程编程的支持win32 sdk函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。visual c+ 6.0中,使用mfc类库也实现了多线程的程序设计,使得多线程编程更加方便。cwinthread对象代表在一个应用程序内运行的线程。运行的主线程通常由cwinapp 的派生类提供;cwinapp由cwinthread派生。另外,cwinthread对象允许一给定的应用程序拥有多个线程。cwinthread支持两种线程类型:工作者线程和用户界面线程。工作者线程没有收发消息的功能:例如,在电子表格应用程序中进行后台计算的线程。用户界面线程具有收发消息的功能,并处理从系统收到的消息。cwinapp及其派生类是用户界面线程的例子。其它用户界面线程也可由cwinthread 直接派生。cwinthread类的对象存在于线程的生存期。如果你希望改变这个特性,将m_bautodelete设为false。要使你的代码和mfc是完全线程安全的,cwinthread类是完全必要的。框架使用的用来维护与线程相关的信息的线程局部数据由cwinthread 对象管理。由于依赖 cwinthread来处理线程局部数据,任何使用mfc 的线程必须由mfc创建。例如,由运行时函数_beginthreadex创建的线程不能使用任何mfc api。为了创建一个线程,调用afxbeginthread函数。根据你需要工作者线程还是用户界面线程,有两种调用afxbeginthread 的格式。如果你需要用户界面线程,则将指向你的cwinthread派生类的cruntimeclass的指针传递给afxbeginthread。如果你需要创建工作者线程,则将指向控制函数的指针和控制函数的参数传递给afxbeginthread。对于工作者线程和用户界面线程,你可以指定可选的参数来修改优先级, 堆栈大小, 创建标志和安全属性。afxbeginthread线程将返回指向新的cwinthread对象的指针。与调用afxbeginthread相反,你可以构造一个cwinthread派生类的对象,然后调用createthread。如果你需要在连续创建和终止线程的执行之间重复使用cwinthread对象,这种两步构造方法非常有用。创建线程也可以使用api函数:createthread函数完成。其它还有挂起线程、结束线程等函数,将不再一一详解。2.5 vfw简介vfw是microsoft 1992年推出的关于数字视频的一个软件包,它能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。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相似的服务,不同的是它适于波形音频。visual c+在支持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)的作用相同,都是将创建的捕获窗同视频输入器件连接起来。视频部分主要是利用video capture函数库来获取影像的。video capture主要提供下列功能:连接驱动程序;获取影像、声音资料,并显示在屏幕上或者是存成avi文件;获取单张影像显示在屏幕上,拷贝至剪贴簿,或者是存成dib(device-independent bitmap)文件。video capture的主要结构:结构体captureparams主要包含一些获取图像的参数:dword dwrequestmicrosecperframe代表相邻两个frame的获取时间间隔;bool fyield值为true,则表示windows会以另一个thread来捕获影像,值为false,程序会在捕捉影像后显示忙碌状态;bool fcaptureaudio其值表示是否需要同时获取声音资料。结构体bitmapinfo和点阵图有关,主要定义了影像获取之后显示在屏幕上、存储在文件中的格式,它包含两个成员:bitmapinfoheader bmiheader描述影像性质的结构,其成员记载了影像的大小、颜色深度和压缩的方式,该成员在video capture、video compression manager和drawdib函数库中,以及有关于点阵图的应用中;rgbquad bmicolors指向color table第一个元素的位置。结构体compvars主要是记录所有和压缩相关的信息,重要的成员:dword fcchandler为compressor句柄;lpbitmapinfo lpbiin指向待压缩影像bitmapinfo的指标;lpbitmapinfo lpbitout:指向压缩完影像bitmapinfo的指标;long lkey代表key-frame rate,而所谓key frame是指此frame在解压缩时不需要依赖前面的frame;long lq代表影像压缩后的品质,取值为110000的整数。video compression functions主要记录压缩功能相关的信息,其包含的比较重要的成员:iclocate输入指向压缩前后bitmapinfo的指标,以及欲使用的codecs;iccompressorchoose呼叫一个系统内建的对话,其中包含所有可能使用的codes以及其相关参数;iccompressquery询问compressor是否支持某种压缩方式,输入参数为compressor handle及指向压缩前后bitmapinfo的指标,此函数会传回询问结果;iccompressbegin要求系统准备相关资源以供压缩之用;iccompress压缩某个frame;iccompressend归还相关资源给系统;icdompressquery询问decompressor是否支持某种解压缩方式;icdompressbegin要求系统准备相关资源以供解压缩之用;icdompress解压缩某一个frame;icdompressend归还相关资源给系统;icdompressfree归还compvars所占用的资源。2.6 vc+ 6.0 简介我们通常所说的visual c+实际上是一个完善的、非常强大的c+程序开发环境,它的名字是 microsoft developer studio 。二者之间的细小差别并不重要,通常这两个术语可以互换。但如果你不围绕developer studio 来进行学习,就不能有效地使用visual c+(developer studio 听起来很像visual studio , 但它们之间没有关系)。它包含:c+编译器、调试器、应用程序框架生成器、项目管理器、设计和实现菜单等资源的编辑器等等。第三章 系统功能分析3.1 系统功能模块图 图3.1 系统功能模块图 3.1.1 文字聊天文字聊天采用的是tcp模式,包括服务器端(server)和客户端(client)。首先启动服务器端,客户端通过用户名和密码登录服务器,服务器响应客户端登录并提示有用户登录,此时两个用户就可以进行文字聊天,在文字聊天时信息通过服务器中转,而每个用户可以同时与多个用户进行文字聊天。当有用户退出时,服务器做出响应,提示在线用户,下线用户。文字聊天流程图如图3.2。 图3.2 文字聊天流程图 3.1.2 语音视频聊天语音视频聊天时采用的是udp模式,客户端与客户端点对点的进行,不需要经过服务器端中转。在文字聊天的基础上,客户端之间可以进行自行处理的语音视频聊天,运用vfw函数库中的函数对usb口输入的数字视频信息进行相关处理,比如:视频捕获、影像压缩以及影像播放等,同时利用线程来处理声音部分的录制、回放等。a客户端向b客户端请求语音视频聊天是通过b客户端的用户名来获得b客户端的ip地址,并向b客户端发送语音视频聊天请求,当b客户端接受后捕获视频,并进行压缩传输到a客户端解压并进行播放,在b客户端接受视频的同时,a客户端也捕获视频,压缩传输到b客户端解压并进行显示。语音视频聊天流程图如图3.3。 图3.3 语音视频聊天流程图3.2 系统特点程序较小,启动速度快。启动后的应用界面要清爽,设计要简单明了,具有较高的易用性。在遇到可预知的故障与情况时,能提示用户并自动退出。在遇到不可预知的故障时能安全退出。3.3 运行环境硬件环境: 计算机两台,如下:cpu: 1ghz 以上内存:256mb以上硬盘:20gb以上其它:分别配有摄像头、麦克风、音响或者耳机等外部设备软件环境: windows xp/7操作系统microsoft visual stdio 6.0 3.4 性能需求分析1. 可靠性高能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。2. 宜操作性,程序简单易懂,用户能很容易看懂并使用。3.5 界面设计3.5.1 服务器登录界面图3.4 服务器登录界面3.5.2 用户登录界面 图3.5 用户登录界面 3.5.3 用户登陆后界面 图3.6 用户登录后的界面第四章 详细设计及编码实现4.1 tcp套接字的运用在文字聊天时,服务器端与客户端的连接是采用的tcp套接节进行连接。tcp套接字的使用如下图。创建csocket对象csocketserver来处理服务器端与客户端的连接,csocket继承于casyncsocket,是windows socket api的高层抽象。csocket通常和csocketfile以及carchive类混合使用,这两个类负责数据的发送和接收。要使用csocket对象,首先要调用构造函数,然后调用create函数创建一个socket句柄。csocket函数缺省是创建一个流socket;如果没有使用carchive类,那么还可以创建一个数据报socket。服务器端调用accept,客户端调用connect,然后创建一个csocketfile去关联csocket。接下来的操作可以创建carchive对象关联csocketfile,以用来发送和接收数据。 图4.1 tcp套接字的运用图4.2 文字聊天的实现chatserver服务器运行时,利用一个csocket对象csocketserver启动服务器,用函数gethostname来获得服务器端主机名和ip,同时在服务器对话框中显示服务器ip,并将分配的固定端口号8123显示在对话框中。用一个list列表显示在线用户,随时更新用户登录情况,用一个edit box显示客户端的聊天内容以及系统提示消息。每一个chatclient客户端启动时,利用服务器内定的用户号和密码来登录。在整个系统中,利用链表来处理所有的用户信息:当有用户登录时,在链表尾部加入该用户信息;当用户下线时,在该链表中删除用户,并提示所有用户,该用户下线。在对链表进行操作的同时,要更新list列表中的信息。 图4.2 需要使用指定的用户名密码登录 图4.3 服务器运行后界面当用户登陆后服务器显示了该用户的登录,并且记录了当前在线用户的人数。用户之间两两间进行文字聊天时,发送信息的处理函数如下:void cchatclientdlg:onchatbtsend() /发送信息按键if( !m_bconnect)setmessagebox(请连接服务器!rn);return ;cstring str;cstring szusername;cmesg msg;getdlgitemtext(idc_message,str);getdlgitemtext(idc_username,szusername);if( str.getlength() = 0 )setmessagebox(请输入想要发送的信息!rn);return ;if ( szusername.getlength() sendm(&msg);addreceiver(szusername , true);addchatmessage(str);下图为两个用户之间的文字聊天以及服务器上的显示 图4.4 用户heteng对aaa发送的文字信息 图4.5 用户aaa接受到heteng所发出的文字信息 图4.6 服务器所显示两个用户之间的文字对话4.3 语音视频聊天的实现在实现语音视频聊天时,采用的是基于udp套接字的点对点模式,即用户与用户之间的数据传输。其套接字的使用如下图。 图4.7 语音视频聊天套接字图4.4 视频的捕捉利用vfw接口,视频捕获可以分为以下几个步骤:1. 建立视频采集窗口:该窗口用来接收视频捕捉驱动程序传来的数据和消息。2. 连接视频驱动程序:将建立的视频捕捉窗口与视频设备驱动程序相连。3. 视频捕获初始化。4. 视频捕捉设置:vfw下视频捕捉参数的设置可以通过调用函数或弹出对话框的形式来实现。一般视频驱动程序允许设置的参数包括视频源选择、视频格式、视频显示格式等。5. 设置回调函数:通过回调函数来通知程序视频事件的发生,比如捕捉一帧图像成功的消息,捕捉出错的消息等。6. 结束捕捉:结束捕捉是应该有一些清除工作。如释放分配的内存,断开捕捉窗口与视频捕捉驱动程序的连接,清除视频捕捉窗口等。窗口类为捕获数字视频流及其相关操作提供了很大的方便,灵活编写其中的回调函数可满足实时视频传输的需要,例如应用程序可直接从缓冲中取得数字视频并对其进行压缩编码后实时地传到远端的客户端。在vc+中,采用vfw技术,客户端通过capsetcallbackonframe()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,然后再回调函数中使用icseqcompressframe()函数进行压缩。然后再通过winsock将压缩后的数据发送到另一客户端。该客户端接收完一帧以后,交给icdecompress()解压,最后用setdibitstodevice()将图像显示出来。基本的捕获设置包括设置捕获速度(每秒捕获多少帧)、是否同时捕获声频、捕获缓冲、允许最大丢失多少帧和是否使用dos内存,以及使用键盘的哪个键或鼠标的哪个键来终止捕获等内容,这些设置使用captureparams结构来描述,capcapturegetsetup宏来得到当前的设置,然后改变此结构的成员变量,再使用capcapturesetsetup宏设置新的设置。设置捕获速度,通过使用capcapturegetsetup宏来得到当前的捕捉速度,将当前的捕捉速度保存在captureparams结构的dwrequestmicrosecperframe成员变量中,也可以通过设置此变量来改变当前设置值。设置终止捕获,同样通过使用capcapturegetsetup宏来得到当前的设置,当前按键设置保存在captureparams结构的vkeyabort成员中,鼠标设置保存在fabortleftmouse和fabortrightmouse成员中,通过修改可以设置新的热健或者鼠标左右键,修改完成后,使用capcapturesetsetup宏来进行更新。捕获的时间限制,用captureparams结构中的flimitenabled表示捕获是否有时间的限制,wtimelimit用来设置指示捕获最大的持续时间,其单位为秒。使用capcapturegetsetup宏来得到当前的设置值。下面程序为设置captureparams结构的实现代码:bool videocapture:setcapturepara()captureparms capparms=0;capcapturegetsetup(m_capwnd,&capparms,sizeof(capparms);/得到当前的捕获速度capparms.fabortleftmouse = false;capparms.fabortrightmouse = false;capparms.fyield = true;capparms.fcaptureaudio = false;capparms.wpercentdropforerror = 80;if(!capcapturesetsetup(m_capwnd,&capparms,sizeof(capparms)/log.writestring(n failed to set the capture parameters );return false;/ set video format capgetvideoformat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiheader.biwidth=image_width;m_bmpinfo.bmiheader.biheight=image_height;bool ret=capsetvideoformat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.writestring(n video parameters set properly);return ret;/终止一个捕获任务bool videocapture:stopcapture()capcapturestop(m_capwnd);capcaptureabort(m_capwnd);sleep(500); return true;4.5 窗口的捕捉在捕获前必须创建一个捕获窗口(capture widnow),下面介绍有关捕获窗口的情况:创建一个avicap捕获窗口,用capcreatecapturewindow函数并返回一个句柄。将捕获窗口连接至捕获设备,用capdriverconnect函数来使一个捕获窗口与一个捕获设备连接或关联连接上后,就可以通过捕获窗口向捕获设备发送各种消息,可以使用函数capgetdriverdescription来获得已安装的捕获设备名称及版本,将其列举在实现程序过程中。再利用capdrivergetname函数来得到捕获设备的名称将获得的版本发送到capdrivergetversion。如果断开捕获窗口与捕获设备的连接用capdriverdisconnect。捕获窗口的状态,用capgetstatus函数来获得当前捕获窗口的状态,得到一个capstatus结构的拷贝。该结构的内容包含了图片的尺寸、卷轴的当前位置、overlay和preview是否已设置。由于其信息是动态的,每当捕获的视频流的尺寸发生改变,程序应该在获取捕获设备的视频格式以后及时进行刷新。而捕获窗口尺寸的改变并不影响实际的捕获视频流的尺寸。该尺寸由视频捕获设备的格式和视频对话框决定。/捕获窗口bool videocapture:initialize() char devname128=0,devversion128=0; int index=0; bool ret = true, ret1 = true, ret2 = true, ret3 = true; trace(videocapture:initializen); /创建一个avicap捕获窗口 m_capwnd = capcreatecapturewindow(capture,ws_popup,0,0,1,1,0,0);if(!m_capwnd)return false;/connect callback functionsret = capsetuserdata(m_capwnd,this);/change destroy functions also. ret1 = capsetcallbackonvideostream(m_capwnd,oncapturevideo); /得到已安装的捕获设备的名称及版本ret2 = capgetdriverdescription(index,devname,100,devversion,100);/ connect to webcam driver/使一个捕获窗口与一个捕获设备连接或关联ret3 = capdriverconnect(m_capwnd,index);if(!(ret & ret1 & ret2 & ret3)/ device may be open already or it may not hav

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论