局域网即时聊天程序的设计与实现

更新时间:2024-05-19 15:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

大学本科毕业论文

局域网即时聊天程序的设计与实现

作 者 院 系 专 业 年 级 学 号 指导教师 答辩日期 成 绩

1

摘 要

局域网即时聊天通过进行文本聊天和语音聊天来实现彼此沟通、交流信息。本次局域网即时聊天程序设计主要用了Visual C++编程环境,实现了在LAN中在线用户的文本、语音交互。

在设计里涉及到了网络通信基本原理和Socket编程及语音处理API技术。由于程序是在TCP/IP环境下运行,所以分服务器端和客户端。服务器端和客户端是通过建立Socket链接来实现聊天功能。

本次设计主要着重于语音聊天部分,在本次论文里主要以语音聊天的流程和各模块之间的关系及Socket处理为主说明。

关键词: Visual C++编程环境 网络通信基本原理 Socket编程 语言处理API

2

Abstract

The local area network chats immediately through carries on the text to chat with the pronunciation chats realizes each other communication, the exchange information. This local area network chatted the programming mainly to use Visual immediately the C++ programming environment, has realized in LAN the on-line user's text the pronunciation interactive

Involved in the design to the network correspondence basic principle and the socket programming and the pronunciation processes the API technology. Because the procedure is in TCP Under the IP environment moves, therefore divides the server end and the client side. The server end and the client side are through establishes Socket to link realizes chats the function.

This design mainly emphatically chats in the pronunciation the part, mainly between the flow and various modules relations and the socket processing which chats by the pronunciation primarily explained in this paper.

Keywords:

Visual C++ programming environment network

communication fundamentals Socket programming sound API.

3

目 录

摘要

......................................................................................2

................................................................................3

..........................................................................6

.....................................................................6

英文摘要

第一章:绪论

一、背景介绍

二、相关知识.........................................................................6 第二章:需求分析 .....................................................................9 一、 可行性分析....................................................................9 二、 需求分析 ............................................................……. 9

(一) 系统功能要求 (二) 系统性能要求 (三) 系统运行要求

......................................................9 ......................................................10 ......................................................10

第三章:总体设计 .....................................................................11

一、 层次图

..............................................................…...11

二、 各模块的功能及相互关系 ............................…………... 11 第四章:详细设计 .................................................................…13

一、 各模块具体流程 ......................................................….13 (一) 通信模块

................................................................14

(二) 声源采集模块...................................……………….14 (三) 语音数据传输模块................................………………14 (四) 音频再生模块...........................................………….. 15

4

第五章:代码介绍 .....................................................................17 第六章:测试

.......................................................................…23

一、模块测试 ......................................................…………23 二、功能测试 ............................................................……..23 三、测试结果......................................................…………...24 第七章 结论................................................................................25 参考文献

5

............................................................................….26

第一章 绪论

一、背景介绍

随着网路的出现,它在人们的生活中所扮演的角色越来越多,也越来越重要,

人们可以通过这个空间进行网络聊天,实现彼此沟通,交换信息,甚至网络聊天工具在部分人的生活中由于传统的电话通讯手段同等重要的趋势。尤其现在的学校更是如此,单单在课堂里或校园里的交流是远远不够的,要是学校有聊天系统,那么学生之间或是师生之间的信息交流会更加频繁、更方便,有利于建立友好的关系网。

这次设计不仅能实现文本聊天,还能进行语音聊天,语音聊天是一种最先进的聊天方式,您只要拥有一只麦克风就完全能够加入进来。你可以无所顾虑无所拘束地进行聊天,免了文字的虚幻。

本次局域网即时聊天程序设计主要用了Visual C++编程环境,设计里还涉及到了网络通信基本原理和Socket编程及语音处理API技术。由于程序是在TCP/IP环境下运行,所以分服务器端和客户端。服务器端和客户端是通过建立Socket链接来实现聊天功能。

本次设计主要着重于语音聊天部分,在本次论文里主要以语音聊天的流程和各模块之间的关系及Socket处理为主说明。

二、相关知识

(一) Visual C++ 简介

