基于TCPIP协议的实时语音聊天系统的实现.docx

上传人:b****8 文档编号:10885575 上传时间:2023-02-23 格式:DOCX 页数:20 大小:219.80KB
下载 相关 举报
基于TCPIP协议的实时语音聊天系统的实现.docx_第1页
第1页 / 共20页
基于TCPIP协议的实时语音聊天系统的实现.docx_第2页
第2页 / 共20页
基于TCPIP协议的实时语音聊天系统的实现.docx_第3页
第3页 / 共20页
基于TCPIP协议的实时语音聊天系统的实现.docx_第4页
第4页 / 共20页
基于TCPIP协议的实时语音聊天系统的实现.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于TCPIP协议的实时语音聊天系统的实现.docx

《基于TCPIP协议的实时语音聊天系统的实现.docx》由会员分享,可在线阅读,更多相关《基于TCPIP协议的实时语音聊天系统的实现.docx(20页珍藏版)》请在冰豆网上搜索。

基于TCPIP协议的实时语音聊天系统的实现.docx

基于TCPIP协议的实时语音聊天系统的实现

基于TCP/IP协议的实时语音聊天系统的实现

引言随着通信网络技术的发展,人们之间的交流方式越来越方便,文本聊天已经不能满足人们节奏日益加快的生活,语音聊天的技术变得不可或缺。

即时通信自从上世纪80年代末出现以来,即时通信逐渐涵盖了微博、音乐、电子邮件、视频、游戏和搜索等多种功能。

目前市面使用较多的即时通信软件包括微博、微信、腾讯QQ、YY、Facebook等等,就连支付宝和淘宝等软件也增添了加好友聊天的新功能。

实时语音聊天系统是即时通信系统的一个核心部分,它利用当今盛行的网络编程技术,面向各种局域网用户,利用TCP/IP协议以及相关技术实现局域网内实时语音聊天,为各企业公司职员的交流提供了方便,一起解决工作中面临的难题,为各类局域网用户带来方便。

1实时语音聊天系统概述

1.1实时语音聊天系统的历史

近年来,计算机正在改变我们的通信、工作和娱乐的方式。

随着网络时代的到来,通过网络实现人与人之间跨区域的实时交流已经可以实现。

但网络只能提供硬件技术上的支持,如果想通过网络实现没有地域局限的交流还需要软件技术的支持。

因此,为满足人们的需要,聊天系统就应运而生了。

最早的聊天系统仅仅是在UNIX环境下,利用talk指令在用户间建立纯文字的在线交流,它只能传输一般ASCⅡ码。

随着通信网络技术的快速发展,实时语音的传输已经能够实现。

1.2实时语音聊天系统的发展前景

随着互联网用户数量的增加和使用领域的逐步拓展,基于TCP/IP协议的实时语音聊天系统开始焕发生机。

实时语音聊天系统能够提供一个支持语音和数据通信双向通信的协作框架,因此能够让用户利用网络享受实时语音聊天系统带来的语音和数据的双重便利。

实时语音聊天系统的主要特点为效率高、移动性强、连续性好和成本低廉,这些优点都满足了公司职员的需要。

实时语音聊天系统能够创建一个虚拟的工作空间,因此可以为公司职员提供更好的移动性。

实时语音聊天系统的另一重要优势是可以节省大量的成本,它能够集成若干个分支机构,可以提供功能更强大的通信,继而使不同地区的职员之间的交流更加亲密。

实时语音聊天系统的效率高体现在人与人之间可以跨区域的进行语音交流,就像两个人面对面交流一样,而省去了输入文本和阅读文本的时间,因此该系统能够为企业节省更多的时间,从而公司可以有更多的时间去做其他事。

企业成功的立业之本是为客户提供优质全面的服务。

为留住客户和反复赢得商机,大多数企业都会以多种方式紧密地与客户沟通,及时了解客户的需要以便为客户提供更优越的服务。

基于TCP/IP协议的实时语音聊天系统能够使企业以崭新的方式和客户沟通,还能够享受降低基础设施成本的优势,它还能使企业更方便、更有效地利用企业资源为客户服务。

