语音识别技术原理及应用_第1页
语音识别技术原理及应用_第2页
语音识别技术原理及应用_第3页
语音识别技术原理及应用_第4页
语音识别技术原理及应用_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、语音AgentNet的整体实现张宇伟第2 页摘要:本文论述了一个人机对话应用的实现(我命名它为 AgentNet)。其应用实例为 一种新的整合了语音技术的智能代理网络效劳。效劳器端开发使用了微软 SQL SERVER 7.0 技术,客户端使用了微软Agent ,微软 Speech SDK5 语音合成,和语音识别技术。网络连接使用了 SOCKET 技术,并论述了高层网络协议的实现。:关键词 人机对话,MS-AGENT,语音合成,语音识别,网络编程AbstractAbstractThis paper discuss a new actualization of man-machine conver

2、sation application,which is based on a modal of network service. And I name this service with the name ofAgentNet.The development of this service used Microsoft SQL SERVER 7.0. And the clientused the technology of Microsoft Agent, TTS (Text To Speech),SR(Speech Recognition).Alsothe client and the se

3、rver connect with SOCKET. On the SOCKET, the paper discuss thedevelopment of High-Level net protocol.KeyKey WordsWordsMan-Machine Conversation, MS-AGENT, TTS , SR ,Net Work Programming第3 页目录第一章概述.5.1.1 当前人机对话模型分析 . 51.2当前网络应用分析 .5.1.3AgentNet 概念.6.第二章语音合成及语音识别技术.62.1 语音技术概述 .6.2.2 微软语音技术 .7.第三章 Agen

4、t 技术介绍 .8.3.1Microsoft Agent 技术介绍.8.3.2Microsoft Agent 技术应用原理 .9第四章开发系统介绍. 1.14. 1 Microsoft Development Studio 6.0.1 13. 2 Microsoft SQL SERVER 2000 .1.3第五章系统实现. 1.45.1 需求分析.1.45.2 模块分析. 客户端模块. 效劳器端模块. 1.75.3 具体实现细节.185.3.1 客户端界面层. 客户端核心层. 245.3.3 客户端功能层. 255.3.4 客户端网络层. 295

5、.3.5 效劳器端网络层. 315.3.6 效劳器端核心层. 335.3.7 效劳器端功能层.335.3.8 效劳器端数据层.34第4 页第六章使用手册.36操作系统要求.36硬件要求.36效劳器端安装.36客户端支撑软件的安装.36第七章总结与展望.37参考文献.38第5 页第一章概述1.1 当前人机对话模型分析当前研究人机界面正成为计算机行业的研究重点。现在的研究成果主要集中在让电脑听懂说话方面,旧 M 首先推出了语音识别技术,微软、摩托罗拉等公司也都 展开了大量研究。成熟的语音平台软件包有微软的Speech SDK、旧 M 的ViaVoice ,等等。目前全球人机界面研究的重点,正从研究

6、计算机如何运行转向研究人的行 为,主要包括的领域有:语音上网、多模式对话管理、语音和视觉相结合、现有 芯片结合改造等。在英特尔中国研究中心,电脑已可进行语音天气、股票查询, 你只要说出股票名称,它就会告诉你现在的股价;而一位研究人员在写文章时, 一边用手写板写,一边说: 填加四行表格删除两行,而不必像过去那样自己动手圆表、不停地按删除键。朱来,人们在与电脑交流时,可能根本见不到电脑,出任英特尔人机界面总框架师的颜永红博士说,无论你是坐在沙发上还是躺在床上, 只要手头有一 个类似话筒、手写板或者遥控器之类的小玩意,就可以和电脑无线连接指挥它工 作。本文以下章节讨论了微软语音软件的应用。1.2 当

7、前网络应用分析Internet 自 60 年代出现以来蓬勃开展,近年来以惊人的速度增长 一一连网主 机量每年翻一番,万维网站点每半年翻一番 .同时伴随多媒体技术的飞速开展, Internet 上多媒体应用层出不穷,多媒体信息的数量与日俱增.Internet 已逐步由单 一的数据传送网向数据、语音、图像等多媒体信息的综合传输网演化.第6 页1.3 AgentNet 概念正当计算机应用,尤其是网络应用不断增加的时候,计算机用户被许多操作 所迷惑。对此,我们提出 AgentNet 的概念。AgentNet 它是一种新的人机界面的 尝试。通过它,用户可以用语音告诉 AgentNet 帮你工作。比方:你