Visual C++是一个功能强大的可视化应用程序开发工具,用于Windows环境下32位的应用程序的开发,是计算机界公认的最优秀的应用开发工具之一。在提供可视化的编程方式的同时,Visual C++也适用于编写直接对系统底层操作的程序,生成代码的质量也优于其它的开发工具。在Visual C++环境下,利用Microsoft的基本类库MFC(Microsoft Foundation Class Library),可以使用完全的面向对象的方法来进行Windows 95/98/NT应用程序的开发,使得Windows程序员从大量的复杂劳动中解救出来,体会到真正的程序语言的强大功能和良好的灵活性。

Visual C++编程是一个面向对象的程序设计方法。同传统的结构化程序设计方法相比,它缩短软件的研制时间,提高软件的开发效率,使程序员可以更好地理解和管理庞大而复杂的程序。

面向对象的程序设计吸取了结构化程序设计的精华,它利用了人们根据对事物分类和抽象的倾向,引入了类和对象的概念,具有封装性(数据抽象)、继承和多态的特点。与结构化程序设计不同的是,面向对象程序设计是用类抽象代表现实的实体,用类之间的继承关系表示程序设计的抽象过程。函数只是对数据的操作,没有数据的概念,而类是数据和数据操作的集合,由于面向对象的程序设计方法非常近现实,所以越来越流行。

Visual C++中集成了大量的最新技术,如ActiveX、COM等技术,程序开发人员可以紧紧地把握住软件开发技术发展的方向,开发出功能强大的应用程序。

6

Visual C++还提供了丰富的技术资源,MSDN(Microsoft Develop Network)提供了强大的联机帮助支持,同时还可以通过访问Microsoft的网上站点来获得最新的技术文档。

(二) Socket及Window Socket API简介

套接字(Socket)是一种双向的通信接口,可以通过这个端口与任何一个具有Socket端口的计算机通信,套接字是网络通信的基础。Socket在Windows以句柄的形式被创建。使用Socket进行网络通信必须包含下面的几种信息:双方认可的协议,本地主机的IP地址,本地进程的协议端口,对方主机的IP地址,对方进程的协议端口。 Socket可分为: 1] 数据报套接字(Datagram Sockets)—— 对于在TCP/IP上实现的WinSock,数据报套接字使用用户数据报协议(UDP)。数据报套接字提供了一种不可靠的、非连接的数据包通信方式。 2] 流式套接字(Stream Sockets)—— 流式套接字使用传输控制协议(TCP)。流式套接字可以将数据按顺序无重复地发送到目的地,它提供的是一种可靠的、面向连接的数据传输方式。不管是对单个的数据报,还是对数据包,流式套接字都提供了一种流式数据传输。 VC++对网络编程的支持有socket支持,Winlnet支持,MAPI和ISAPI支持等。其中Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkeley Socket接口(套接字)。在桌面操作系统进入Windows时代后,仍然继承了Socket方法。从表一可以看出,主要的WinSock API函数有哪些。

[表1] WinSock API函数 函数 功能 WSAStartup() 连结应用程序与 Windows Sockets DLL 的第一个函数 WSACleanup() 结束 Windows Sockets DLL 的使用 socket() 建立Socket closesocket() 关闭某一Socket bind() 将一本地地址与一个SOCKET描述字连接在一起 listen() 设定 Socket 为监听状态,准备被连接 accept() 接受某一Socket的连接要求,以完成面向连接的客户端 Socket 的连接请求。 connect() 要求连接某一Socket到指定的网络上服务端 recv() 从面向连接的 Socket 接收信息 send() 使用面向连接的 Socket 发送信息 WSAAsyncSelect() 要求某一 Socket 有事件 (event) 发生时通知使用者

(三) MFC Socket编程技术

MFC是对API的封装,MFC针对WinSock API封装了两个类:CAsyncSocket和Csocket。因此,使用这两个类进行Socket网络程序的编写会比使用API方便一些。

MFC中Socket相关类的继承关系如下图:

7

CObject CAsyncSock CSocket [图1] MFC中Socket相关类的继承关系