2实时语音聊天系统的技术及需求分析

2.1TCP/IP协议

TCP/IP(TransmissionControlProtocol/InternetProtocol),即传输控制协议/互联网络协议,其开发的目的是美国的国防部高级计划研究局DARPA为实现Internet的前身ARPANET。

该协议是Internet国际互联网络基本和实际上遵守的规范,其规范了网络上的所有通信设备,尤其是两台主机之间的数据往来格式以及传输方式[1]。

TCP/IP协议与OSI的七层参考模型并不完全相同。

OSI的体系结构规定了一个7层模型,即物理层、数据链路层、网络层、运输层、会话层、表示层和应用层[2],该模型的能够使不同硬件在同样的层次上相互通信。

TCP/IP协议分为四层,分别是应用层、传输层(TCP)、互联网络层和数据链路层,与OSI模型的对应关系如图2-1。

在物理和数据链路层中TCP/IP能够支持全部标准的和专用的协议。

网络层能够为主机与主机之间的通信提供服务,并能把分组从一台主机发送到另一台主机。

传输层的作用是将两个端系统间的IP交付服务扩展为运行在两个端系统上的进程之间的交付服务,提供进程逻辑通信功能[3]。

传输层协议是在端系统中实现的,其中包括UDP和TCP。

应用层协议定义了进程间交换的报文格式和顺序,以及传输和接收到报文采取的动作,其中包括交换的报文类型、报文类型的语法、字段的语义、报文响应规则等[4]。

 

图2-1TCP/IP和OSI模型的关系

2.2套接字简介

2.2.1套接字技术

套接字(Socket)是TCP/IP的基本操作单位,可以当作是多个主机之间进行双向通信的端点。

套接字是基于C/S这种经典模型设计的,它的功能是利用一个对端双向的通信方式,将网络上跨区域的应用程序进行连接,然后进行资源的共享和数据的交换[5]。

套接字主要包含三个参数,分别是通信的目标IP地址、所用的传输层协议(TCP或UDP)以及所用的端口号。

通过把这些参数衔接起来,与一个套接字绑定,应用层就能和传输层利用套接字接口,把源于不同应用程序进程和网络连接的通信区分开,使数据传输的并发服务得以实现。

套接字能看作在两个程序之间进行通信连接中的一个中间点,连接应用程序和网络驱动程序,在应用程序中创建的套接字与网络驱动之间通过绑定建立关系后,应用程序给套接字传送的数据,再从套接字网络驱动程序发送到网络中。

电脑从网络上收到与该套接字绑定IP地址和端口号相关的数据后,由网络驱动程序交给套接字,应用程序就能够从套接字中提取接收到的数据,这就是网络应用程序通过套接字进行数据收发的过程。

2.2.2套接字通信过程

通过网络进行通信,最少需要两个套接字,其中一个客户端(ClientSocket)运行,另一个在服务器端(ServerSocket)服务。

依据连接启动的方式和本地要连接的目标,Socket之间的连接过程分为服务器监听、客户端请求和连接确认三个步骤。

服务器监听指的是ServerSocket并不能定位具体的ClientSocket,而是处于等待连接的状态,实时监控网络状态。

客户端请求是由ClientSocket向ServerSocket提出连接请求。

因此,客户端的Socket必须先确定出它要连接服务器的Socket,并指明ServerSocket的地址端口号,最后再向ServerSocket提出连接请求,连接确认是当ServerSocket监听到或收到ClientSocket的连接请求时响应ClientSocket的请求,建立一个全新的线程,并把ServerSocket的信息发送给客户端,一旦当客户端确认连接时,连接就建立成功了。

而服务器端则继续处于监听状态,继续接收其他客户端的连接请求。

2.3P2P模型

P2P(PeertoPeer,对等网络)模型,是指网络中的物理节点在逻辑上以相同的地位进行通信的模型,而不是处理能力的对等[6]。

对于传统的集中式C/S模型,其减弱了服务器的概念。

系统中的各个节点不再区分服务器和客户端的角色关系。

每个节点既可请求服务,也可提供服务,节点之间可以直接交换资源和服务而不必通过服务器[7]。