8、说一句喂,老 头,有没有邮件呀? 老头,是AgentNet的客户精灵的名字,你当然可以任意设置它的名 字,AgentNet就会帮你收邮件。乂比方你说:“有没有什么新闻呀? ,它就会 为你通报你感兴趣的新闻,等等许多智能的功能。要实现我们的目标,我们在智能代理Agent技术上,整合了语音合成和 语音识别技术。同时实现了一套自己开发的网络协议, 为以后增加新的智能效劳 提高了方便。实现的困难在丁:要把现成的许多较新的概念模型实现如智能代理的实现 等,并整合以往的各种成熟的技术如网络模型的实现、语音技术的运用等等。后继章节将讨论其具体问题。第二章语音合成及语音识别技术2.1 语音技术概述语音识别技术

9、是信息领域的标志技术, 这项被科学家称为 比登月还难的研 究,在计算机飞速开展的带动下,有了重大的突破。语音识别技术日臻成熟,目 前正处丁向产品化迈进的转折阶段。 语音识别作为人机对话的手段,在计算机日 益增长的今天,愈发显得出其在 IT 产业中的重要地位。人机对话 梦想成真人机对话,让电脑听懂人的语言是二十世纪人类的理想之一。对丁绝大多数人而言,电脑输入绝不是一件令人愉快的事情,人们心中希望计算机是个能听会说的工作伙伴,而不是今天这股乂聋乂哑毫无生气的复杂机器。直接对计算 机发号施令,解放出我们的双手,在任何状态不只限丁坐在那里敲键盘下与 计算机进行互动交谈式的操作是数字化生存时代的效率表达

10、和人性化工作方式 的完满结合。Microsoft 公司的总裁比尔 盖茨认为:下一代的操作系统以及应用 程度的用户界面将摒弃键盘和鼠标,代之以真正意义的人第7 页机对话。从另一方面看,微电子技术开展到今天,摩尔定理仍惊人的准确,计算机和 电子通信设备日益微型化。在小型化minianturization的趋势下,袖珍型的掌 上电脑已有了 实验室产品不久将出现在你我的手中,由此不难看到,计算机将 会微缩成腕上的手表般大小。显而易见,如假设仍采用键盘输入是不可能的,还有 其它类似控制仪器或通讯设备的键盘,也将在微型化的潮流之中成为众欠之的遭 到淘汰。由此,语音输入便成为唯一的最正确选择。人们将完全抛弃

11、键盘,对着手 表大小的腕上计算机或,轻声说出想要计算机完成的工作或是说出要拨打的号码。 乙切尽在数!中。有限的词汇无限的应用语言是人类交流的第一手段。而语言本身也正随着社会的开展而不断地更新变异,人们终其一生都在自觉或不自觉地进行着语言的学习和更新。无疑这种变化将成为计算机语音识别的重大难点。随心所欲地同计算机交谈是人类追求机 器智能化的最高境界,这种 智能听写机构成的系统是无限词汇无限命令集 的语音识别,其技术难度远高丁 有限命令集,就目前的研究水平,研制一些有 限词汇有限命令集的专听写用系统是尽快将语音技术扩大应用范围、推向市场的快捷途径。2.2 微软语音技术Speech 概述微软 Spe

12、ech SDK 5.0 是微软公司的语音开发软件包工具。其工具、信息、引擎和样品帮助,与微软公司 API 5.0 结合起来成为一个软 件包。SpeechSDK 也包括微软公司的先进的语音识别引擎和微软公司的 Concatenative 的语音合成引擎以前代号为的“ wistler SAPI 5.0 由 2 个接口:应用程序设计接口API和设备驱动程序接口 DDI 构成。SAPI的 5.0 API 显著地减少了使用语音识别的应用和综合的代码。SAPI 的 5.0 DDI 和 API 除掉了许多类似在语音合成和识别引擎的多线程,第8 页在声音的装置管理和方便的应用的实现细节APIAPI 事件 Sp

13、eech SDK 语音合成和语音识别与应用程序的接口,是通过接收API 事件完成。例如,正文的词,或通用的短语被识别的时候成生了 API 事件。语音合成 APIAPI应用程序使用接口 - ISpVoice,使 API 完成根本语音合成。应用程序通过具有CLSID_SpVoice 的 COM CoCreateInstance 方法得到ISpVoice 接口得到 COM 接口指针。应用程序能通过 ISpVoice: Speak 的方法合成语音,将把要合成的语音的文 本通过参数传递给 Speech SDK。语音识别 APIAPI就像 IspVoice 作为语音合成 API 一样,ISpRecoCon