CAsyncSocket对WinSock API进行了较低程度的封装,缺省情况下建立的Socket是异步操作方式,即非阻塞的,因此一些阻塞操作,需要自己动手完成。另外,由于它对API的封装程度不高,以前在WinSock API中需要自己完成的工作(比如:字节顺序的转换),仍然需要自己完成。当然有许多程序员喜欢使用该类甚至WinSock API,原因是这些方法具有很大的灵活性,给程序员以较大的发挥空间。

为了给程序员提供更方便的接口以自动处理网络通信中的一些任务,MFC在CAsycnSocket类的基础上派生了CSocket类,它提供了比CAsyncSocket更高层的WinSock API接口。CSocket的网络操作是同步方式,即阻塞式的。CSocket建立的Socket不是阻塞的,而是对非阻塞的Socket进行处理后实现的阻塞操作。在阻塞任务执行过程中,Windows线程的消息循环仍然有效,也就是说CSocket类的阻塞操作不影响Windows的消息循环。

8

第二章 需求分析

在这里先说明设计的需求分析之前分析一下设计的可行性。

可行性分析的目的是为了用最小代价在最短时间内确定问题是否能够解决。可行性分析的实质就是要进行一次压缩简化系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。

一、可行性分析

1)技术可行性:本系统以Visual C++为主要编程环境,再结合网络通信基

本原理和Socket编程及语音处理API技术,技术成熟,可行。

2)经济可行性:这个系统开发开发成较低,经济效益会远大于开发成本,

可行。

3)操作可行性:系统硬件为PC机,软件为Windows NT/2000,而且编程环

境Visual C++为专业程序员使用工具,比较易于使用,可行。

二、 需求分析

需求分析的基本任务是准确的回答“系统必须做什么?”这个问题。这一阶段是对系统认识最为全面、准确、清晰、得体的一个比较关键的时期。而且需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。因此,必须用行之有效的方法对软件需求进行严格的审查验证,为下一步的总体设计打好基础。

(一) 系统的功能要求

在线朋友指的是在所有使用本系统在局域网上进行信息传递的用户。局域网中在线用户之间的聊天包括文本聊天及语音聊天。

文本聊天就是在线双方互相传递文本信息的功能,而语音聊天就是指在线双方互相传递语音信息的功能。

下面是文本聊天部分所要完成的功能。

1)在这个系统中只要在线就可以和所有使用此系统的已经在线的朋友进行聊天, 并且为不同的朋友提供不同的聊天窗口,也就是说和10个在线人员聊天的话就得有10个聊天窗口打开。

2)与特定用户之间的聊天窗口中必须提供聊天信息的输入和聊天信息的显示功能。

3)要发送给对方的文字或字符的输入工作要在聊天窗口的输入框中完成。 4)当输入完聊天信息以后进行发送,当发送没有结束时,不能进行新的聊天内容的输入。一般聊天内容一次不能超过500个字符。

5) 聊天信息要显示在聊天窗口中,显示的内容包括:发送信息、接收信息。 发送信息是指自己发送给对方的信息,即发送内容;接收信息是指来自对方的信息,这里显示接收到的内容。

9

以下是语音聊天部分要完成的功能。

6)在聊天窗口以建立的基础上,建立与服务器端的连接。 7)与对方连接以后开始语音聊天。

8)想结束语音聊天时,按结束键就能与对方断开连接,即结束语音聊天。 (二) 系统性能要求

a.. 时间性能要求:在实际应用中由于客户端的大量频繁的访问,服务器响应时间应该尽可能缩短,对于有特殊需求的应用,还要求达到实时响应。

b. 存储性能要求:根据应用中的实际情况配置适当容量的存储设备,特别是音频存储设备容量方面要适当得配置。

c. 稳定性安全性要求:要求软件尽可能的稳定,对于一般的应用系统,对安全 性要求不高,对于特殊的应用,还需要在安全性方面加以保证,所以要相应提高服务器端的配置。 (三) 系统运行要求

服务器端: 用于接收/转发数据。在本系统中服务器端本身也可以是客户端。 客户端 : 多个PC机,通信用,作为文字及音频数据发生端。

10

第三章 总体设计