用户之间直接共享资源是P2P的最大特点,这个特点使PC变成拥有Server和Client双重特征的设备。

目前P2P的构架手段主要有集中目录式P2P、纯P2P和混合P2P模式三种[8]。

如图2-2所示。

图2-2P2P模型的三种模式

集中目录式P2P模式也称为非纯粹的P2P结构,是最早出现的P2P应用模式,一如既往的具备中心化这个特点,最具有代表性的就是用于共享MP3音乐文件的Napster。

在这种模式中,各个节点都与中心目录服务器建立连接,中心目录服务器负责各个节点的内容,当节点发送出请求时,中心目录服务器会依据节点的请求搜寻出合乎该节点需求的节点,最后文件交换就直接在这两个节点之间进行。

纯P2P模型中资源随机地分布在系统所有的节点中,每个节点的请求都会被广播给全部和它直接连接的节点,如果这些节点中都不包含所请求的文件,这些节点就会把这个请求接着广播给全部和它们直接连接的节点,直到搜寻到所请求的文件或者广播的次数超过了某个数值为止。

混合式P2P凝聚了中心化P2P和纯P2P各自的优点,选择性能(处理、存储、带宽等方面)较高的节点当作超级节点,在所有超级节点中储存了系统中其它节点的信息,混合式P2P中,搜索数据包仅在超级节点之间转发,由超级节点将搜寻到的请求转发给合适的叶子节点。

2.4MFC开发技术

2.4.1MFC的特点

MFC是由微软提供并运用于在C++环境下编写程序的一个框架和引擎,VC++是在Windows环境下开发人员使用的专业软件开发平台,MFC就是挂在它上面的一个辅助软件开发包,MFC是与VC++密不可分的一部分。

MFC是C++与WinAPI结合而成的。

API是一种软件编程的规范,是微软提供的Windows下的应用程序的编程语言接口,但不是程序开发语言本身,它可以允许用户使用多种多样的第三方编程语言来对Windows下应用程序进行开发,使这些开发出来的应用程序可以在Windows下运行,比如VC++、VB、Java等编程语言函数实质上都来源于API,因此利用API开发出来的应用程序都可以在Windows的消息机制和绘图里运行。

MFC是微软为API函数特地开发的C++封装,这种结合使微软的专业C++SDK在用户的使用下进行Windows下应用程序的开发变得容易,因为MFC是API的封装,微软在这方面做了很多努力,隐藏了很多程序开发人员在Windows下使用C++&MFC编制软件时的大量细节。

MFC不仅仅是一个功能单一的界面开发系统,它提供的类很大程度上用来进行界面开发,关联一个窗口的动作,但它提供的类中有绝大多数类不和一个窗口关联,即类的功能不是一个界面类,也无法实现对一个窗口对象的控制,而是一些在Windows(用MFC编写的程序绝大多数都在Windows中运行)中实现内部处理的类。

2.4.2MFC的文档视图的概念

文档是指在应用程序里和用户进行交互处理的数据融合。

我们平时所说的文档通常指的是某种文本的本质,但又不仅限于文档。

实际上,游戏数据、几何模型、文本文件等都可以视为文档。

在术语中,文档是指作为整体使用的应用程序中的应用数据。

程序里面的文档定义为文档类的对象,文档类是指由MFC库里的CDocument类衍生出的,存储应用程序必需的数据时要添加数据成员,同时在对数据的处理中还需要添加成员函数。

应用程序不仅仅是指单文档类型,当应用程序中需要多个不同种类的文档时,也可以定义多个文档类。

整体视图与特定的文档对象总是息息相关。

视图对象具有一种机制,可以显示文档里储存的部分或全部数据,而文档只包含程序里的一部分应用程序。

视图规定了在窗口中显示数据的方式和与用户交互的方式。

文档对象可以拥有无穷多个与其相关的视图对象。

各个视图对象能够提供文档数据或部分文档数据的多种表示方法。

2.5实时语聊天系统的需求分析

2.5.1语音软件设计背景需求分析

实时语音聊天系统是即时通信系统中的一个核心模块,也是人们实现实时交流的重要环节。