14、text 是给语音识别的主 要的接口对象指针。通过设置NotifySink 识别事件陷阱池,应用程序可以捕获语音识别完成事件。第三章Agent技术介绍3.1 Microsoft Agent技术介绍Microsoft Agent 最早出现在 Office 95 中, 主要用丁 Office 的帮助, 微软称 之为“Office助手-是在一个小窗口内播放各种幽默的卡通动画,而且这些动 画是随特定的操作不同而改变,这就给使用电脑的人增添了许多乐趣。不过这种方式在现在看来是很“简陋的,不直观也不形象生动。ApplicationApplicationSAP I RuntimeRecognitionEng

15、meSynthesisEngiine第9 页1997 年微软推出 Agent 1.5 版,从界面上彻底脱离了窗口的限制,而变得非 常形象生动,而且其核心采用了基丁 COM 的 ActiveX 控件方式,这就意味着 Agent 可以在 Visual C+、VisualBasic、Html 以及所有支持 ActiveX 的开发语言很方 便的进行二次开发。同时其它领域的相关技术也很好的应用到Agent 中来,如语音合成、语音识别等技术这里需要特别提出的是有关中文语音合成和识别至尽 尚未应用丁Agent,不能不说是一种遗憾。这样 Agent 就转变为新一代会说能听 的智能界面,其深远意义显而易见。伴随

16、着新世纪的到来,微软发布的 Office2000 中彻底的应用了 Agent 的技术 应该说基丁 Agent 2.0,听说英文版的 Office 2000 可支持语音提示和语音命令识 别,而且微软的新一代操作系统 Windows2000 完全内置了 Agent 的组件系统, 可见微软对 Agent 抱有极大的兴趣的。总之 Agent 是一个非常有开展前途的技术,目前国外已有不少基丁 Agent 的 软件,如TalkMail 等,国内也有局部英语学习软件使用了Agent 的技术。但是由丁 Agent 的语音模块只使用到了 Speech Sdk 4.0 ,语音模块不支持中文,语 音识别率低。所以,

17、本设计没有使用Agent 自带的语音技术,而采用最新的语音 Speech Sdk 5.0 的底层调用,支持简体中文,合成和识别。而对丁 Agent 界 面模块使用到了动画技术,作为人机交流的界面。3.2 Microsoft Agent 技术应用原理对 Agent 编程的方法主要有使用 VB,VC 等语言进行 ActiveX 调用,除此之 外还有直接通过VC 进行 COM 编程调用。在 VB 中调用 Agent 是最简单不过了, 但由丁 VB 程序本身存在诸多缺陷,彳艮难在实际中应用。而在 VC 中,由丁 Agent 内部完全采用了 UNICODE 编码,同时还要处理各 种繁杂的 COM 接口,

18、存在一定的难度,但效率较高。:原理介绍应用程序和 Agent Server 的连接是通过 COM 调用来实现的。将一个 Agent 控制加载相应的动画和语音码我们称之为“角色,一般使用COM 调用创立一个 Agent 角色,第10页应用程序和 AgentServer 的连接方法使用 COK 调用创立一个Agentfe 方法第11页第四章开发系统介绍4. 1 Microsoft Development Studio 6.0本软件的开发使用了 微软的 Microsoft Development Studio 6.0 中的一员VC+ 6.0。现大概介绍一下 VC+编程的特点。Visual C+作为一

19、个功能非常强大的可视化应用程序开发工具,是计算机 界公认的最优秀的应用开发工具之一。Microsoft 的根本类库 MFC 使得开发Windows 应用程序比以往任何时候都要容易。理解 VC 工程Visual C+作为一种程序设计语言,它同时也是一个集成开发工具,提供 了软件代码自动生成和可视化的资源编辑功能。在 VC 中,应用程序是以 Project 的形式存在的,Project 文件以.dsp 扩展名,在 Workspace文件中可以包含多个 Project,由 Workspace 文件对它们进行统一的 协调和管理。MFC编程特点近几年来,面向对象技术无论是在理论还是实践上都在飞速地开展。

