《聊天系统设计与实现本科.doc》由会员分享,可在线阅读,更多相关《聊天系统设计与实现本科.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流聊天系统设计与实现本科.精品文档.聊天系统设计与实现目 录第1章 引言11.1 系统开发的背景11.2 聊天工具开发的目标21.3 聊天工具开发的现实意义2第2章 开发平台与相关知识简介32.1 系统综合要求32.2 C+ 简介32.3 MicroSoft. NET Framework 简介32.4 Microsoft DirectX SDK 简介32.5 NET 与多线程技术42.6 C/S结构与WINDOWS SOCKETS网络编程42.7 XML简介5第3章 需求分析63.1 用户需求63.2 系统功能需求63.3 性能要求63.4 测
2、试环境规定73.5 可行性研究7第4章 系统设计74.1 系统目标74.2 系统功能结构84.3系统模块划分9第5章 系统模块详细设计95.1 文本聊天模块实现95.2 语音传输模块实现145.3 用户管理模块实现17第6章 系统测试216.1 系统测试概述216.2 白盒测试216.3 黑盒测试22第7章 主要问题及解决247.1 多线程问题247.2 套接字异常24结语24参考文献25附录26基于c+的FeiQ的山西大内公司局域网聊天系统的设计与实现 文本、语音聊天 学生姓名:张 立 澎 指导教师:樊东燕 胡艳慧内容提要:随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于
3、互联网的信息发布,通信,数据共享等等。局域网的发展也同样迅速。很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET。因此基于局域网的即时通信工具,就这样应运而生了。本文提出了一个局域网聊天工具的设计,并在WINDOWS平台上加以了实现。本设计将语音聊天、文本聊天和功能综合在一个客户端程序之内,使用C#语言进行网络编程,用多线程实现不同的并行任务,并进行了人性化的界面设计,使用起来简单方便,并且功能十分合理,又易于扩展以及个性化定制。关键词:局域网 文本聊天 语音对话 可扩展标记语言 多线程1. 引言1.1 系统开发的背景当今世界正处于信息时代,计算机和通信网
4、络是这一时代所谓“信息基础设施”。随着网络的普及化,网络作为人们相互间沟通与交流联系的现代化工具日益重要,可以说现在人们的生活已经离不开网络。在现实生活中人们可以通过多种手段与家人亲戚朋友交流通讯,像电话,电子邮件等。但这些手段都有些缺点,要么费用太高,要么实时性不强,要么1次只能和1位好友进行交流。于是这就需要1种便宜,快速,能同时与多个好友进行通讯的网络工具的出现,而网络聊天工具就满足了这些需求,填补了这个空白。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间
5、实现多对多的通信。广域网上的即时通信工具,如今一般采用UDP或者 TCP协议体系来实现,开发技术已经比较成熟,这些软件,在使用方面各有特色,在实现方面也各有所长,但基于这些产品正在商业运营阶段,其实现方式属于商业机密,具体细节不可能得知,但是它在大的方面无非就是利用各种平台上的网络通信接口,建构基于TCP/IP,或者UDP协议的软件产品。网络的飞速发展使网络应用程序的开发地位显的越来越重要,而网络应用程序的开发和传统应用程序的开发在思想和实现上有很大的区别,随着网络技术和数据库管理系统的发展,C/S体系结构在软件的开发中越来越流行。因为这种结构的应用软件可以充分发挥网络的作用和数据库系统的优势
6、,以满足人们各种应用的需求。1.2 聊天工具开发的目标本设计的主要工作是设计一个基于WINDOWS平台的局域网即时聊天工具,具体是采用P2P模式实现用户之间的通信,然后阐述本软件的功能、特点及使用方法,并详细阐述开发本软件所用的相关技术,具体分析本软件的各个模块的功能及实现方法,说明本软件的设计思想及方法。1.3 聊天工具开发的现实意义局域网聊天工具,是在局域网内部使用的,用户之间用来交流的一个工具,一般都具有文本聊天和文件传输功能。局域网聊天软件因其使用简单,系统资源消耗少等优点,成为各企事业单位等的局域网内广泛应用的软件之一。当前的局域网聊天工具有很多,最有名的算IPMSG(飞鸽传书)。I
7、pmsg能够实现局域网内消息、文件传递。但是,ipmsg 在某些时候,在同一vlan下的用户,能够彼此看见对方,却不能通信,因为其采用的是udp协议作为消息传递协议,而这种传输是不稳定的,所以有时候能看到对方的用户之间不能实现互相通信,怎么办呢?一种解决方法就是,采用tcp协议,面向连接的传输层协议作为消息传递协议,开发出相应的网络应用程序就能够实现彼此连接的双方进行信息的传递。随着互联网的不断发展,“互联网要担当起通讯大任”的声音不绝于耳。未来的电信业务将呈现多元化格局。同样是话音业务,可能是PSTN网络(传统电话网)提供的,可能是Internet提供的,还可能是有线电视网络,甚至电力网、煤
8、气管道网提供的。而用户的选择也将包括电脑与电脑、电脑与电话、电话与电话、电话与(智能)手机等通话方式。这一切,都是以IP为基础的通讯网络,而非传统通讯模式的电信服务。所以,VOIP将是聊天工具的一个发展方向。现有的局域网聊天工具,一般都不具备语音聊天的功能,本软件集成了语音聊天模块,用户可以通过此软件实现语音互通,提高局域网用户之间信息传递效率以及交流质量。通过开发本软件,可以了解当前流行的voip技术,练习socket编程,扩展知识面,锻炼编程的能力等,所以极具研究价值。2. 开发平台与相关知识简介2.1 系统综合要求2.1.1 硬件要求:PC机:2台或者2台以上,RAM256MB以上,CP
9、U400MHZ以上,硬盘40GB以上、耳麦各2副局域网2.1.2 程序运行环境:系统开发平台:Microsoft Visual C+ 6.0 ;MicroSoft .NET Framework 系统开发语言:C+运行平台:Window2000,Windows Xp,Windows Server 2003运行环境:Microsoft Visual C+ 6.0分辨率:最佳效果 10247682.2 C+ 简介C+这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 它是一种使用非常广泛的计算机编程语言。C+是一种静态数据类型检查的、支
10、持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。2.3 MicroSoft .NET Framework 简介NET Framework 是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(Rapid application development)、平台无关性和网络透明化的软件开发平台。.NET是微软为下一个十年对服务器和桌上型软件工程迈出的第一步。NET 包含许多有助于Internet和Intranet应用迅捷开发的技术。.NET 也为编程界面(API)提供了新功能和
11、开发工具。这些革新使得程序设计员可以同时进行Windows应用软件和网络应用软件以及元件和服务(web service)的开发。.NET 提供了一个新的反射性的且面向对象程序设计编程界面。.NET 设计得足够通用化从而使许多不同高级语言都得以被汇集。2.4 Microsoft DirectX SDK 简介SDK 是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做 “SDK”。具体到我们这个系列教程,我们后面只讨论广义 SDK 的一个子集即开发 Windo
12、ws 平台下的应用程序所使用的 SDK。SDK提供了一整套开发 Windows 应用程序所需的相关文件、范例和工具的“工具包”。由于SDK 包含了使用 API的必需资料,所以人们也常把仅使用 API 来编写 Windows 应用程序的开发方式叫做“SDK 编程”。而 API 和 SDK 是开发 Windows 应用程序所必需的东西,所以其它编程框架和类库都是建立在它们之上的,比如 VCL 和 MFC,虽然他们比起“SDK 编程”来有着更高的抽象度,但这丝毫不妨碍它们在需要的时候随时直接调用 API 函数。2.5 .NET与多线程技术多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的
13、效率。线程是在同一时间需要完成多项任务的时候被实现的。在本质上和结构来说,.NET是一个多线程的环境。有两种主要的多线程方法是.NET所提倡的:使用ThreadStart来开始你自己的进程,直接的 (使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用 BeginInvoke)使用ThreadPool类。线程的基类是System.Threading。所有线程通过CLI来进行管理。2.6 C/S结构与WINDOWS SOCKETS网络编程通常的通信工具,都采用客户机/服务器(C/S)体系结构,C/S结构是这样的一种结构:它包括一
14、个客户机(或前端),一个服务器(或称后端),客户机的作用是访问和处理远程服务器上的数据,服务器的作用是接收和处理客户机的数据请求。有时,可能有多个客户向同一个服务器同时请求服务,这就需要服务器决定怎样处理这些请求。Client/Server结构是当前数据库应用程序中极为流行的一种方式。尤其是网络技术的发展,使得当前很多系统都采用这种方式进行构造,其最大的优点是将计算机工作任务分别由客户端和服务器端来共同完成,这样有利于充分合理的利用系统资源。另外它的服务器端还可以将信息集中起来,任何客户机都可以通过访问服务器而获得所需的信息。Client/Server模型最终可归结为一种“请求/应答”关系。一
15、个请求总是首先被客户发出,然后服务器总是被动地接收请求,返回客户需要的结果。在客户发出一个请求之前,服务进程一直处于休眠状态。一个客户提出请求后,服务进程被“唤醒”并且为客户提供服务,对客户的请求做出所需要的应答,如图1所示。图1 客户机服务器通信结构示图为了方便Client/Server模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用
16、多种协议的功能,但较常使用的是TCP/IP协议。在IP连接领域有两种通信类型:面向连接的(Connection-oriented ) 和无连接的(Connectionless)。在面向连接的套接字中,使用TCP协议来建立两个IP地址端点之间的会话。一旦建立了这种连接,就可以在设备之间可靠地传输数据。为了建立面向连接的套接字,服务器端和客户端必须分别进行编程。在System.Net.Sockets 名空间下,有两个专门用于TCP协议编程的类:TcpClient类和TcpListener类。这两个类提供了直观的易于使用的属性和方法,从而降低了TCP协议编程的难度。一般情况下,使用TcpClient
17、连接、发送和接收数据,使用TcpListener监听是否有传入的连接请求,使用Close()方法释放与TcpClient关联的所有资源。C/S 模式下Windows socket编程示意图,如图2所示。图2 C/S 模式下socket编程具体到这个项目,服务器只是用来验证用户的登录,以及广播用户的登录状态等。具体的通信,采用P2P模式,每两个客户端要进行连接通信时都直接连通而不用通过服务器来进行信息的中转,这样设计的优点是既可以对用户进行管理,又不会造成服务器的通信负担。所以,系统结构将设计成如图3的方式。图3 客户机直接通信结构示图2.7 XML简介XML(Extensible Markup
18、 Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。 XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等
19、,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。 XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。XML的主要作用有:(1)丰富文件(Rich Documents)- 自定文件描述并使其更丰富 (2)属于文件为主的XML技术应
20、用 (3)标记是用来定义一块数据应该如何呈现 (4)解释数据(Metadata)- 描述其它文件或在线信息 (5)属于数据为主的XML技术应用 (6)标记是用来说明一块资料的意义 (7)组态档案(Configuration Files)- 描述软件的组态参数 3. 需求分析3.1 用户需求随着中小型企事业的不断发展,在企业内部实现局域网通信是必不可少的。局域聊工具就是一个非常好的局域网通信软件,它可以在职工不移动位置的情况下进行在线聊天、语音聊天。这样,可以大大提高企业的工作效率,便于企业内部职员的交流。根据用户对聊天工具的要求,可分为以下几点:1、 操作简单方便、界面简洁美观。2、 客户端能
21、够注册新用户3、 可以在局域网实现文字传输4、 可以实现局域网语音聊天5、 系统运行稳定、安全可靠3.2 系统功能需求这个程序要实现的功能如下:(1) 程序启动之后就能看到当前哪些机器在线,哪些可以与之进行对等通信。(2) 一旦有某个网内的机器上线了,要有即时通知,并能及时更新用户界面中的用户列表。(3)当双击某个列表项的时候,要弹出聊天对话框,可以在其中编辑要发送的聊天信息,并进行发送。(4)聊天界面要人性化,下面是发送框,上面有已有聊天记录,并借助滚动条看到当次所有的聊天记录。(5) 当有远程用户向本机发送文件的时候,要弹出一个消息提示框,提示本机用户,可以选择接收或者拒绝。(6) 当用户
22、觉得有必要保存聊天记录时,提供一个简单的聊天记录保存功能。(7) 文件传输过程中,应该有当前传输状态提示,并能够对传输耗时等进行计算,作为当前网络状态的一种反馈。3.3 性能要求首先要求程序要完全可靠,可以应付各种由于系统问题产生的错误,比如初始网络失败,对方突然下线等。要求提前设想到类似的尽可能多的可能发生的事件,做出相应的应对措施,并向用户提交简单易懂清晰明白的提示信息。程序要有良好的容错性,当用户进行非法操作时或者系统本身出现问题时要能以最好的方式退出程序,避免发生程序假死现象。开发文档要有好的易理解性,如果系统又要交由别人接手开发,或者自己由于种种原因需要进行二次开发,那么要保证以后能
23、够清晰的理解整个系统的设计思路以及实现细节。要求程序对所运行之系统的硬件条件要求尽可能低,运行时内存占用尽可能小,响应速度要尽可能快。并且不发生内存泄漏之类影响系统运行的错误事件。并且要求易于维护及扩展。所以应该采用模块化开发,各个模块之间不要有太多的耦合,以免维护困难。3.4 测试环境规定在开发过程中由开发人员自己,也就是我和搭档莫景顺随时进行内部部分白盒测试,在开发完成以后,自己进行一个全面的白盒测试,然后请同学帮忙进行黑盒测试。3.5 可行性研究(1)成本可行性分析本软件只做开发学习使用,所以暂且不考虑经济成本及盈利问题。(2)技术可行性分析开发所需要的软硬件平台已经搭建好,并进行了合理
24、而完善的需求分析,做好了充分的前期准备工作,其次因为本程序的平台将基于WINDOWS,将要使用网络通信技术,而WINDOWS有完善成熟的网络通信接口,以及与C#开发环境的严密契合能力,加之相类似的更大规模的INTERNET通信工具产品也已有例在先,所以这个程序的开发在技术上是完全可行的。4. 系统设计4.1 系统目标根据用户对聊天系统的要求,本聊天软件可以实现以下目标:(1)登录ip,寻找已有ip主机(2)当用户找到连接上主服务器 (3)实现客户端间的文本聊天(4)实现客户端间的语音聊天4.2 系统功能结构本系统中主要包括两个部分:服务器端和客户端。服务器端的功能包括:客户端登录、被动连接上客
25、户端ip主机、建立文本传递功语音功能。客户端的功能包括:登录端、文本聊天、语音聊天、退出。客户端功能结构如图4所示。局域网聊天工具客户端 登陆端 退出文字聊天语音聊天连接 建立IP 连接ip发右下角接theend接收消息消息记录发送消息语音传输语音播放语音采集发起连接接受连接图4 客户端功能结构 客户端有局域网ip进入界面登录ip主窗体对话框窗体服务器端服务器(建立新的ip主机或者连接已存在的ip地址)无主ip发消息发消息NYY服务器(记录所有注册用户和显示所有当前在线用户)N客户端主窗体发消息对话框窗体发消息TCP/UDP协议 图5 系统业务流程图4.3系统模块划分由图5我们可以看出系统主要
26、分为服务器端和客户端两大部分,把系统分为五个模块:服务器模块、客户端模块、语音聊天模块、文本聊天模块。5. 系统模块详细设计5.1 文本聊天模块实现凡是聊天工具,都少不了文本聊天功能,这是个基础功能。通过文本聊天,局域网内用户能够发送和接收文字信息,并在程序窗体上显示出来,相互之间进行在线交流,并能根据用户需要,对聊天记录进行简单的保存。文本聊天的信息传输协议主要有面向连接的TCP和无连接的UDP。TCP协议是互联网中最重的协议之一,主要特点是:保证数据包的准确到达;保证各数据包到达的顺序和数据包发出的顺序相同。UDP协议提供了快速但不一定可靠的传输服务,UDP协议采用无连接的套接字,不需要在
27、网络设备之间发送连接信息,和TCP相比,UDP缺乏双方的握手信号,因此不保证数据包一定到达目的地,可靠性不如TCP,而且,由于UDP没有任何对双方会话的支持,不能保证各数据包到达的顺序与数据包发出的顺序相同。所以,在文本聊天模块中,采用TCP协议来传输文本信息。5.1.1 文本聊天服务器工作原理开启服务器,文本聊天窗体加载成功后,将启动监听线程,服务器主要是负责监听局域网内的用户的连接请求。收到客户发起的连接请求后,若服务器处于空闲状态,弹出消息提示框,对请求进行处理,服务器可以选择接受或者拒绝客户端的连接。若同意连接,则返回给客户端同意信号,开启服务器的接收信息线程,并置消息发送事件为Ena
28、ble。客户端收到服务器返回的同意信号后,也开启接收信息线程,并置消息发送事件为Enable。通信双方就可以进行文字聊天了。若服务器端拒绝客户端的连接,则关闭tcpconnect,并关闭网络流,继续执行监听。客户端得知服务器端关闭tcpconnect并关闭网络流之后,则释放本次socket和网络流。若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的接入。文本聊天服务器工作流程如图6所示。连接服务器服务器同意连接?否是建立连接,允许发送消息事件,启动接受信息线程进行文字消息通信开始是客户端接收消息发送断开信号,关闭文本聊天否终止停止接收主ip关
29、闭端口是否 图6文本聊天服务器程序流程图5.1.2 文本聊天客户端工作原理客户端用来向服务器端发起一个连接,等待服务器的允许接入确认。若服务器端同意连接请求,接收到服务器的同意连接信号后,开启接收信息线程,并置消息发送事件为Enable,通信双方就可以进行文本聊天了。若已建立连接,当断开连接时,将向对方发送断开信号,然后将释放Socket和网络流,不影响到下一次连接的发起。5.1.3 P2P文本聊天1) 功能概述将文本聊天客户端和服务器模块,通过多线程技术,集成在一个聊天窗体里面,窗体加载时进行监听,有连接请求到达,则为服务器端;试图连接远程用户,则为客户端。它是建立在TcpListener以
30、及TcpClient这两个类基础上的。程序实现的原理也比较简单,但是用到了P2P技术非中心化的基本原则。简言之,用这个程序可以在网络中发送、接受消息,任何一台计算机既可以作为服务器端,又可以作为客户端。2) 集成文本聊天工作流程图集成主窗体创建后,加载监听线程。当有接入连接请求,同意或拒绝接入请求,若同意,则按照文本聊天服务器模块工作流程执行。当无接入请求,则判断是否有尝试连接远程服务端事件,若有,则按照文本聊天客户端模块工作流程执行,如图7所示。执行监听线程,监听端口是否 开始有接入连接请求是是否否连接服务器?是否是否成功建立开连接?连接双方进行消息通信是终止结束聊天否断开连接?发送断开信号
31、,关闭文本聊天是本地或远程服务端允许?建立连接,信息线程图7 P2P文本聊天程序流程图3) 集成主窗体设计主窗体是用来与用户交互用的,所以加载时间不能太长,响应速度应足够快,操作简单,设计人性化。所以,设计的时候,采用了一些通俗易懂的图片和按钮。当用户未输入文字而尝试发送时,弹出消息提示框,提示不能发送空信息,节省系统和网络资源。 表1 文本聊天窗体主要控件属性表控件属性值GroupBoxNamegroupbox1Text信息显示RichTextBoxNamerichTxtInfosReadonlyTRUERichTextBoxNamerichTxtSentReadonlyFALSEActiv
32、eKeyDownButtonNamesendText发送消息ButtonNameclearboxText清除屏幕ButtonNamesavelogText消息记录4) 具体实现1、定义相关变量。2、集成主窗体创建后,创建一个tcpListener的对象,端口为4000,IP为任意。创建监听线程wait,wait线程执行的是waitconn()方法,启动监听线程。调用getMyIP()方法用于获取本地IP地址,并在连接建立时传给对方。当wait线程监听到远程用户的接入连接请求,弹出消息提示框,用户可以选择同意或拒绝接入请求。若同意,则创建接收信息线程th,并启动th。若用户拒绝远程接入请求,则关
33、闭网络流nss,关闭tcps,并调用disconnect()重新初始化相关变量。3、接收信息时,尝试读取网络流,采用的是Unicode编码。读取到的消息如果不为断开连接信号,则在聊天记录框里面显示出来;若为断开信号,则执行disconnect()方法关闭当前连接。4、当无接入请求,则判断用户是否有尝试连接远程服务端事件。若有,创建TcpClient的对象tcpc,并尝试连接远程主机。5、连接建立后,用户单击“发送消息”按钮或者在输入文本框内按热键“Alt+S”或“Ctrl+Enter”,触发send_Click 事件。send_Click事件主要是将用户的输入通过Socket,采用网络流的形式
34、传输给远程用户,编码采用Unicode,同时在聊天记录框里面显示出来。6、断开连接或关闭窗体,需要将Socket、网络流以及接收信息线程th进行关闭,重置各按钮的可用状态。若是关闭窗体,还需将wait线程关闭。5.2 语音传输模块实现5.2.1 语音传输模块概述除了文本聊天以外,局域网内另外一个应用是语音传输。出于可靠性和效率考虑,本模块也采用TCP协议来进行用户之间文件的传输。5.2.2 文件传输接收端工作原理语音实时传输是语音聊天软件的核心技术。文中在分析语音实时传输原理的前提下,探讨了局域网语音实时传输的设备的初始化、内存分配、语音录制、播故和传输等具体方法,并以C+Builder60提
35、供的控件为基础,以API函数给为工具,给出了局域网实时语音聊天的具体实例,实现了局域网聊天。如图8所示。执行监听线程同意接收文件?否是发送同意接收信号,启动计时器,接收文件流,反馈状态终止接收发送端的语音文件传入请求 关闭语音文件流将远程文件存储至本地文件开始发送拒绝信号图8 语音传输接收端程序流程图5.2.3 语音传输发送端工作原理开启窗体后,发送端选择用户需要发送的文件,向接收端发起的文件传输请求,若接收端端同意接收,开启计时器,将本地文件通过网络发送给接收端,并在文件传输过程中对文件传输状态进行反馈,文件发送完毕,关闭计时器,关闭文件流,并在状态栏上显示出完毕状态。若接收端拒绝接受文件,
36、则取消本次文件发送,等待用户的下一次文件发送事件。文件传输发送端工作流程图如图9所示。添加待传送的信息接收端同意接收信息?否是启动计时器,发送文字流,反馈状态终止向接收端发送信息传输请求关闭计时器,关闭信息流将本地信息发送至接收端开始图9 文字传输发送端程序流程图5.2.4 P2P文字传输1) 功能概述将聊天内容发送端和接收端模块,通过多线程技术,集成在聊天窗体里面,窗体加载时进行监听,有文件传输请求到达,则为接收端,执行接收端工作流程;若试图发送信息到远程用户,则为发送端,执行发送端工作流程。这样就实现了P2P模式对等传输。2) P2P文字传输工作流程图负责接收信息的监听线程集成在聊天窗体内
37、,当聊天窗体加载时,将开启此线程。当有信息传入请求,用户可以同意或者拒绝接收,若同意接收,则按照信息传输接收端模块工作流程执行。若在聊天窗体生存周期内,无接入连接请求,则判断是否有用户尝试发送文件事件,若有,则按照信息传输发送端模块工作流程执行。P2P文字传输工作流程图如图10所示。否执行监听线程,监听端口是否启动计时器,接收信息流,显示内容接收状态信息终止收到信息开始是是否接收端允许?启动计时器,发送信息流,显示内容发送状态信息将本地文件发送至接收端发送文字?否是有文字传入请求允许接收?图10 P2P文字传输程序流程图3) 语音文件传输发送端窗体文件发送主要作用是发送本地文件至远程接收端,所
38、以功能尽可能简单化,方便用户操作,设计人性化。设计的时候,采用了一些简单按钮,布局也和常用的窗体类似。语音文件传输窗体主要控件属性见表2。表2 文件传输窗体主要控件属性控件属性值TextBoxNametxtFileButtonNamebtnBrowseText浏览.ButtonNamebtnStartText开始ButtonNamebtnCancelText取消LabelNamelblStatusOpenFileDialogNamedlgOpenFile4)具体实现1、定义相关变量。2、主窗体加载时,创建文件接收监听线程ReceiverWorker,并启动ReceiverWorker线程。Re
39、ceiverWorker线程执行的是ReceiverStart()方法。在ReceiverStart()中,创建一个TcpListener的实例tcpListener,其监听局域网内的任意IP地址在8088端口号上是否有传入的连接尝试。3、当ReceiverWorker线程监听到远程用户的文件传入请求,弹出消息提示框,用户可以选择同意或拒绝文件传入请求。若同意,用户选择文件保存路径后,向发起方发送同意接受信号,并开启计时器,文件接收完毕时关闭计时器。若用户拒绝文件传入,则向远程主机发送一个拒绝信号。最后,执行关闭BinaryReader,关闭Socket等操作。4、当用户打开语音文件发送窗体,
40、主窗体调用其带ip参数的构造方法,实参为当前与之建立连接的远程主机的ip地址,用于发送文件时建立socket连接使用。5、用户单击“语音”按钮,开启用于向远端发送文件的SenderWorker线程。SenderWorker线程执行SenderStart()方法。SenderStart()方法将创建一个TcpClient的实例tcpClient,尝试连接指定的ip地址的8088端口,将文件的信息发送给远程主机并等待远程主机的确认。若接收方同意接收文件,则启动计时器并打开BinaryWriter,将本地语音文件发送给远程主机,若远程主机拒绝接收,则关闭此次socket连接,等待下一次文件发送事件的
41、触发。5.3 用户管理模块实现5.3.1 用户管理模块概述不管是任何系统,都必然会有用户这个角色,因此用户管理是每一个应用中必不可少的部分。由于企业内部的信息越来越私密,企业只希望员工通过内部局域网进行沟通与交流,所以在本局域网聊天工具中,设计一个简单用户管理模块,对接入服务器的用户进行管理,能在一定程度上解决安全性问题。本模块实现采用了xml技术,二次开发时,通过一定的修改,能够很好的移植到数据库上。5.3.2 用户数据模型本模块实现一个简单的用户管理,所管理的目标是局域网内客户端用户。模块中只涉及到用户一个模型,涉及到的属性项目有 用户ID、用户名(姓名)、密码、注册时间等,其E-R图如图
42、5-9所示。5.3.3 XML文档结构设计XML分为文件序言(Prolog)和文件主体两个大的部分。在此文件中的第一行即是文件序言。它主要是告诉XML 解析器如何工作。其中,version 是标明此 XML 文件所用的标准的版本号1.0,encoding 指明了此XML 文件中所使用的字符类型为utf-8。文件的其余部分都是属于文件主体,userInfos.xml文件的内容信息存放在此。文件主体是由开始的和结束的控制标记组成,这个称XML文件的“根元素”;是作为直属于根元素下的“子元素”;在下又有、这些子元素。id是元素中的一个“属性”,“1001”、“1002”等则是“属性值”。5.3.4
43、用户信息的保存通过服务器监听,接收到客户端的注册请求后,获取注册用户的信息,判断用户是否为第一个注册用户,若是,则创建userInfos.xml文档,进而创建userInfoList根节点,在userInfoList内创建用户user节点,设置id属性,然后在user节点下创建用户名、密码、创建时间等节点,将相应的信息保存到各节点中。若userInfos.xml已存在,遍历userInfoList,查找该注册用户名在userInfos.xml中是否已存在。若用户名不存在,则在userInfoList内创建新的user节点,然后在user节点下创建用户名、密码、创建时间等,将用户信息添加进use
44、rInfos.xml文档中。若用户名已被注册,则通过服务器向客户端返回用户名已经被注册的提示信息。保存数据的流程图如图11所示。创建一个用户?是获取最后一个用户的ID号并将ID加1作为该user的ID属性值否 创建XML文档创建根节点向user节点中添加时间节点在根节点内添加user节点设置user的ID属性值用户是否已存在?否是 返回用户已存在在根节userInfosList内添加user节点开始结束 图11 保存数据的程序流程图5.3.5 用户数据的遍历在新用户注册或者已注册用户登录时,需要在userInfos.xml文档中查找用户名是否存在,这个就涉及到xml文件的遍历。遍历xml文件的
45、主要流程是,先进入根节点,开始对节点进行遍历。若节点不存在,则返回不存在信息,结束遍历;否则进入节点,对其子节点进行对比。若匹配成功,则返回用户名存在信息;若不匹配,则继续遍历下一个节点。工作流程图如图12所示。返回不存在进入user节点用户名匹配?Y 返回存在进入根节点第i个user结点是否存在否是否是i=1i=i+1开始结束图12 用户数据的遍历程序流程图6. 系统测试6.1 系统测试概述测试的目的是为了发现功能是否达到,或者是否有更多的缺陷!这里的缺陷是泛称的,它可以指功能的错误,也可以指性能低下,易用性差等。测试总是先假设程序中存在缺陷,再通过执行程序来发现并最终改正缺陷。理解测试的目的是个很重要的意识问题。如果说测试的目的是为了说明程序中没有缺陷,那么测试人员就会向这个目标靠拢,因而下意识地选用一些不易暴露错误的测试示例。这样的测试是虚假的。测试只能证明缺陷存在,而不能证明缺陷不存在。这个真理告诉我们,对于一个复杂的系统而言,无论采取什么样的测试手段都不能证明缺陷已经不复存在。“彻底地测试”只是一种理想。在实践中,测试要考虑时间、费用等限制,不允许无休止地测试。测试有助于提高软件的质量,但是提高软件的质量不能依赖于测试。因为做为一个本科毕业设计,本系统并不会真正发布到广大的用户群中