此次论文为了满足现实生活中的需求,实现了局域网内两台电脑间的语音聊天。

只要其中一个用户向另一个用户发出语音聊天的请求,对方就会接收到一个请求,若同意之后双方就可以进行语音聊天了,在聊天结束后点击断开键。

首先对实时聊天系统流程进行分析,流程分析是整个系统根本,它给出了语音是怎样从一台电脑捕获并发送至另一台电脑的整个过程。

一般实时语音聊天系统应该包括:

建立连接、音频捕获、音频发送(包括音频压缩)、音频接收、音频回放(包括音频解压)五个部分。

其总体流程如图2-3。

图2-3语音通信总体流程图

2.5.2语音通信系统功能模块需求分析

实时语音聊天系统主要功能是使用户实现在局域网内的实时语音聊天,一般来说当通信双方中的一方给对方发出语音聊天请求后,服务器进行转发最后双方建立通信连接。

介于在实际应用中特殊性,所以这个软件没有采用C/S模式,因此进行语音聊天的双方是一对一的关系。

当在双方通信连接建立后就可以在两台计算机之间进行点对点音频数据传输。

本地主机捕获到话筒中的音频数据,然后经过压缩再发送给对方,在对方接收到此音频数据之后经过解压再回放出来。

数据流走向是:

呼叫方发出请求直接转发到被呼叫方,经过被呼叫方对呼叫方提出的请求进行处理,然后将其反馈消息返回给呼叫方(假设被呼叫方接收了请求),则呼叫方就会获得呼叫方的IP地址并打开自己的麦克风开始进行音频的捕获、压缩和发送,而被呼叫方在进行音频捕获的同时进行音频接收、解压和回放。

所以得到的顶层数据流图见图2-4。

图2-4实时语音聊天系统数据流图

在上面的数据流图中,分为处理语音请求、音频捕获与发送和音频接收与回放三大模块,这三个处理模块的功能具体如下:

1.处理语音请求

呼叫方提出语音聊天的请求,然后经被呼叫方处理后将反馈消息转发给呼叫方,呼叫方一句被呼叫方的反馈消息再完成相应的操作,如图2-5。

图2-5语音请求数据流程图

2.音频捕获与发送

当呼叫方接收到被呼叫方“接受”语音请求的反馈消息后,就会打开自己的麦克风启动音频捕获处理模块,并将捕获到的音频数据进行压缩处理后发送给被呼叫方。

在发送给被呼叫方的过程中会用到被呼叫方的IP地址。

其主要步骤有:

确定音频格式,建立音频捕获对象,打开录音设备,为设备分配足够的内存缓存区,将缓冲区与设备相关联,开始捕获音频,将捕获的音频压缩并发送给远程主机,如图2-6。

图2-6捕获音频数据流程图

3.音频接收与回放

当被呼叫方收到呼叫方传送过来的音频数据后,首先其会通过解压而得到最初的音频数据然后在接收方的音频设备中进行回放。

其主要步骤有:

确定音频格式,建立音频回放对象,打开与此主机相关的回放设备并得到其句柄,为回放设备准备一块波形缓冲区,向特定的波形输出设备发送一个数据块,停止放音,然后将回放设备关闭。

流程图如图2-7所示。

图2-7音频回放数据流程图

3实时语音聊天系统的实现

3.1开发平台

VisualStudio是一套功能完全的开发工具集,用于生成XMLWebServices、ASP.NETWeb应用程序、桌面应用程序和移动应用程序。

VisualBasic、VisualC++、VisualC#和VisualJ#全都使用相同的集成开发环境,利用这个开发环境能够共享工具并且能够帮助创建混合语言解决方案。

另外,这些语言利用了.NETFramework的功能,通过此框架可简化ASPWeb应用程序和XMLWebServices的关键开发技术。

而VisualC++是由微软研发的一种面向对象的编程语言,它能够使程序员轻松地编写各种各样以MicrosoftMFC平台为基础的应用程序,同时MicrosoftMFC也为能充分开发利用SDK提供的系统函数也提供了很多的工具与服务,因此选择VS2008作为开发环境来进行此次开发。