20、面向对象技术中最重要的就是“对象的概念,它把现实世界中的气球、自行车等客观 实体抽象成程序中的“对象。这种“对象具有一定的届性和方法,这里的届 性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞,自行车能滚动等。一个具体的对象可以有 许多的届性和方法,面向对象技术的重要特点就是对象的封装性,对丁外界而言,并不需要知道对象有哪些届性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象 本身的细节问题,大局部的时间是

21、放在对对象的方法的调用上,组织这些对象进行协同工作。MFC 的英文全称是 Microsoft Fundation Classeq 即微软的根本类库, MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户第12页界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方 面。这一点正是微软提供 MFC 类库最重要的原因,在这个类库中包含了一白多 个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个 对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还

22、可以利用面向对象技术中很重要的“继承方法从类库中的已有对象派生 出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之 外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创立全新的对象,并根据需要不断完善对象的功能。正是由丁 MFC 编程方法充分利用了面向对象技术的优点,它使得我们编程 时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完 成我们程序中的绝大局部所需功能,这使得应用程序中程序员所需要编写的代码 大为减少,有力地保证了程序的良好的可调试性。最后要指出的是 MFC 类库在提供的对象的各种届

23、性和方法都是经过谨慎的 编写和严格的测试,可靠性很高,这就保证了使用 MFC 类库不会影响程序的可 靠性和正确性。程序结构剖析下面为一个表示程序中的主要类之间的关系的图表:这个图表表示了使用 MFC 方式的应用程序的四个主要类之间的关系,从中 可以看出,CMYAPP类主要的作用是用来处理消息的,它统一管理程序收到的 所有的消息,然后把消息分配到相应的对象。CMAINFRAME 是 CMYVIEW 的父类,也就是说视窗VIEW 显示在主框窗 MAINFRAME 的客户区中。类第13页CMYVIEW 的作用是显示数据,而数据的来源是类 CMYDOC,在 MFC 程序中, 程序的数据是放在文档当中的

24、,而显示数据那么是利用视窗方式,文档与视窗别离 带来的好处就是一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。 文档与视窗别离的另一个好处就 是在程序中可以处理多个文档,通过对不同的视窗的处理到达对不同的文档分别 处理的目的。使用过传统的 WINDOWS 编程方法的人都知道,在应用程序中有一个重要 的函数 WINMAIN (),这个函数是应用程序的根底,用户的操作所产生的消息 正是经过这个函数的处理派送到对应的对象中进行处理。而在MFC 方式的WINDOWS 应用程序中,用来处理消息的是系统自动生成的MFC 中的类CWINAPP 的派生类 CM

25、YAPP。3. 2 Microsoft SQL SERVER 2000使用 SQL Server 2000 的最新增强功能开发数据库解决方案。建立在 SQL Server 7.0 可扩展根底上的 SQL Server 2000 代表着下一代 Microsoft .NET Enterprise Servers (企业效劳器)数据库的开展趋势。 SQL Server 2000 是为创立 可伸缩电子商务、在线商务和数据仓储解决方案而设计的真正意义上的关系型数 据库管理与分析系统。SQLSQL ServerServer 20002000 的新特性平安的应用程序管理。更高的可伸缩性和可靠性。数据仓库解决

26、方案的可伸 缩性。最大的正常运行时间和可靠性。 集成的和可扩展的分析效劳。简单的管理 和调整。增强和简化的事务处理SQL (T SQL)开发和调试。灵活的和可扩 展的数据转换。第五章系统实现5.1 需求分析本设计的目标是利用语音技术和动画技术作为与用户交流的主要人机界面。用户通过语音识别控制程序运行, 程序通过语音合成通知现在运行状况。 而作为 被控制的对象是一个网络效劳模型。用户登陆上 AgentNet 效劳器上以后,可以要求读新闻,与同时登陆到 AgentNet 的其他客户通讯等等。在客户端用户可用语音控制去完成接收电子邮件等日常工作。第14页总体软硬件结构示意图5.2 模块分析5.2.1

27、5.2.1 陪户端模块目标:用户登陆 AgentNet 后,出现 Agent 动画界面,所有的功能可通过语 音控制,也可通过传统界面控制。功能包括:登陆、系统设置、人机聊天、读文 本、邮件、看 AgentNet 新闻、通讯可与同时登陆到 AgentNet 的客户通讯等。第15页网络JE客户端模块分析共分 3 层界面层分析:层模块名模块输入模块输出模块输出对像备注界面层语音识别(SR)用户通过话筒的普通话语言命令号核心处理层命令号由srgrammar.xml的 xml 文件定义,核心层的接收命令并执行。语音合成核心层的合成后通用户声卡默认以简客户端模块图界面JE核心房功能层用户认证人机再天邮件其

