语音传输系统的设计与开发Word文档格式.docx
- 文档编号:18843603
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:17
- 大小:96.38KB
语音传输系统的设计与开发Word文档格式.docx
《语音传输系统的设计与开发Word文档格式.docx》由会员分享,可在线阅读,更多相关《语音传输系统的设计与开发Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
致谢18
声明19
1引言
20世纪是计算机的世纪,计算机及相关技术的快速发展令人目不暇接。
伴随着计算机技术的发展,网络的发展更加迅猛,令人不禁有“只有想不到,没有做不到”之感。
网络已经成为最大的信息传输方式之一。
在新的世纪里,我们更要掌握好计算机知识。
随着高新技术的不断发展,计算机更新速度越来越快,计算机已经逐渐溶入人们的生活。
很难想象没有计算机的现代社会将变成一个什么样子。
计算机已经和我们的生活息息相关。
而可视化操作简单的MicrosoftWindows操作系统就越来越频繁的出现在我们的工作学习中,给我们带来了很多便利。
随着计算机的不断发展,网络技术也在不断发展。
现在我们通过网络进行学习、讨论、交流、游戏等等,网络正逐渐成为我们身边不可或缺的东西。
那么要进行交流,语言、文字是不可缺少的。
如何进行网络间的语言文字交流?
通过对VisualC++和Windows网络编程技术的学习,本系统研制出一个能够进行网络间语言文字交流的语音传输软件。
VisualC++是一种可视化的、面向对象的Windows开发语言,它具有易用、通用和开发效率高的特点。
随着微软公司对他不断的改进以及计算机本身在性能上的迅速提高,使得VisualC++越来越适合于一般的应用程序的开发。
自从VisualC++6.0推出以来,已经为非常多的开发人员所使用,一直是当前最主流的开发工具之一。
而Windows操作系统大家更是熟悉不过了。
那么提到Windows编程就不能不提API。
API是ApplicationProgrammingInterface的简写,意思是应用程序编程接口。
可以把它想象成一个程序库,提供各式各样与Windows系统服务有关的函数,例如CreateFile是用来创建文件的API函数,C的标准库函数create也提供了创建文件的函数,但是他是靠调用CreateFile函数完成创建文件功能的。
事实上,在Windows下运行的程序最终都是通过调用API函数来完成创建工作的,因此,可以把Win32API看成是最底层的服务。
本文所介绍的网络语音传输程序就是一个在Windows环境下以VisualC++为编程语言的应用程序。
2语音传输系统需求分析
随着现代计算机技术的不断发展,多媒体已经成为现代计算机不可缺少的功能,而计算机的音频,视频功能是其中最为重要的部分。
而随着网络的不断发展,网络已经成为人们最重要的交流方式之一。
计算机硬件的更新,特别是海量存储设备和大容量内存在PC机上的实现,对音频媒体进行数字化处理早已经成为可能。
现在,企业、机关、学校都建立起了局域网。
虽然可以通过文件共享的方式进行通讯,但单使用这种方式,非常不方便。
在网上邻居里,只能看到机器名,不清楚对方是谁,也不知道对方机器里有什么资源可以共享,尤其当局域网的机器很多时,这种方式就更加麻烦了。
而文字聊天方式比较单一缺乏真实感,所以语音通信就有了必要。
但是语音传输需要有很大的网络带宽,对于拨号上网用户,语音传输仍然是奢侈品,不过对于局域网和宽带用户来说,是很不错的选择,本系统就是研究的基于局域网的语音传输,并以语音聊天为例给出了实例。
语音聊天方式一般有两种,一种是专门的语音聊天室,采用Web方式,B/S结构,另外一中则是类似于QQ、MSN等聊天工具,采用C/S结构。
本设计是采用的后者。
TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。
该模式的建立基于以下两点:
1、非对等作用;
2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式,首先服务器方要先启动,并根据请示提供相应服务。
综上所述,做一个语音通信软件是有必要的,也是能够实现的。
3开发工具与环境介绍
3.1VisualC++概述
3.1.1VisualC++简介
VC是Microsoft公司的重要残品之一——DeveloperStudio工具集的重要组成部分。
他用来在Windows(包括95、98、NT、2000、XP等)环境下开发应用程序,是一种功能强大、行之有效的可视化编程工具。
VC以可视化技术为基础,以C++语言为蓝本,以众多的集成工具为骨架,在计算机领域的诸多方面都发挥着重要的作用。
VC提供了简洁实用的开发环境,集成的工具集能让用户高效率地开发应用程序。
VC提供了MFC类库,一般性的工作可以全部交给VC来完成,用户只要在其基础上做出自己想要实现的功能即可。
VC完成目标所花费的时间要少得多。
3.1.2VisualC++的发展过程
作为一种C/C++语言的集成开发环境(IDE),产生VC的最早的根源其实要追溯到DOS时代的Borland公司,当初Borland公司开发的TurboPascal和TurboC让程序员们深刻感受到了把编辑器和编译器集成在一起的IDE是多么的方便,微软公司也看到了这一优点,于是相继开发了QuickC和MicrosoftC/C++等多个DOS版本的C/C++集成开发工具。
随着Windows的不断成熟,Microsoft公司决定放弃DOS下的开发工作,正式推出Windows下的VC1.0,早期的VC功能并不怎么强大,使用起来也不方便,1.0版和1.5版都是16位编程工具。
VC的革命性改变得益于Windows95的推出,从VC2.0开始,微软公司又放弃了16位编程,以后的VC都只用于32位编程开发,为了与MFC类库的版本号保持一致,微软公司跳过了版本3,直接推出了VC4.0,这个版本及修订版4.2的部分界面风格一直保留到VC6.0。
从VC4.0到VC6.0,VC的各种功能不断增强,MFC类库的内容也越来越丰富,现在利用VC开发应用程序已经是一种相对轻松的事情了。
3.1.3VisualC++的特点
在VC发展的同时,Borland公司也在不断改进他的C/C++开发工具,并相继推出了BorlandC++和C++Builder等产品,其实,现在的C++Builder也是一个非常优秀的开发工具,但是基于下边的几点原因,我们可以看出VC有着不可比拟的优越性:
1VC的核心——MFC类库已经是事实上的行业标准,Borland自己开发的类库也在向MFC看齐。
2VC与VisualStudio中的其他可视化开发工具紧密集成,可用于开发非常专业的应用程序。
3VC的联机帮助已经被集成到MSDN库中去了,后者包含了微软公司大部分产品的技术文档和支持资料,内容相当丰富,是程序员不可多得的参考资料,现在MSDN库随着VisualStudio6.0一起发行,极大地方便了用户。
3.2VisualC++的集成开发环境
VisualStudio6.0企业版一共有6张光盘,如果只安装VC6.0那么需要第一张光盘和MSDN库。
VC6.0可以安装在所有运行Windows95/98/NT/2000/XP等的系统上。
安装按提示完成后,开始菜单的程序中应生成MicrosoftVisualStudio6.0和MicrosoftDeveloperNetwork两个程序组。
从VisualStudio6.0的程序组中运行VC6.0,便可启动VC6.0的开发环境——DeveloperStudio。
每次运行VC6.0时,首先会弹出一个“TipoftheDay”的对话框,其中介绍有很多关于开发环境的使用方法以及编程调试方面的小技巧,如果不想看他,可以选择在下一次启动时不再显示。
如图3-1所示,VC6.0的窗口被分成了几部分,最上边是标题条、菜单和工具栏,中间左边的窗口是工作区窗口,右边为文档窗口,显示正在编辑的文本文件(或资源),下方为输出窗口和状态栏。
除了主菜单和工具栏外,VC6.0开发环境还提供了大量的上下文关联菜单,用鼠标右键单击窗口中的很多地方都会弹出一个关联菜单,此菜单包含与被单击项目相关的各种命令,从而可以加快一些常规操作的速度。
VC启动之后,窗口中几乎一切都是空白的,所以我打开了一个工程。
中文版的VC++6.0,其工作界面如下:
图3-1VC主窗口
3.3Windows程序设计基础
3.3.1概述
Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成。
程序中只要按一定的格式填写系统留给客户的那一小部分。
所需要完成的有:
窗口类的定义、窗口的建立、消息函数的书写、消息循环。
3.3.2消息处理函数
Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。
每个窗口都有一个消息处理函数。
在消息处理函数中,对传入的消息进行处理。
系统内还有它自己的缺省消息处理函数。
客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。
这样,每当有消息产生时,就会去调用这个消息处理函数。
通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
switch(message)
case...
...
case...
}
returnDefWindowProc(hwnd,message,wParam,lParam);
}
3.3.3窗口的建立
客户需要自己建立窗口,建立后会得到系统返回的窗口句柄(HWND),后继的针对窗口的操作都针对句柄进行。
1.注册窗口类
建立窗口前,需要制定好这个窗口的相关属性,最主要的就是将自己定义的消息处理函数与窗口关联,其他的属性还包括:
菜单、图标等等。
这个属性指定步骤是通过指定"
窗口类"
来完成的。
对于自己建立的窗口,这个"
需要自己制定,也即自己充一个WNDCLASS结构,然后向系统注册。
对于一些特殊窗口,如按钮等控件,他们的行为是系统制定好了的,所以不需要自己注册,直接使用对应的“窗口类”名称就行了。
2.建立窗口
建立窗口时,注册的"
名称作为参数传入。
这样,当有针对该窗口的消息时,将调用“窗口类”中指定的消息处理函数,在其中得到处理。
在应用程序中使用对话框是很方便的,因为对话框可以从模板创建,而模板可以使用可视化资源编译器进行编译,这就大大简化了窗口界面的设计过程。
同时为了简化程序设计,Windows在内部也定义了许多窗口类,即常说的字窗口控件,应用程序直接使用这些类名就可以创建子窗口。
同子窗口控件类似,对话框的窗口函数也由User32.dll提供,所以在创建对话框之前不需要注册窗口类。
在创建对话框时并不需要调用CreateWindowEx函数,而是调用了DialogBoxParam或CreateDialogBox函数。
前一个函数用来创建模式对话框,后一个函数用来创建非模式对话框,它们都在内部调用了CreateWindowEx函数,使用的风格、大小和位置等参数取自资源中定义的对话框模板。
要创建对话框就要先创建对话框模板。
对话框模板定义了对话框的基本属性,这包括该对话框的宽度和高度及其中包含的控件。
创建对话框模板最简单的方法是使用VC自带的资源编译器,使用VC++的“Insert/Resource”菜单命令,可以非常方便地向工程中加入对话框资源。
3.3.4消息循环
系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
因此,建立窗口后,将进入一个循环。
在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。
循环退出后,程序即结束。
#include"
stdafx.h"
#include<windows.h>
//消息处理函数
//参数:
窗口句柄,消息,消息参数,消息参数
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
//处理感兴趣的消息
switch(message)
{
caseWM_DESTROY:
//当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
PostQuitMessage(0);
return0;
}
//其他消息交给由系统提供的缺省处理函数
return:
:
DefWindowProc(hwnd,message,wParam,lParam);
//应用程序主函数
实例句柄、前一个实例的句柄、命令行参数、窗口显示方式
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
//注册窗口类
staticTCHARszAppName[]=TEXT("
HelloWin"
);
//窗口类名称
//定制"
结构
WNDCLASSwndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
//关联消息处理函数
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
//实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
//图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
//光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
//画刷
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
//类名称
//注册
if(!
ReGISterClass(&
wndclass))
MessageBox(NULL,TEXT("
RegisterClassFail!
"
),
szAppName,MB_ICONERROR);
return0;
//建立窗口
HWNDhwnd;
hwnd=CreateWindow(szAppName,//窗口类名称
TEXT("
TheHelloProgram"
),//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
CW_USEDEFAULT,
NULL,
NULL,
hInstance,//实例句柄
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
//消息循环
MSGmsg;
while(GetMessage(&
msg,NULL,0,0))//从消息队列中取消息
TranslateMessage(&
msg);
//转换消息
DispatchMessage(&
//派发消息
returnmsg.wParam;
4Windows网络编程
4.1网络和协议
网络是可以交换数据的互相连接的计算机的集合。
网络的类型很多,如LAN(局域网)、WAN(广域网)、Internet。
为了确保所有的传输平稳地进行,网络建立在协议之上。
协议是一组规定,他描述了数据传送的格式。
用户发送的信息要经过各层协议的封装,如图4-1所示:
用户
Userdate
Tcpheader
Ethernetheader
Ipheader
硬件
应用层
TCP层
IP层
链路层
图4-1TCP/IP协议栈
TCP/IP是面向连接的协议。
连接的两个设备之间,每一方都使用他自己的IP地址和端口号。
通常,一方称为客户,另外一方称为服务器。
客户是发出请求方,服务器响应他们。
例如,当打开网站时,浏览器是客户,WebServer是服务器。
浏览器发出连接请求,初始化和服务器的连接,请求指定的资源。
服务器然后返回响应和请求的数据。
服务器通常是等待客户连接,这叫做监听,这一般是在特定的IP地址和端口号进行。
客户仅在有需要时才启动,因为客户总是一个连接的发起者,信息的请求者。
为了创建连接,客户需要知道服务起正在监听的IP地址和端口号。
服务器和客户方都需要使用IP地址和端口号,但是服务器的IP地址和端口号一般都是固定的。
在客户方,端口号并不重要,任何端口都可以使用。
工作在软件层的几个协议,如HTTP、FTP、POP3、SMTP等,大多数是以服务器/客户机方式工作的。
例如,客户产生请求,服务器响应。
请求和响应数据的准确格式由这些协议定义。
4.2Winsock接口
Winsock是处理网络的WindowsAPI。
许多函数与BSDUnix中使用的Berkeley套接字函数是相同的。
通信的双方要建立连接,这个连接的终端就是套接字。
客户端和服务器端都有一个套接字,每个套接字与特定的IP地址和端口号关联。
几乎所有的Winsock函数都在套接字上进行操作,因为套接字是连接的句柄。
连接的两端都要使用一贯套接字,它们与平台无关。
套接字是双通的,也就是说在同一个套接字上既能够接收也能够发送数据。
套接字主要有两种类型,一种是流套接字(SOCK_STREAM),另外一种是数据报套接字(SOCK_DGRAM)。
流套接字是为需要可靠连接的应用程序设计的。
这些程序经常使用连续的数据流。
用于这种类型套接字的协议是TCP。
流套接字最常用,一些众所周知的协议如HTTP、TCP、SMTP、POP3等都使用它。
数据报套接字使用UDP作为下层协议,是无连接的,有一个最大缓冲区大小。
它是为那些需要发送小数据包,并且对可靠性要求不高的应用程序设计的。
与套接字不同,数据包套接字并不保证数据会到达终端,也不保证他是以正确的顺序到来的。
数据报套接字传输效率相当高,他经常用于音频或视频应用程序。
对这些程序来说,速度比可靠性更加重要。
另外,也存在一些不常用的套接字类型,如原始套接字(rawsocket)等。
因为Winsock要兼容几个协议,所以必须使用通用的寻址方式。
TCP/IP使用IP地址和端口号来指定一个地址,但是其他协议也许采用不同的形式。
如果Winsock强迫使用特定的寻址方式,添加其他协议就不大可能。
Winsock的第一个版本使用sockaddr结构来解决此问题。
Structsockaddr
{u_shortsa_family;
Charsa_data[14];
};
如果仅仅使用互联网地址家族(TCP/IP),Winsock已经定义了sockaddr结构的TCP/IP版本——sockaddr_in结构。
它们本质上是相同的结构,但是第2个更容易操作。
Structsockaddr_in{
Shortsin_family;
//地址家族
U_shortsin_port;
//端口号
Structin_addrsin_addr;
//IP地址
Charsin_zero[8];
//空字节,要设为0
};
Sin_addr是IP地址(32位),他被定义为一个联合来处理整个32位的值,两个16位部分或者每个字节单独分开。
描述32位IP地址的in_addr结构定义如下。
Structin_addr{
Union{
Struct{u_chars_b1,s_b2,s_b3.s_b4;
}S_un_b;
Struct{u_shorts_w1.s_w2;
}s_un_w;
U_longs_addr;
}s_un;
使用winsock编程的一般步骤是比较固定的,如下:
1winsock库的装入、初始化和释放
2套接字的创建和关闭
3绑定套接字到指定的IP地址和端口号
4设置套接字进入监听状态
5接受连接请求
6收发数据
4.3服务器程序和客户程序创建过程
在现在的软件开发中,软件开发环境越来越多地涉及了网络环境以及网络下的C/S(Client/Server)模式。
C/S模式,即客户机/服务器模式兴起于20世纪90年代初,到90年代中期达到鼎盛时期。
C/S模式是第一个应用于网络的模式,它在拥有友好的用户界面的基础上,利用分布技术成功地提高了执行效率和系统容量,从而得到了广泛的应用。
C/S模式的基本思想是把原先集中在一起的应用划分为功能不同的两个部分,一个成为服务器软件,用来响应和提供固定的服务;
另一个被称为客户机软件,用来向服务器端提请和要求某种服务。
运行服务器软件的计算机被简称为服务器,而运行客户机软件的计算机被成为客户机,从这个意义上来说,客户机和服务器都是软件意义上的概念,同时也是相对的概念。
例如,一台计算机运行了某个网络应用的服务器软件,它就成为这个应用的服务器;
如果同时它还在运行另外一个软件的客户机程序,则它同时又是另外一个应用的客户机。
不过,因为服务器通常被设计为可以响应多台客户机的请求,所以一般都工作在性能较强、配置较高的计算机上。
服务器方创建监听套接字,并为他关联一个本地地址(指定IP地址和端口号)。
然后进入监听状态准备接收客户的连接请求。
为了接受客户
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语音 传输 系统 设计 开发