相对以前的编程语言来说,C++语言在效率与安全性上得了很大的改善,并且支持现有的网络编程新标准,它使程序员快速便捷地创建基于MFC平台的解决方案快速投入网络开发,因此选择VisualC++语言来进行此次开发。

3.2语音连接模块的实现

3.2.1主要数据结构

在功能模块总体设计中,已经表明了此模块由三部分组成:

建立连接、音频获取、音频回放。

当用户键入IP地址并点击连接键后,语音聊天软件将打开麦克风,先进行初始化等工作的同时向被呼叫方发送是否同意接受语音聊天的请求信息,并等待对方的请求处理,并完成初始化套接字等一系列准备工作。

3.2.2主要算法实现

1.实现连接

函数Connect主要功能是向被呼叫方发送语音聊天请求消息,并试图建立连接,在获得被呼叫方同意后将要进行语音聊天的双方连接起来,如果被呼叫方拒绝聊天则此函数会返回一个连接失败的消息。

3.3语音采集模块的实现

3.3.1主要数据结构

1.wavehdr_tag结构,主要定义了波形数据缓冲区的设备头[9],其结构定义代码如下:

typedefstructwavehdr_tag{

LPSTRlpData;

DWORDdwBufferLength;

DWORDdwBytesRecorded;

DWORD_PTRdwUser;

DWORDdwFlags;

DWORDdwLoops;

structwavehdr_tagFAR*lpNext;

DWORD_PTRreserved;

}WAVEHDR,*PWAVEHDR,NEAR*NPWAVEHDR,FAR*LPWAVEHDR;

2.tWAVEFORMATEX结构主要是波形音频流格式的数据结构,此结构中的wFormatTag参数用做设置波形声音格式,参数nChannels用做设置声道格式,nSamplesPerSec参数用做设置每个声道播放和记录时的样本频率,参数nAvgBytesPerSec设置请求的平均数据传输率[10],参数nBlockAlign以字节为单位设置块对齐,参数wBitsPerSample根据wFormatTag的类型设置每个样本的位深(即每次采样样本的大小,以bit为单位)。

typedefstructtWAVEFORMATEX

{

WORDwFormatTag;

WORDnChannels;

DWORDnSamplesPerSec;

DWORDnAvgBytesPerSec;

WORDnBlockAlign;

WORDwBitsPerSample;

WORDcbSize;

}WAVEFORMATEX,*PWAVEFORMATEX,NEAR*NPWAVEFORMATEX,FAR*LPWAVEFORMATEX;

3.3.2主要算法实现

1.参数初始化

初始化音频格式函数WaveInitFormat主要功能是对语音进行一系列初始化,包括设置采样率,波形格式,声道方式选择等选项。

2.采集过程

OpenMic函数作为采集过程中重要的一环担负着许多音频设置的工作,主要包括缓冲区的设置、分配、音频设备性能测试、开启麦克等一系列的函数调用,是决定音频质量,语音速率的关键,为后面的语音压缩做准备。

3.4语音压缩模块的实现

3.4.1主要数据结构

1.查找驱动信息结构体是自定义数据结构,其中两个重要的成员变量HACMDRIVERIDhadid和WORDwFormatTag分别用于保存ACM驱动号的句柄和要转换的数据格式。

2.tACMFORMATDETAILSA结构主要实现对查询到的波形音频详细格式标记。

3.tACMSTREAMHEADER结构规定了一对用来标示ACM转换源和目的缓冲区的转换流,参数cbStruct在应用程序启动以前必须初始化,这个成员指定的大小必须大到足以包含基本的ACMSTREAMHEADER结构。

3.4.2主要实现算法

1.初始化音频设备

Initialize()函数主要做压缩前的初始化工作,用来搜索音频压缩驱动程序,并查找选择的驱动是否存在,这是音频压缩的起点。

2.格式转换

MyConvert函数的操作过程分为两步,首先将数据转换为中间格式,然后再压缩成能够进行发送的数据。

每次转换都要经过相同的步骤,先打开流设备,然后准备转换的目标格式头,并填充相应的数据存储单元参数,然后就可以开始转换了,转换成功后关闭流设备。

3.5语音回放模块的实现