28、它第16页(TTS)字符串过声卡以声音流输出(soundstream)所连音响体中文合成语音。Agent 界面核心层的Agent 动作命令Agent 动画动作用户界面传统界面按钮、菜单Windows 窗口等核心处理层响应传统的菜单、鼠标事件,显示窗口核心层分析层模块名模块输入模块输出模块输出对像备注核心层核心处理界面层的语音命令号,菜单、鼠标等事件,功能层动作成后的事件到界面层 的需要语音合 成字符串、Agent 动作命 令、Windows 窗 口界面元素。功 能层的各功能 调度界面层功能层此模块处理核心调度。所有的 其他模块都受到 它的控制。功能层层模块名模块输入模块输出模块输出对像备注功能

29、层用户认证用户名,密码是否认证通过结果由核心层处理账号信息由核心层从传统界面获得设置效劳器 ip为核心层核心层信息由核第17页地址、邮件账号信息等提供必要的信息心层从传统界面获得,并写到注册表邮件收邮件新邮件信息结果由核心层处理输出到界面层语音识别收邮件,语音合成读邮件。通讯网络层的 其他客户登陆 消息、其他客户 发来的讯息要显示的 信息 , 及要合成 的语音信息字 符串结果由核心层处理输出到界面层与网络层交互信息,信息显示到界面层新闻网络层的新闻信息要合成的新闻信息字符串结果由核心层处理输出到界面层与网络层交互信息,信息显示到界面层人机聊天命令核心层传来的语音识别 聊天命令要合成的语音信息字

30、符 串结果由核心层处理输出到界面层有限的命令反映。.2 |艮务器端模块目标:每个客户端必须先登陆到 AgentNet 效劳器,才能继续使用,这里需 要账号认证。每个效劳器端的事件,都要被纪录,这里需要事件管理。效劳器端 提供一个新闻效劳。当客户端要求看最新的新闻时,发新闻给客户端。这里要有新闻管理,用丁添加、删除、修改新闻。客户端发过来的网络讯息,以及效劳器端发给客户端的讯息, 都由网络层实所有具体功能的实现在功能层第18页核心层处理各层的调度。由丁本设计主要目标表达在整个结构的架设。 到现在为止,实现的是根本的 效劳。但以后可以很方便的在其根本结构上增加新效劳功能。相对丁客户

31、端,效劳器端模块结构不具体展开。详细信息可到具体实现小节 观察。5.3 具体实现细节.1 陪户端界面层语音识别SR模块SRSR 中定义的成员变量有:CComPtr m_cpEngine;/SR engine 接口CComPtr m_cpRecoCtxt;/recognize context 接口第19页CComPtr m_cpCmdGrammar; /grammar 接口成员函数:InitSR(); 初始化ProcessRecoEvent();事件响应函数ExecuteSRCommand();执行语音命令ReleaseSR();释放接口InitSR()InitSR() 函数中初

32、始化了 COM 接口、SR engine 接口、recognize context 接口、grammar接口,这些都是 COM 接口指针。其中 m_cpEnginem_cpEngine 为主 SR Engine 接口,程序使用它作为与其他模块的连接。m_cpRecoCtxtm_cpRecoCtxt 为 recongnize事件上下文,通过它,当识别事件发生的时候,可以获得具体识别出来的文字或 命令号。m_cpCmdGrammarm_cpCmdGrammar 为命令接口。由丁本设计的语音识别只涉及到有 限命令词汇,所以在这里定义了命令接口。对丁一些其它需要口述板的应用可以 定义口述接口,以识别无

33、限命令集既自然语言识别。当然定义有限命令可以大大提高识别率。m_cpCmdGrammarm_cpCmdGrammar 命令接口的初始化是通过载入一个名为 srgrammar.cfg语法规那么文件而完成。这个文件由一个名为 srgrammar.xml 的 XML 文件通 过专用的语法产生程序产生。在 srgrammar.xml 内具体定义了需要识别的中文命 令。如: 你好 在这里定义了一些用户自定义事件#define WM_RECOEVENT WM_USER+100并在 MESSAGE_MAP 内定义处理函数语音识别事件消息处理ON_MESSAGE(WM_RECOEVENT,ProcessRec

