本科毕设论文聊天系统设计与实现.docx
《本科毕设论文聊天系统设计与实现.docx》由会员分享,可在线阅读,更多相关《本科毕设论文聊天系统设计与实现.docx(53页珍藏版)》请在冰豆网上搜索。
![本科毕设论文聊天系统设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-2/3/fa92e790-38e6-4cb1-b757-c6566e0e3629/fa92e790-38e6-4cb1-b757-c6566e0e36291.gif)
本科毕设论文聊天系统设计与实现
聊天系统设计与实现
基于c++的FeiQ的山西大内公司局域网聊天系统的设计与实现
——文本、语音聊天
学生姓名:
张立澎指导教师:
樊东燕胡艳慧
内容提要:
随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。
局域网的发展也同样迅速。
很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET。
因此基于局域网的即时通信工具,就这样应运而生了。
本文提出了一个局域网聊天工具的设计,并在WINDOWS平台上加以了实现。
本设计将语音聊天、文本聊天和功能综合在一个客户端程序之内,使用C#语言进行网络编程,用多线程实现不同的并行任务,并进行了人性化的界面设计,使用起来简单方便,并且功能十分合理,又易于扩展以及个性化定制。
关键词:
局域网文本聊天语音对话可扩展标记语言多线程
1.引言
1.1系统开发的背景
当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。
随着网络的普及化,网络作为人们相互间沟通与交流联系的现代化工具日益重要,可以说现在人们的生活已经离不开网络。
在现实生活中人们可以通过多种手段与家人亲戚朋友交流通讯,像电话,电子邮件等。
但这些手段都有些缺点,要么费用太高,要么实时性不强,要么1次只能和1位好友进行交流。
于是这就需要1种便宜,快速,能同时与多个好友进行通讯的网络工具的出现,而网络聊天工具就满足了这些需求,填补了这个空白。
在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。
聊天室程序可以说是网上最简单的多点通信程序。
一个简单的聊天室,从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。
广域网上的即时通信工具,如今一般采用UDP或者TCP协议体系来实现,开发技术已经比较成熟,这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是利用各种平台上的网络通信接口,建构基于TCP/IP,或者UDP协议的软件产品。
网络的飞速发展使网络应用程序的开发地位显的越来越重要,而网络应用程序的开发和传统应用程序的开发在思想和实现上有很大的区别,随着网络技术和数据库管理系统的发展,C/S体系结构在软件的开发中越来越流行。
因为这种结构的应用软件可以充分发挥网络的作用和数据库系统的优势,以满足人们各种应用的需求。
1.2聊天工具开发的目标
本设计的主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,具体是采用P2P模式实现用户之间的通信,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。
1.3聊天工具开发的现实意义
局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具,一般都具有文本聊天和文件传输功能。
局域网聊天软件因其使用简单,系统资源消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。
当前的局域网聊天工具有很多,最有名的算IPMSG(飞鸽传书)。
Ipmsg能够实现局域网内消息、文件传递。
但是,ipmsg在某些时候,在同一vlan下的用户,能够彼此看见对方,却不能通信,因为其采用的是udp协议作为消息传递协议,而这种传输是不稳定的,所以有时候能看到对方的用户之间不能实现互相通信,怎么办呢?
一种解决方法就是,采用tcp协议,面向连接的传输层协议作为消息传递协议,开发出相应的网络应用程序就能够实现彼此连接的双方进行信息的传递。
随着互联网的不断发展,“互联网要担当起通讯大任”的声音不绝于耳。
未来的电信业务将呈现多元化格局。
同样是话音业务,可能是PSTN网络(传统电话网)提供的,可能是Internet提供的,还可能是有线电视网络,甚至电力网、煤气管道网提供的。
而用户的选择也将包括电脑与电脑、电脑与电话、电话与电话、电话与(智能)手机等通话方式。
这一切,都是以IP为基础的通讯网络,而非传统通讯模式的电信服务。
所以,VOIP将是聊天工具的一个发展方向。
现有的局域网聊天工具,一般都不具备语音聊天的功能,本软件集成了语音聊天模块,用户可以通过此软件实现语音互通,提高局域网用户之间信息传递效率以及交流质量。
通过开发本软件,可以了解当前流行的voip技术,练习socket编程,扩展知识面,锻炼编程的能力等,所以极具研究价值。
2.开发平台与相关知识简介
2.1系统综合要求
2.1.1硬件要求:
PC机:
2台或者2台以上,RAM256MB以上,CPU400MHZ以上,硬盘40GB以上、耳麦各2副
局域网
2.1.2程序运行环境:
系统开发平台:
MicrosoftVisualC++6.0;MicroSoft.NETFramework
系统开发语言:
C++
运行平台:
Window2000,WindowsXp,WindowsServer2003
运行环境:
MicrosoftVisualC++6.0
分辨率:
最佳效果1024×768
2.2C++简介
C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“Cplusplus”,“CPP”。
它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
2.3MicroSoft.NETFramework简介
NETFramework是由微软开发,一个致力于敏捷软件开发(Agilesoftwaredevelopment)、快速应用开发(Rapidapplicationdevelopment)、平台无关性和网络透明化的软件开发平台。
.NET是微软为下一个十年对服务器和桌上型软件工程迈出的第一步。
NET包含许多有助于Internet和Intranet应用迅捷开发的技术。
.NET也为编程界面(API)提供了新功能和开发工具。
这些革新使得程序设计员可以同时进行Windows应用软件和网络应用软件以及元件和服务(webservice)的开发。
.NET提供了一个新的反射性的且面向对象程序设计编程界面。
.NET设计得足够通用化从而使许多不同高级语言都得以被汇集。
2.4MicrosoftDirectXSDK简介
SDK是SoftwareDevelopmentKit的缩写,中文意思就是“软件开发工具包”。
这是一个覆盖面相当广泛的名词,可以这么说:
辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。
具体到我们这个系列教程,我们后面只讨论广义SDK的一个子集——即开发Windows平台下的应用程序所使用的SDK。
SDK提供了一整套开发Windows应用程序所需的相关文件、范例和工具的“工具包”。
由于SDK包含了使用API的必需资料,所以人们也常把仅使用API来编写Windows应用程序的开发方式叫做“SDK编程”。
而API和SDK是开发Windows应用程序所必需的东西,所以其它编程框架和类库都是建立在它们之上的,比如VCL和MFC,虽然他们比起“SDK编程”来有着更高的抽象度,但这丝毫不妨碍它们在需要的时候随时直接调用API函数。
2.5.NET与多线程技术
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。
线程是在同一时间需要完成多项任务的时候被实现的。
在本质上和结构来说,.NET是一个多线程的环境。
有两种主要的多线程方法是.NET所提倡的:
使用ThreadStart来开始你自己的进程,直接的(使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用BeginInvoke)使用ThreadPool类。
线程的基类是System.Threading。
所有线程通过CLI来进行管理。
2.6C/S结构与WINDOWSSOCKETS网络编程
通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:
它包括一个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。
有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。
Client/Server结构是当前数据库应用程序中极为流行的一种方式。
尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。
另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。
Client/Server模型最终可归结为一种“请求/应答”关系。
一个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。
在客户发出一个请求之前,服务进程一直处于休眠状态。
一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答,如图1所示。
图1客户机/服务器通信结构示图
为了方便Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。
现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。
在IP连接领域有两种通信类型:
面向连接的(Connection-oriented)和无连接的(Connectionless)。
在面向连接的套接字中,使用TCP协议来建立两个IP地址端点之间的会话。
一旦建立了这种连接,就可以在设备之间可靠地传输数据。
为了建立面向连接的套接字,服务器端和客户端必须分别进行编程。
在System.Net.Sockets名空间下,有两个专门用于TCP协议编程的类:
TcpClient类和TcpListener类。
这两个类提供了直观的易于使用的属性和方法,从而降低了TCP协议编程的难度。
一般情况下,使用TcpClient连接、发送和接收数据,使用TcpListener监听是否有传入的连接请求,使用Close()方法释放与TcpClient关联的所有资源。
C/S模式下Windowssocket编程示意图,如图2所示。
图2C/S模式下socket编程
具体到这个项目,服务器只是用来验证用户的登录,以及广播用户的登录状态等。
具体的通信,采用P2P模式,每两个客户端要进行连接通信时都直接连通而不用通过服务器来进行信息的中转,这样设计的优点是既可以对用户进行管理,又不会造成服务器的通信负担。
所以,系统结构将设计成如图3的方式。
图3客户机直接通信结构示图
2.7XML简介
XML(ExtensibleMarkupLanguage)即可扩展标记语言,它与HTML一样,都是SGML(StandardGeneralizedMarkupLanguage,标准通用标记语言)。
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。
扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
XML与Access,Oracle和SQLServer等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:
数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。
事实上XML与其他数据表现形式最大的不同是:
他极其简单。
这是一个看上去有点琐细的优点,但正是这点使XML与众不同。
XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、MacOS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。
XML的主要作用有:
(1)丰富文件(RichDocuments)-自定文件描述并使其更丰富
(2)属于文件为主的XML技术应用
(3)标记是用来定义一块数据应该如何呈现
(4)解释数据(Metadata)-描述其它文件或在线信息
(5)属于数据为主的XML技术应用
(6)标记是用来说明一块资料的意义
(7)组态档案(ConfigurationFiles)-描述软件的组态参数
3.需求分析
3.1用户需求
随着中小型企事业的不断发展,在企业内部实现局域网通信是必不可少的。
局域聊工具就是一个非常好的局域网通信软件,它可以在职工不移动位置的情况下进行在线聊天、、语音聊天。
这样,可以大大提高企业的工作效率,便于企业内部职员的交流。
根据用户对聊天工具的要求,可分为以下几点:
1、操作简单方便、界面简洁美观。
2、客户端能够注册新用户
3、可以在局域网实现文字传输
4、可以实现局域网语音聊天
5、系统运行稳定、安全可靠
3.2系统功能需求
这个程序要实现的功能如下:
(1)程序启动之后就能看到当前哪些机器在线,哪些可以与之进行对等通信。
(2)一旦有某个网内的机器上线了,要有即时通知,并能及时更新用户界面中的用户列表。
(3)当双击某个列表项的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。
(4)聊天界面要人性化,下面是发送框,上面有已有聊天记录,并借助滚动条看到当次所有的聊天记录。
(5)当有远程用户向本机发送文件的时候,要弹出一个消息提示框,提示本机用户,可以选择接收或者拒绝。
(6)当用户觉得有必要保存聊天记录时,提供一个简单的聊天记录保存功能。
(7)文件传输过程中,应该有当前传输状态提示,并能够对传输耗时等进行计算,作为当前网络状态的一种反馈。
3.3性能要求
首先要求程序要完全可靠,可以应付各种由于系统问题产生的错误,比如初始网络失败,对方突然下线等。
要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。
程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。
开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能够清晰的理解整个系统的设计思路以及实现细节。
要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。
并且不发生内存泄漏之类影响系统运行的错误事件。
并且要求易于维护及扩展。
所以应该采用模块化开发,各个模块之间不要有太多的耦合,以免维护困难。
3.4测试环境规定
在开发过程中由开发人员自己,也就是我和搭档莫景顺随时进行内部部分白盒测试,在开发完成以后,自己进行一个全面的白盒测试,然后请同学帮忙进行黑盒测试。
3.5可行性研究
(1)成本可行性分析
本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。
(2)技术可行性分析
开发所需要的软硬件平台已经搭建好,并进行了合理而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与C#开发环境的严密契合能力,加之相类似的更大规模的INTERNET通信工具产品也已有例在先,所以这个程序的开发在技术上是完全可行的。
4.系统设计
4.1系统目标
根据用户对聊天系统的要求,本聊天软件可以实现以下目标:
(1)登录ip,寻找已有ip主机
(2)当用户找到连接上主服务器
(3)实现客户端间的文本聊天
(4)实现客户端间的语音聊天
4.2系统功能结构
本系统中主要包括两个部分:
服务器端和客户端。
服务器端的功能包括:
客户端登录、被动连接上客户端ip主机、建立文本传递功语音功能。
客户端的功能包括:
登录端、文本聊天、语音聊天、退出。
客户端功能结构如图4所示。
图4客户端功能结构
图5系统业务流程图
4.3系统模块划分
由图5我们可以看出系统主要分为服务器端和客户端两大部分,把系统分为五个模块:
服务器模块、客户端模块、语音聊天模块、文本聊天模块。
5.系统模块详细设计
5.1文本聊天模块实现
凡是聊天工具,都少不了文本聊天功能,这是个基础功能。
通过文本聊天,局域网内用户能够发送和接收文字信息,并在程序窗体上显示出来,相互之间进行在线交流,并能根据用户需要,对聊天记录进行简单的保存。
文本聊天的信息传输协议主要有面向连接的TCP和无连接的UDP。
TCP协议是互联网中最重的协议之一,主要特点是:
保证数据包的准确到达;保证各数据包到达的顺序和数据包发出的顺序相同。
UDP协议提供了快速但不一定可靠的传输服务,UDP协议采用无连接的套接字,不需要在网络设备之间发送连接信息,和TCP相比,UDP缺乏双方的握手信号,因此不保证数据包一定到达目的地,可靠性不如TCP,而且,由于UDP没有任何对双方会话的支持,不能保证各数据包到达的顺序与数据包发出的顺序相同。
所以,在文本聊天模块中,采用TCP协议来传输文本信息。
5.1.1文本聊天服务器工作原理
开启服务器,文本聊天窗体加载成功后,将启动监听线程,服务器主要是负责监听局域网内的用户的连接请求。
收到客户发起的连接请求后,若服务器处于空闲状态,弹出消息提示框,对请求进行处理,服务器可以选择接受或者拒绝客户端的连接。
若同意连接,则返回给客户端同意信号,开启服务器的接收信息线程,并置消息发送事件为Enable。
客户端收到服务器返回的同意信号后,也开启接收信息线程,并置消息发送事件为Enable。
通信双方就可以进行文字聊天了。
若服务器端拒绝客户端的连接,则关闭tcpconnect,并关闭网络流,继续执行监听。
客户端得知服务器端关闭tcpconnect并关闭网络流之后,则释放本次socket和网络流。
若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的接入。
文本聊天服务器工作流程如图6所示。
图6文本聊天服务器程序流程图
5.1.2文本聊天客户端工作原理
客户端用来向服务器端发起一个连接,等待服务器的允许接入确认。
若服务器端同意连接请求,接收到服务器的同意连接信号后,开启接收信息线程,并置消息发送事件为Enable,通信双方就可以进行文本聊天了。
若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的发起。
5.1.3P2P文本聊天
1)功能概述
将文本聊天客户端和服务器模块,通过多线程技术,集成在一个聊天窗体里面,窗体加载时进行监听,有连接请求到达,则为服务器端;试图连接远程用户,则为客户端。
它是建立在TcpListener以及TcpClient这两个类基础上的。
程序实现的原理也比较简单,但是用到了P2P技术"非中心化"的基本原则。
简言之,用这个程序可以在网络中发送、接受消息,任何一台计算机既可以作为服务器端,又可以作为客户端。
2)集成文本聊天工作流程图
集成主窗体创建后,加载监听线程。
当有接入连接请求,同意或拒绝接入请求,若同意,则按照文本聊天服务器模块工作流程执行。
当无接入请求,则判断是否有尝试连接远程服务端事件,若有,则按照文本聊天客户端模块工作流程执行,如图7所示。
图7P2P文本聊天程序流程图
3)集成主窗体设计
主窗体是用来与用户交互用的,所以加载时间不能太长,响应速度应足够快,操作简单,设计人性化。
所以,设计的时候,采用了一些通俗易懂的图片和按钮。
当用户未输入文字而尝试发送时,弹出消息提示框,提示不能发送空信息,节省系统和网络资源。
表1文本聊天窗体主要控件属性表
控件
属性
值
GroupBox
Name
groupbox1
Text
信息显示
RichTextBox
Name
richTxtInfos
Readonly
TRUE
RichTextBox
Name
richTxtSent
Readonly
FALSE
Active
KeyDown
Button
Name
send
Text
发送消息
Button
Name
clearbox
Text
清除屏幕
Button
Name
savelog
Text
消息记录
4)具体实现
1、定义相关变量。
2、集成主窗体创建后,创建一个tcpListener的对象,端口为4000,IP为任意。
创建监听线程wait,wait线程执行的是waitconn()方法,启动监听线程。
调用getMyIP()方法用于获取本地IP地址,并在连接建立时传给对方。
当wait线程监听到远程用户的接入连接请求,弹出消息提示框,用户可以选择同意或拒绝接入请求。
若同意,则创建接收信息线程th,并启动th。
若用户拒绝远程接入请求,则关闭网络流nss,关闭tcps,并调用disconnect()重新初始化相关变量。
3、接收信息时,尝试读取网络流,采用的是Unicode编码。
读取到的消息如果不为断开连接信号,则在聊天记录框里面显示出来;若为断开信号,则执行disconnect()方法关闭当前连接。
4、当无接入请求,则判断用户是否有尝试连接远程服务端事件。
若有,创建TcpClient的对象tcpc,并尝试连接远程主机。
5、连接建立后,用户单击“发送消息”按钮或者在输入文本框内按热键“Alt+S”或“Ctrl+Enter”,触发send_Click事件。
send_Click事件主要是将用户的输入通过Socket,采用网络流的形式传输给远程用户,编码采用Unicode,同时在聊天记录框里面显示出来。
6、断开连接或关闭窗体,需要将Socket、网络流以及接收信息线程th进行关闭,重置各按钮的可用状态。
若是关闭窗体,还需将wait线程关闭。
5.2语音传输模块实现
5.2.1语音传输模块概述
除了文本聊天以外,局域网内另外一个应用是语音传输。
出于可靠性和效率考虑,本模块也采用TCP协议来进行用户之间文件的传输。
5.2.2文件传输接收端工作原理
语音实时传输是语音聊天软件的核心技术。
文中在分析语音实时传输原理的前提下,探讨了局域网语音实时传输的设备的初始化、内存分配、语音录制、播故和传输等具体方法,并以C++Builder6.0提供的控件为基础,以API函数给为工具,给出了局域网实时语音聊天的具体实例,实现了局域网聊天。
如图8所示。
图8语音传输接收端程序流程图
5.2.3语音传输发送端工作原理
开启窗体后,发送端选择用户需要发送的文件,向接收端发起的文件传输请求,若接收端端同意接收,开启计时器,将本地文件通过网络发送给接收端,并在文件传输过程中对文件传输状态进行反馈,文件发送完毕,关闭计时器,关闭文件流,并在状态栏上显示出完毕状态。
若接收端拒绝接受文件,则取消本次文件发送,等待用户的下一次文件发送事件。
文件传输发送端工作