经过了需求分析阶段的工作,系统必须“做什么”的问题已经清楚了,现在是决定“怎么做”的时候了。总体设计的基本目的就是回答“系统应该如何实现?”这个问题。在这里要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

在需求分析里也已经说明了对于局域网即时聊天程序的设计过程主要由在线朋友文本聊天功能和语音聊天功能。由于语言聊天是发送声音的一端将硬件接口采集到的声音数据通过Socket发送到另外一端,另外一端根据得到的声音数据调用硬件接口播放声音,所以其核心是声音数据的采集、播放和声音数据的网络传输。

一、 层次图

根据本次设计需要,把整个即时聊天系统分成文本聊天部分和语音聊天部分。

文本聊天部分主要由文字输入及发送、聊天记录保存、接收文字信息等三个模块分成。语音聊天部分则由四个模块分成。即通信模块、声源采集模块、声音数据传输、音频再生模块。

即时聊天 文本聊天 语音聊天

文聊接通声声音 字天收信源音频输记文模采数再

入录字块集据生 及保信传发存息输

[图2] 本次设计的层次图

二、 各模块功能及相互关系

由于设计本身着重于语音聊天部分,所以在这里就针对这部分进行说明。

1. 通信模块:主要功能是接收并连接服务器端和客户端接口,负责作为服务器 时的网络端口监听,并且为客户端接口的发送数据和接收数据进行消息处理。为文本发送与接收及语音交互奠定了基础。

2. 声源采集模块:主要功能为负责采集客户端发出的声源,把采集到的声源放到缓冲区里,为语音传送建立了基础。

11

3. 声音数据传输模块:主要功能是把采集到的声源进行保存及传送,一旦传送到就把内存置空,返还到录音设备进行录音,它为音频再生模块提供语音数据。

4. 音频再生模块;主要功能是接收声音数据传输模块传送过来的语音数据进行放音并且释放内存以便于保存采集到的声源。这模块为接收方的客户端提供了音频数据,使语音交互顺利进行。

5. 至于文字输入模块及输出模块是为通行模块提供了文本数据,并通过通信模块进行两个客户端之间的文本交互。

在这里特别要注意的是录音和播放的程序处理中要特别注意分配内存的大小和数量,一定要保证在录音过程中录音设备至少有一块内存可供录音,使得循环能够顺利进行。

12

第四章 详细设计

详细设计阶段的根本任务是确定应该怎样具体地实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。

系统运用共享数据结构技术及多线程技术,通过I/O端口与用户端连接,实现了数据转发功能。首先,程序初始化网络,接着客户端连接到服务器时,创建接收线程和发送线程,这样就可以实现数据转发。最后,当用户断开连接时,服务器关闭与他的连接,并结束相应的线程。

在开始进行聊天通信前得先把系统初始化,系统的初始化过程为:

开始

启动状态

N 标记系统 系统运行 已经运行 Y 环境 准备 Winsock/COM 结束 载系统配置文 就绪状态 创建主窗口 加载用户配置信息 启动聊天接收服务 用户上线信息 设置用户在线 状态定时器 在线状态

[图3] 系统初始化流程图

当系统完成初始化过程以后就可以进行具体聊天通信了(即文本交互和语音交互)。

13

一、各个模块的具体流程

当用户登陆到系统后会出现一个聊天窗口,建立服务器端和客户端连接以后就可以开始进行文本聊天了,用户把聊天内容输入到聊天信息输入框以后发送聊天内容,这时系统会自动把聊天内容保存起来并显示在聊天记录窗口中,聊天记录包括发送和接收的聊天信息。

以下则是语音聊天的几个模块具体流程。 (一) 通信模块

进行聊天需要建立服务器端Socket和客户端Socket,并且要连接上,这样才能进行信息的传送,通信模块主要定义的就是这部分Socket建立和连接。

开始

开始

服务器端初始化 客户端建立Socket 创建Socket数组

并与本地端口绑定

请求与服务器端 N 是否创建成功 的连接

Y

有无请求 N Y 客户端连接请求监听 建立服务器端与客户端的Socket连接

END

[图4] 服务器端的Socket建立和连接 [图5] 客户端的Socket建立和连接