3.5.1主要数据结构

1.tagWAVEOUTCAPSA结构体是波形输出设备的功能结构体,wMid参数指定厂商ID号,wPid指定产品ID号,vDriverVersion指定驱动版本号,此结构主要用于选取符合要求的音频驱动设备。

2.wavehdr_tag结构体规定了用来识别音频波形格式缓冲区,参数lpData是指向音频波形格式缓冲区的指针,dwBufferLength用来指定缓冲区的长度,参数dwBytesRecorded用来当格式头用于输入时,指示其缓冲区里的数据。

3.5.2主要实现算法

1.数据压入缓冲区

AddBuffer函数实现将解压缩后的数据压入回放缓冲区,并把处理完数据的缓存重新组织起来,准备用来接收新的数据,并且把现成编号向后移一个,以便下次数据进来时自动获取数据,接下来就可以连续的采集数据了。

2.线程同步

此函数主要实现音频回放时的同步作用,该线程不停地等待数据满的消息,一旦满了就调用AddBuffer来处理数据。

此外它还监视是否终止线程。

3.复制数据块

函数WriteData实现把数据拷贝到缓存行,拷贝时不再做任何的处理,直接送给放音模块处理。

3.6获取本机IP地址

3.6.1获取本机IP

函数OnLocalIp用于获取本机的IP地址,其实现方法非常简单,见以下代码:

unsignedlongip[2];

inti=GetLocalIP(ip,2);

char*str=(char*)malloc(64);

in_addrt;

t.S_un.S_addr=ip[0];

if(i!

=0)

str=inet_ntoa(t);

3.6.2本机测试

函数OnTest主要调用音频采集和音频回放模块,因为是本机测试所以不需要压缩模块,其代码实现如下:

sndIn.SetBits(8);

sndIn.SetBlockProp(m_nBlockSize,MAX);

sndIn.SetSampleRate(11025);

sndOut.SetBits(8);

sndOut.SetBlockProp(m_nBlockSize,MAX);

sndOut.SetSampleRate(11025);

sndIn.SetTestProp(TRUE);

sndIn.SetSoundOut(&sndOut);

sndIn.OpenMic();

sndOut.OpenSpk();

4软件测试

这个实时语音聊天软件的主程序界面如图4-1所示,点击右下角和右上角的按钮都可以退出该软件,但是如果是处于语音聊天状态而要强制退出程序的话建议点击右下角退出按钮而不是右上角的红色按钮。

因为在语音聊天过程中对内存的读写要求比较严格,如果强制关闭程序则可能会发生内存读写错误,从而导致整个操作系统暂时无法响应。

图4-1实时语音聊天软件主界面

其中左上角的菜单中包括4个子选项,分别是连接,断开,等待连接和测试。

在菜单栏下面有三个快捷键按钮,其中按键“

”对应菜单选项中的“连接”,直接点击也可弹出如图4-3所示的对话框。

按键“

”对应菜单选项中的“断开”,当用户按下这个按键时,将会立即结束聊天,无论是在与对方聊天状态下还是在本机测试状态下,这个键都将无条件结束正在进行的语音处理过程。

按键“

”对应菜单项中的“测试”,直接点击这个按键软件就会直接跳转到本机测试状态来响应本机用户对软件的测试。

如果用户想让它处在被动接听状态,那么就点击菜单中的“等待连接”键,如图4-2。

图4-2实时语音聊天菜单界面

点击“连接”按键,将会弹出一个对话框,如图4-3所示。

图4-3IP地址输入框

在IP地址框中输入对方IP点击“开始”,等待对方连接。

如果对方拒绝或输入的IP错误则会弹出一个对话框,如图4-4所示。

图4-4拒绝聊天对话框

在工具菜单中只有一个

选项,点击即可获取IP,如图4-5所示。

图4-5实时语音聊天软件工具栏

当请求信息到达对方时,就会弹出一个对话框,提示用户是否同意语音聊天,如图4-6所示。

图4-6实时语音聊天软件请求连接对话框

在该语音聊天软件主界面上,点击“菜单”按键,就会有一个下拉菜单,包含四个选项:

连接、断开、等

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1