34、oEvent)当识别结束时,程序主线程接收到此WM_RECOEVENT 消息,运行 处理 函数ProcessRecoEvent()。此函数在确定是语音识别事件成生后,运行 ExecuteSRCommand()函数。第20页ExecuteSRCommand(羚辨哪个命令被识别,并执行响应命令处理函数。语法规那么与语法树语法规那么是 SAPI 5.0 的一个重要的元素。它限制了在语音识别处理中,可 能的被识别的字或句子成分。短语或句用每个语法规那么成分来决定识别通路。例如,核查在描述旅行方案的句子:“我想开车从北京到上海。请注意这里有决定结果的信息元素存在。就这个例子来说,有个人在方案从北京开车到

35、上海。这个非常简单的例子说明了一个可能非常复杂的问题。不限制方法、方向和旅行目的地,产生的旅行方案将是任选的无限数。作为结果产生的有效信息能通过加以限制的方法选择决定。第21页下为这个例子的具体分析:一个诲音识别的例子识别统果:方法:开军原城市:北京目的城而上词我想开车 从 北京到 上海方法目的城市第22页GRAMMAR,DEFINE)CID NAME/天津# VAL=1102/?/DEFINE?KOLE JIAffE=Tra.vle TOPLEVEL= ACTIVE 开车P VALLFly#乘飞机 AP MAL=*北京。北京P VAL=* 上海*上海 P VAL=*南京今南京成?P VAL=