(二) 声源采集模块

用户按语音聊天开始键以后,就开始音频聊天,要进行语音数据传送,就得有声源采集模块。声源采集模块的主要流程为采集到声源以后把语音数据放到缓

14

建立服务器端与客户端的Socket连接 END 冲区里。

(三) 声音数据传输模块

声源采集模块放到缓冲区里的语音数据经过这个模块以后到达音频再生模块。在这里采集到的声源数据并不能保证完全被保存并进行传送,因为可能会出现声源数据量如果多于录音内存量的话就不能进行保存,而要等待经过音频再生模块并释放出来的内存,然后再进行保存。

开始

访问缓冲区

进行保存

发送 N 到声是否够内存 源保 Y 存部等待空闲内存 分 进行传送 N 释放内存 传送完毕 有无内存 Y END

[图6] 声音数据传输模块流程图

(四) 音频再生模块

经过处理过的语音数据通过音频处理模块传送到这个模块,当接收到语音数据以后它将经过录音的语音数据进行放音,然后把内存释放出来以备保存其他缓冲区里保存的声源信息。

为什么要释放内存呢?那是因为声音数据具有很强的前后相关性,数据量大、实时性强,又由于声音是连续的,通常把其称之为连续型时基媒体类型。当缓冲区接收到声源以后要是内存不够的话就不能及时把全部语音数据保存并传送,所以经过这个模块以后就得把录音内存释放掉,好让上一个模块及时得到完成。

15

开始 接收传送过来的语音数据 进行放音 释放内存到缓冲区 END [图7] 音频再生模块流程图

经过这个模块才能算是真正完成了语音聊天了,如果想结束聊天只要断开与对方的连接即可。

16

第五章 关键代码分析

经过总体分析和详细分析,整个设计有了大概的框图之后就可以进行编程

了。编程的质量直接影响到运行结果,所以要做到远程序代码的逻辑简明清晰、易读易懂是程序好坏的一个重要标准,其中适当的注解是非常重要的。 本次设计的特点是一个用户端既是服务器端也是客户端,所以针对一个用户端作为服务器端或者作为客户端的时候的代码进行分析。

一、 服务器端对客户端Socket的处理代码

void CChatDlg::ProcessPendingAccept() {

CclientSocket* pSocket=new CclientSocket(); If (m_pListenSocket.Accept(*pSocket)) {

Cmessg msg;

Msg.m_strText=“一个游客进入聊天室了”;

M_sShowString+=“一个游客进入聊天室了\\n”; POSITION pos;

For(pos=m_connectionList.GetHeadPosition();pos!=NULL;) {

CclientSocket * t=(CclientSocket *)m_connectionList.GetNext(pos); t->SendMessage(&msg); }

pSocket->Init(this);

m_connectionList.AddTail(pSocket); } else

delete pSocket;

}

二、客户端连接到服务器端时消息处理代码

void CChatDlg::OnConnecserver() {

//TODO:Add your control notification handler code here if(!m_bInit) {

BYTE f0,f1,f2,f3; Cstring name;

((CIPAddressCtrl*)(GetDlgItem(IDC_IPADDRESS)))->GetAddress(f0,f1,f2,f3);

Cstring ip;

17

Ip.Format(“%d.%d. %d. %d,f0,f1,f2,f3); M_bClient=true;

M_clientsocket.Create();

If(m_clientsocket.Connect(ip,GetDlgItemInt(IDC_PORT))) {

m_clientsocket.Init(this);

SetDlgItemText(IDC_SHOWTEXT,”Client Connection Succeed”); M_bInit=true;

} else {

m_clientsocket.Close();

AfxMessageBox(“client connection failed”); M_bInit=false; } } }

三、 设置服务器端的消息处理代码

void CChatDlg::OnSetserver() {

//TODO:Add your control notification handler code here if(!m_bInit) {

m_bClient=false; m_bInit=true;

if(m_pListSocket.Init(GetDlgItemInt(IDC_PORT),this)==FALSE) {

m_bInit=false; return; } } }

四、语音聊天按钮的消息处理代码

void CChatDlg::OnNewsend() {

//TODO:Add your control notification handler code here if(m_willchating==TRUE //进行语音聊天 {

m_sound.Init(this); m_sound.Record();

SetDlgItemText(IDC_NEWSEND,”停止语音聊天”); M_willchating=FALSE;

18

}

else //停止语音聊天 {

CsingleLock lock(&m_mutex,TRUE); M_sound.StopRecord();

SetDlgItemText(IDC_NEWSEND,”语音聊天”); M_willchating=TRUE; Lock.Unlock(); }

}

五、相关类的说明

1) CserverSocket 是服务器端Socket类,关于这部分的核心代码为:

BOOL CserverSocket::Init(UNI port, CChatDlg* dlg)//服务器端初始化 {

m_uPort=port; m_dlg=dlg;

if(Create(m_uPort)==FALSE) {

AfxMessageBox(“Server Socket Create Error”); Return FALSE; }

if(this->Listen==FALSE) {

AfxMessageBox(“Server Listen Error”); Return FALSE;

}

m_dlg->SetDlgItemText(IDC_SHOWTEXT,”Server Has Been Set OK!”); return TRUE; }

void CserverSocket::OnAccept(int nErrorCode) {

m_dlg->ProcessPendingAccept(); Csocket::OnAccept(nErrorCode); }

2) ClientSocket是客户端Socket类,关于这部分核心代码为:

//通信Socket的初始化,一些关于传输数据串行化的操作 Void CClientSocket::Init(CChatDlg* dlg) {

m_sfSocketFile=new CsocketFile(this);

m_aSessionIn=new Carchive(m_sfSocketFile,Carchive::load); m_aSessionOut= new Carchive(m_sfSocketFile,Carchive::store);

19

m_bClose=false; this->m_dlg=dlg; }

//Socket接收到传输过来的数据的消息相应函数 void CClientSocket::OnReceive(int nErrorCode) {

Csocket::OnReceive(nErrorCode); Do {

Cmessg temp;

Temp.Serialize(*m_aSessionIn); M_dlg->m_sMsgList+=temp.m_strText;

M_dlg->SetDlgItemText(IDC_SHOWTEXT,m_dlg->m_sMsgList);

//如果有声音过来并且本机的声音设备已经准备好,则在本机发出声音 if(temp.m_tag==l&&m_dlg->m_willchating==FALSE) {

memcpy(m_dlg->m_sound.m_cBufferOut,temp.m_buffer,MAX_BUFFER_SIZE); } int

linenum=((Cedit*)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();

((Cedit*)(m_dlg->GetDlgItem(IDC_SHOWTEXT)))->LineScroll(linenum); //如果是服务器端还需要将接收到的数据转发到其他客户端。

If(!m_dlg->m_bClient) {

for(POSITION pos=m_dlg->m_connectionList.GetHeadPosition();pos!=NULL;) {

CClientSocket*t=(CClientSocket*)m_dlg->m_connectionList.GetNext(pos); If(t->m_hSocket!=this->m_hSocket)//不是本地socket {

t->SendMessage(&temp); } } } }

while (!m_aSessionIn->IsBufferEmpty()); }

//发送数据到另外一端

BOOL CclientSocket::SendMessage(Cmessg*msg) {

if (m_aSessionOut !=NULL) {

20

msg->Serialize(*m_aSessionOut); m_aSessionOut->Flush(); return TRUE; } else {

//对方关闭了连接 m_bClose=true; CloseSocket();

M_dlg->CloseSessionSocket(0; Return FALSE; } }

//关闭socket,需要将串行化相关的内存释放 void CclientSocket::CloseSocket() {

if(m_aSessionIn) {

delete_m_aSessionIn; m_aSessionIn=NULL; }

if(m_aSessionOut) {

delete_m_aSessionOut; m_aSessionOut=NULL; }

if(m_sfSocketFile) {

delete_m_aSessionOut;

m_sfSocketFile=NULL; }

Close();

M_bInit=false; M_bClose=true; }

//socket接收到对方socket关闭的消息后的响应函数 void CClientSocket::OnClose(int nErrorCode) {

m_bClose=true; CloseSocket();