36、*夭津。夭津JK/OPHAL北京V北京/P, PVAL二,上澹。上海 P VAL 二*南宗。南京/P, PVAL=*天津。天津 5 第23页语音合成(TT0 模块 ISPVQIW*语音合成模块相对简单。它定义的变量有:/tts 语音合成接口ISpVoice *m_cpTTSVoice;成员函数:InitTTS(); 初始化AgentSpeak(Cstring strSpeak); 合成ReleaseTTS();释放接口先使用 InitTTS()初始化,它初始化了 COM 接口,并设置了合成的男声 的语速,默认把它设为+2 ,语速快一点,相对觉得自然一点。然后核心层关心的就是AgentSpeak

37、(CString strSpeak)这个函数了。核心层把欲合成的字符申作为参数提交给AgentSpeak,即合成了语音。AgentAgent 界面模块|lA.EflitClB.mct erEWriteProfileString(strServerSection,ServerIpAddress,ServerPage.m_strServerlpAddress);读效劳器 ip 地址m_stuSetup.strServerIpAddress=pApp-GetProfileString(strServerSection,ServerIpAddress);由丁篇幅有限,具体请看代码。第26页邮件模块这里

38、用到了两个类CPop3CPop3 类用丁邮件处理,CMailMessageCMailMessage 用丁邮件内容解码。在初始化后,用CPop3:SetServerProperties( LPCTSTR sServerHostName, UINT nPort)设定邮件 效劳器参数。用CPop3:SetUserProperties( LPCTSTR sUsername, LPCTSTR sPassword )设定用 户账号参数。这些参数是从设置模块读过来的。然后CPop3:Connect(),CPop3:GetNumMessage()获得当前邮箱的邮件数。CPop3:GetMessage( UIN

39、T nMsg, CMailMessage* msg)获得邮件内容放到msgCPop3:Disconnect()断开连接。第27页通过CMailMessage:EncodeBody()可解码邮件内容。邮件的具体内容在解码后放在成员变量中。理点一-多线程由丁在处理收邮件功能时,假设程序使单线程的,网络延时必定使主线程阻塞。 所以当核心模块调用邮件模块必须开一个新线层。多线层编程细节在 Windows 的一个进程内,包含一个或多个线程。线程是指进程的一条执行 路径,它包含独立的堆栈和 CPUS 存器状态,每个线程共享所有的进程资源,包 括翻开的文件、信号标识及动态分配的内存等等。一个进程内的所有线程

40、使用同一个 32 位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪 个线程可执行以及什么时候执行线程。 线程有优先级别,优先权较低的线程必须 等到优先权较高的线程执行完任务后再执行。在多处理器的机器上,调度程序可 将多个线程放到不同的处理器上去运行,这样就可使处理器的任务平衡,也提高了系统的运行效率。Visual C+ 5.0 提供了 Windows 应用程序的集成开发环境DeveloperStudio。在这个环境里,用户既可以编写 C 风格的 32 位 Win32 应用程序,也可 以利用 MF 以库编写 C+以格的应用程序,二者各有其优点:基丁 Win32 的应用 程序执行代码

41、小巧,运行效率高,但要求程序员编写的代码较多,且需要管理所 有系统提供应程序的资源;而基丁 MFC 类库的应用程序可以快速建立起应用程序,类库为程序员提供了大量的封装类,而且Developer Studio 为程序员提供了一些工具来管理用户源程序, 其缺点是类库代码很庞大, 应用程序的执行代码 离不开这些代码。由丁使用类库所带来的快速、 简捷和功能强大等优越性, 因此, 除非有特殊的需要, 否那么 VisualC+提倡使用 MFC!库进行应用程序开发。收邮件线程的具体实现主线程和收邮件线程问通过消息互相通讯。定义如下消息:邮件模块消息定义#define WM_MAIL_ACCOUNT_NOT_

42、SET WM_USER+200#define WM_MAIL_CANNOT_LOGIN WM_USER+201第28页#define WM_MAIL_PROCESS WM_USER+202#define WM_MAIL_NO_NEW_MAIL WM_USER+203#define WM_MAIL_PROCESS_DONE WM_USER+204消息的具体含义可在消息名上看出,不再赘述。具体请参看源代码。定义消息响应函数如下:邮件账号没设定事件消息处理ON_MESSAGE(WM_MAIL_ACCOUNT_NOT_SET,ProcessMailAccountNotSet)邮件账号没设定事件消息处理

43、ON_MESSAGE(WM_MAIL_CANNOT_LOGIN,ProcessMailCannotLogin)/有邮件要处理事件消息处理ON_MESSAGE(WM_MAIL_PROCESS,ProcessReadMail)/没有新邮件要处理事件消息处理ON_MESSAGE(WM_MAIL_NO_NEW_MAIL,ProcessNoMail)/邮件处理完成事件消息处理ON_MESSAGE(WM_MAIL_PROCESS_DONE,ProcessMailDone)当核心层调用收邮件模块时,开新线程如下;AfxBeginThread(GetMailThread,&m_stuThreadInf

44、o,THREAD_PRIORITY_NO RMAL);UINT GetMailThread(LPVOID pParam)是一个全局函数。其参数中是一个定义的,线程必须用到的信息结构。当GetMailThread执行完,发消息到主线程,主线程处理响应动作。由丁篇幅有限,具体请看代码。通讯模块发送一般消息到好友。这个函数把讯息送到网络层。在选定对方好友后,提出一个对话框,输入讯息ProcessSendGeneralMsg(CString strToUserName, CString strText)第29页StrToUserName 为好友名,StrText 为发送的消息字符串。对方网络层收到消息

45、,调用处理好友信息ProcessReceiveGeneralMsg(msg.m_strUser,msg.m_strText);其中参数 msg 为网络层消息类。这里与网络层的内容紧密相关,请参看网络层内容。新闻模块这里是网络 C/S 结构的具体表达。本设计到现在只实现了一个效劳器端的具体效劳,即新闻效劳。但结构已架 设好,扩展方便。ProcessReadNews();向网络层发出读邮件命令。网络层收到,效劳器端的新闻后,调用ProcessRequestReadNews(CString strNews)再提升到界面层。这里与网络层的内容紧密相关,请参看网络层内容。人机聊天模块此模块现在非常不成熟

46、,由丁时间紧迫,能力有限。现在只是简单的预定义 的有限命令答复。目标是有一定的人工智能,有一定的推理机制,一定的自学习机制。要以后进一步完成。.4 陪户端网络层网络层是具体的网络通讯的具体实现,它负责与效劳器的通讯。使用到了 SOCKET 类来具体实现。这里,定义了一个继承了CSocket 的 CToServerSocket 类。第30页:网络通讯高层协议为了处理不同消息,定义了高层的通讯协议:CMsg:m_strCommand字符申装载了这个协议。设置模块获得。SendMsg(CMsgSendMsg(CMsg *pMsg)*pMsg)发送消息,参数为一个 CMsg 对像。Re

47、ceiveMsg()ReceiveMsg()接受消息,并进行响应处理,上升到核心层处理。CMsgCMsg 是定义网络消息的类,效劳器端有一个同样定义的类。处理具体消息其成员变量有:CString m_strText;/通信字符串CString m_strCommand;/命令字符串CString m_strUser;用户名字符串CString m_strToUser;目的用户CString m_strPassword;/用户字符串第31页协议的具体内容.5 |艮务器端网络层效劳器端的网络层用了 socketsocket 同客户端的网络层连接。不过效劳器端比客户端多一个类,这里建

48、了一个继承CSocketCSocket 的类:ClisteningSocketClisteningSocket 这个类的实例将绑定效劳器端的ip 地址,和固定端口号:5040。ClisteningSocketClisteningSocket 用丁监听客户端的连接。假设发现有客户端的连接,产生一个 CClientSocketCClientSocket 类的实例。CClientSocketCClientSocket 类是继承了 CSocket 的类,处理对客户端的网络信息。现联系客户端网络层,实现的根本算法如下:由丁篇幅有限,具体请看代码。第32页效劳器方(SERVER1、构造一个套接字CSock

49、et ser_s1 ;2、创立该套接字ser_s1.Create (port) ;其中,port 为效劳器方客户方(CLIENT)1、构造一个套接字CSocket cli_s ;2、创立该套接字cli_s.Create ();第33页4、构造一个新的套接字Csocket ser_s2 ;5、效劳器等待从 sers2上 接受客户连接请求ser_si.Accept (ser_s2)翻开的通信通道号3、开始监听来自客户机的连接3、客户机方套接字 cli s 向效劳器方ser_si.Listen();套接字 ser si 发出连接请求cli_s .Connect (Addr , port);其中,Ad

50、dr是欲连接效劳器方套接字地址结构指针,可采用IP地址或机器名。port即翻开的通道号,其值与效劳器方的一致。6、构造一个类 CSocketFile 的对象4、构造一个类 CSocketFile 的对象CSocketFile file(&ser_s2)CSocketFile file(&cli_s)7、构造类 CArchive的对象 arIn、arOut5、构造类 CArchive 的对象 arIn、arOut,以用于数据的收和发。以用于数据的收和发。CArchive arIn(&file , CArchive :load)CArchive arIn(&file

51、 , CArchive :load)CArchivearOut(&fileCArchivearOut(&fileCArchive :store)CArchive :store)8、使用 arIn和 arOut 进行收或发数据6、使用 arIn和 arOut 进行发或收数据arIn value ;arOut value ;arOut value ;其中,value是所传输的数据9、摧毁所创立的 CSocket、7、摧毁所创立的 CSocket、CSocketFile 、CArchive 等类的对象CSocketFile 、CArchive 等类的对象第34页.6

52、|艮务器端核心层它处理各种数据,完成其他各层的初始化、调用。完成传统界面的处理(包 括 windows 窗口)。界面上出现的 windows 元素有,一个树控件,一个 List 控件。由丁这里主要涉及到一些繁琐的源代码,篇幅有限,具体请看代码。.7 |艮务器端功能层事件管理模块事件管理的所有数据来自数据层。主有以下几个函数:AddEvent(CString strType, CString strEvent);添加个事件ShowEvent();显示所有事件ClearEvent();清空所有事件所有的动作由核心层接收的菜单命令激发。当进行添加、删除、更新命令时,会弹出相应对话框,

53、与管理员交流。账号管理模块所有数据来自数据层。主有以下函数OnMenuAddNewAccount();OnMenuitemAccountDelete();OnMenuitemAccountUpdate();新闻管理模块所有数据来自数据层。有以下函数OnMenuitemAddNewNews();第35页OnMenuitemNewsDelete();OnMenuitemNewsUpdate();所有的动作由核心层接收的菜单命令激发。当进行添加、删除、更新命令时,会弹出相应对话框,与管理员交流客户通信模块核心层从网络层传来的所有有关客户通讯的数据,在这里处理。有以下函数:(已简化)ProcessLogin ();ProcessLogout();ProcessSendGeneralMessage ();ProcessSendNews();ProcessListOnlineBuddy ();具体含义可在函数名上看出,不再赘述。具体请参看源代码。.8 川艮务器端数据层其他层的所有的数据来自数据层。数据层的所有数据以及处理方法都保存在SQL SERVER 上。C+端有以下几个函数:InitConnectSqlServer();用于连接数据库ExecuteStoredProc(_b

温馨提示

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

评论

0/150

提交评论