M_dlg->CloseSessionSocket(); Csocket::OnClose(nErrorCode); }

21

除了这些类以外还有音频数据处理的Csound类,还有一个数据类Cmessg类,至于这方面的代码在这里省略。

22

第六章 测试

测试在开发软件过程中是一个不可缺少的部分。因为在开发软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,与工程密切相关的各类人员之间的通信和配合也不可能完美无缺,因此,在软件生命周期的各个阶段都不可避免地产生差错。我们力求在每个阶段结束之前通过严格的技术审查,尽可能早地发现并纠正错误;但是,经验表明审查并不能发现所有的差错,此外在编码过程中还不可避免地会引入一些新的错误。如果在软件生产性运行之前,没有发现并纠正软件中的大部分差错,则这些错误迟早在生产过程中暴露出来,那时不仅仅改正这些错误的代价更高,而且往往会造成很恶劣的后果。测试的目的就是在软件投入生产运行之前,尽可能多地发现并纠正软件中的错误。基于上述的原因,我在编码过程中进行了模块测试,编码结束进行了系统测试和验收测试。下面将介绍测试方案,测试过程和测试结果。

一、 模块测试

(一)测试方案

采用了白盒测试,即按照程序内部的逻辑结构,检验程序中的每条通路是否都按预定要求正常工作。 (二)测试过程

检验模块之间的接口。

A 每个被调用模块是否正确接受参数。

B 每个调用模块是否能调用每个自己想要调用的模块。 3 测试结果

测试结果表明,每个模块之间的接口都吻合,即被调用模块都能正确接受参数,调用模块能调用自己想要调用的每个模块。

二、 功能测试

(一)测试方法

采用了黑盒测试,即检查程序功能是否能要求进行,是否适当地接受数据产生正确的输出信息,并且保持外部信息的完整性。

(二) 测试过程

主要检验是否能正确实现每个功能。 A 每个功能是否按要求正常进行。 B 用户界面是否友好

23

测试结果表明,每个功能都按要求进行。

三、测试结果

结果表明,经过测试每个功能都能按预先要求正常进行且速度达到了预期的标准。用户界面友好。当用户输入文字信息并发送时信息将被传送到接收方并且能显示聊天记录。当用户请求语音聊天的时,系统能快速准确地联系到对方并建立语音连接。当然,整个系统在测试过程中仍发现了不少的错误,但在指导老师的指导下改正并完善了所发现的错误。

24

第七章 结论

通过本次设计,学到了不少东西。最重要的是对进行软件设计的整体设计流程及思维方法有了深刻的认识。在期间,发现的许多问题都源于没有认真地按步骤进行设计,不重视需求分析,总体设计部分,对各个方面将会产生的问题考虑不周全。

在设计过程中,对于我来说,由于很多都是新知识,这就迫使我到处查阅相关资料,学习新知识,不仅体会到Visual C++编程环境的强大功能,也对新接触到的Socket编程和语言处理API有了大概的了解。

由于我本人的技术限制,可能有很多不足之处,望各位老师多加批评和指正谢谢!

25

参考文献

1. 李强 贾云霞, 《Visual C++ 项目开发实践》(第一版),出版单位:中国铁道

出版社,出版年度: 2003年 8月, P185-P266.

2. 刘长明 杨工明, 《Visual C++ 实践与提高》(第一版), 出版单位:中国铁

道出版社, 出版年度 : 2001年 3月, P285-P327.

3. 张海藩著,《软件工程导论》(第三版),出版单位:清华大学出版社,出版

年度:1998年1月,引用部分从第一章节开始.

26

参考文献

1. 李强 贾云霞, 《Visual C++ 项目开发实践》(第一版),出版单位:中国铁道

出版社,出版年度: 2003年 8月, P185-P266.

2. 刘长明 杨工明, 《Visual C++ 实践与提高》(第一版), 出版单位:中国铁

道出版社, 出版年度 : 2001年 3月, P285-P327.

3. 张海藩著,《软件工程导论》(第三版),出版单位:清华大学出版社,出版

年度:1998年1月,引用部分从第一章节开始.

26

本文来源:https://www.bwwdw.com/article/jqj7.html

Top