毕业设计(论文)点对点视频即时通讯系统.doc
毕 业 设 计(论文)题 目:点对点视频即时通讯系统学 生: 指导老师: 专 业: 计算机应用班 级: 计算机01学 号: 385/10/2005目录摘要3正文5第一章 前言51.1设计背景:51.2 对现有系统的分析比较:5网际通讯的和网内通讯的:5社区型的通讯和特定用途通讯6第二章:论文主体72.1:总体设计7服务器端:7客户端7客户端与服务器端的通讯方式72.2系统详细设计82.2.1模块的划分82.2.2 Xml通信协议的设计:82.2.3 服务器的详细设计132.2.3.1 总体方案132.2.4.2 实现:14A服务器的关键类。14B :实现一台电脑只运行一个服务器14C 服务器解析自定义xml协议的实现15D 数据库的设计及实现 :17第一个方案:SQL Server 2000 作为数据库管理系统实现数据的存储管理。17第二个方案:用xml作为数据库。18E 安全存储用户密码信息的设计及实现20不可逆转加密技术的实现202.2.4:客户端的详细设计232.2.4.1 总体方案232.2.5.2 详细设计23A关键的类23B界面的设计24C视频语音的实现25D自动升级功能的实现262.3系统测试27第三章 结语28致谢29参考文献29点对点视频即时通讯系统毕业设计论文2004-4-21摘要本系统就是在互联网技术不断推进改革背景下,使用了TCPIP协议,应用的.net强大的技术实现的一个点对点的通讯系统。虽然本系统完成之前,ipv6还没有真正的推广。但是,本系统解决了在ipv4网络里面的点对点通讯的问题,利用UDP打洞技术,突破NAT。可以模拟点对点的通讯。用一个有固定IP的服务器(也就是本服务器)作为中央索引服务器,用来记录各个终端的地址在信息和用户信息。提供给各个连接到本服务器的客户端索取他感兴趣的终端,然后终端根据服务器返回的数据,直接跟对方(客户端)连接,直接交换数据,不要经过服务器中转。这样的话,不仅减轻了服务器的负担,而且可以实现匿名通讯。同时,我们为了让用户更加方便交流,我们实现点对点的视频和语音聊天,视频和语音的网络流数据也是基于本系统架构的点对点的平台传输的。关键词:p2p,点对点通讯,xml,c#,视频,语音。SummaryP2p instant communication system of opportunity TCP/UDPUnder the circumstances that Internet technology is advancing the background of reforming constantly .This system is a system that uses TCP/IP Protocol and system of strong net technology to actualize a point-to-point communication .Though before this system was finished, ipv6 did not have real popularization,This system has solved the problem of the point-to-point news report inside ipv4 network, utilize UDP punch technology , break through NAT,Can imitate the point-to-point communication.Use a fixed IP server which as the central index server mark down each terminal station is in information and user's information.Offer each customer end connected to a server to ask for the terminal station that he is interested in, then terminal the foundation server the data returning, join with the other side (customer end ) directly, exchange the data directly, don't change trains through the server.If in this way, not only has lightened the burden of the server, but also can realize the anonymous communication.Meanwhile, in order to make users more convenient, we actualize the point-to-point video and voice-enabled chat, the data have flowed in the networks of the video and pronunciations transmitted is basis on the point-to-point platform system.Keyword: P2p, point-to-point communication, xml, C#, the video, the pronunciation.正文第一章 前言1.1设计背景:在网络技术的不断升级不断优化的背景下,互联网的技术的应用也随着更新换代。从以前的简单联机。到e-mail,ftp,万维网的广泛应用都给人类创造无限的价值。如今在java和.net技术的广泛应用的背景下,网络的应用也随着升级,由以前的面向简单的应用逐渐变成面向服务,由中心服务型的应用,到索引服务器甚至到没有服务器。网络的应用慢慢变成跟互联网设计者所描述的真正的网络。随着ipv6技术的推广。网络会实现真正的互联。每一个终端都可以实现直接互联。即每次技术的创新,都会带来好多新的应用,同时不适应时代潮流的旧技术会被新的技术取代。自从点对点通讯的概念出现之后,引起业界对她的广泛关注。因为此技术人们预言将会改变互联的格局,会冲击现有的技术,会给好多的公司带来机遇,也会给好多公司带来挑战。P2P是一种新近兴起的网络模型。与传统的C/S模型比较,它在网络资源利用率、消除服务器瓶颈等多方面有明显的优势。因此,P2P蕴涵着巨大的商业和技术潜在价值。点对点的技术应用起来非常之广泛,比如,在中国,上过网的会电脑的人都知道QQ这个东西,甚至,有些人不会用电脑,但是会玩QQ。QQ只是点对点应用的一个方面,即时通讯。即时通讯的系统还有好多,比如网易的泡泡,tom的skype,阿里巴巴的陶宝旺旺等。点对点技术的应用还有文件共享。虽然文件共享的应用带来好多的非议(因为存在知识版权的问题),但是确实现了真正的数据共享,给好多用户带来方便,同时,也给一些企业节约了成本。网络计算也是一个重要的应用,网络计算的典型的例子就是SETIhome 。它是一个软件,用来计算分析来自澳大利亚Parkes天文台的数据,搜索外来文明的数据。它的特点就是,使用了分布在世界各国的计算机的空闲的计算资源。据统计,这个系统的整体的计算能力远远超越世界上任何一台超级计算机。可见网络计算的应用前景广阔。1.2 对现有系统的分析比较:市面上聊天通讯工具好多,比如okbuddy网络视频通讯软件,iSpQ Videochat 7.2,Hello 1.0 Build 549,和朋友即时通,ABC Amber ICQ Converter 1.04等。著名的有腾讯OICQ,微软msn,网易popo,朗玛UC等。总体上可以做以下分类。网际通讯的和网内通讯的:能实现在不同网络的通讯的就是网际的通讯系统,只能局限在同一个网络,不能和外网通讯的,就是网内的通讯。当然,用户一般是根据自己多集体需要来选择一个工具。网际的通讯和网内通讯的实现有好多的差别。比如在实现方式上,网际的通讯,要使用路由协议,甚至要穿透不同的防火墙。程序编写难度大,算法多,成本高。但是,因为,他能够跟网络上广泛的终端通讯,所以应用的范围管,用户数量也多,效益也大。以此相反,网内通讯只能在同一个网内通讯,多数是应用了以太网协议,没有防火墙的问题,没有路由的问题,而且网路速度高。所以,它一般应用于一个单位自己的网络里面,而且,是有其特定的用途 ,比如,单位里面专有的通讯,单位的视频会议,单位里的实时监控等。网内的通讯工具的编程难度稍微小一点,但是,必须要根据不同的用途作不同的设计,往往不同单位需要到通讯工具有着千差万别。社区型的通讯和特定用途通讯:社区型的通讯工具是整个通讯系统的所有的用户共享同一个社区资源,也就是,整个系统在宇宙中就只有一个,而且,所有的授权资源都为所有用户所共享使用,为了区分各个用户的身份,系统往往采用帐号来区分,用密码来识别帐号的使用者是否有权使用。在这种情况下,不同的社区型的网络聊天系统都会构成竞争,一个网络通讯系统的用户数量的增加,一般会导致其他的网络聊天系统的社区用户数量的减少。而且,当一个社区型的聊天系统一旦成功地拥有一定数量的使用者,就可以垄断用户资源,排斥其他的同质的通讯系统。因为,这种系统的最重要的资源就是用户数量。社区型的网络通讯工具典型的有腾讯OICQ ,TOM skype,icq,uc,popo,msn。特定用途的通讯系统实针对不同用途来设计的。比如美国在伊战期间就设计了一个即时聊天工具,专门用于让战场上的战士跟远在美国的亲人直接通讯。有的通讯系统是应用于秘密通讯的,这种通讯系统的所有的信息不会被其他人知道。本拉登团伙就使用了类似这种工具,进行秘密的通讯。虽然这种工具的这种用途有不好的地方(比如,一些高级官员之间进行不法的交易,而又不想让外界所知道),但是,这种工具依然有不少用户使用。第二章:论文主体2.1:总体设计服务器端:本系统目的是架构一个集中式的点对点通讯系统。所以,系统要分为服务器端和客户端。服务器端作为系统服务的核心,为客户段之间的联系起到桥梁和后备的作用:一来要为各个客户端提供注册认证的功能,确保客户端的合法性。二来,要记录所有的客户端的对外的IP地址和端口号(因为,我们用的是UDP的打洞技术来实现点对点的,所以必须由服务器记录客户端的地址,而不是由客户端主动告诉,详细看本文的关于UPD打洞技术的详细说明)。三来,要为各个客户端提供中转服务,虽然我们目的要打造一个不需要服务器作中转的通讯系统,但是,还是要为出现意外的情况下,为客户端之间的通讯提供中转服务。服务器的开发语言是C#,因为它开发比较快速和安全,而且使用的C#就有强大的.NET平台支持。服务器使用的数据库管理系统是SQL Server 2000,同时,我们考虑到试用和测试的时候,为了方便部署,我们的测试版本是使用了xml技术取代了SQL Server 2000,作为系统的数据库(详情看下面关于数据库的详细设计的说明)。服务器端要用数字摘要技术来安全存储用户的密码信息,以防密码数据被盗;(详细请看下文关于安全保存用户密码的详细说明);客户端:客户端直接给用户使用的,所以,界面,使用的方便,要一定的要求,要让用户有耳目一新的感觉,要让一般的人一看到界面就能猜到怎么使用。还有一套是本人在开发服务器的时候,为了方便给服务器作测试而同时做出来的,用的是C#语言开发,它的点就是只要机器安装了.NET运行时,都可以运行,所以,不仅仅是pc机,甚至是智能设备,比如掌上电脑,支持.NET的手机也可以运行。客户端如果只是有文本通讯的功能就过于简单了,所以,我们努力地实现视频和语音的功能,同时希望使用UDP通信的优势,要实现多人同时视频,就像在线会议。当然由于技术的复杂,不是能在短时间内实现的,由于毕业设计的时间太短不够。目前只是做到了简单的视频语音聊天。其他功能,要在以后添加上去。客户端与服务器端的通讯方式:从本质上说,由于客户端与服务器端的通讯是在网络上传递的UDP 和TCP数据包,所以,客户端和服务器的通信就是数据流。既然是数据流,我们必须为了实现高效便捷的通讯选择一种方式(协议)。我们经过多次的思考,参考了国内外的文献,发现了xml强大的功能,于是,决定用xml,同时,在xml的基础上设计自己的通讯协议,专门用于我们的系统之间的通讯。协议的详细设计,看本文关于通信协议的详细说明。2.2系统详细设计2.2.1模块的划分:从最高的层面上看,本系统分为4个模块:服务器运行模块,客户端运行模块,公共运行库,多媒体库。服务器运行模块就是指服务器的程序,它的运行的逻辑。客户端运行模块指的是客户端的程序,运行逻辑。公共运行库,是各个模块需要的一些基本的功能模块的集合,也就是说,里面有服务器模块,客户端模块,多媒体模块都需要使用到的一些类和函数。比如网络函数,数据包的发送函数,数据包类的基类及其各个子类等。多媒体库,就是提供多媒体功能的类库,本系统的视频通讯和语音通讯的类和函数就是这个库提供的。2.2.2 Xml通信协议的设计:本系统的客户端和服务器端之间的通讯是网络的通讯,所以两者交换的信息就是网络上流动的数据。当然从程序的编写的角度出发,程序员(我们)往往要把这些数据抽象成数据流。二者通过收发数据流,实现通讯。二者通讯的数据格式直接影响到通讯的效率,所以,一个好的通讯协议的设计直接影响到系统的性能。协议的要求如下:1 要求数据不能有过多的冗余。冗余过多会占用过多的网络资源,造成网络效率低下,从而降低系统的性能。2 数据要确保安全性。即数据可以实现秘密传输,不会被人家监听传输的内容。也不会被人家篡改。3 要求通讯协议不会给系统带来隐患。因为外望是一个不安全的领域,什么样的隐患都有。所以协议的设计要尽可能的避免这些隐患。比如,如果人家知道本系统的通讯收发的各种数据的格式和方法。有可能用非法的程序,或非法的途径闯入本系统,造成本系统不能正常运行。4 要求协议要尽可能简单。不能因为协议的复杂,从而给程序员(我们)带来庞大的工作量,从而增加的成本。协议要能够容易的实现。5 要求协议要有扩充性。因为一个软件系统,随着时间的推移,要跟着更新和升级。而升级更新的过程,要有向下的兼容性。也就是说,不能因为出现新的版本,另旧版本不能用。而向下的兼容性要求通信协议也要向下兼容。所以,协议要有可扩充性。为了满足以上要求。我们考虑了好多种通讯协议。从中率选出最适合我们的协议。请看下文。本系统的通信协议,基于文本,也基于xml。客户端与客户端,客户端与服务器端的所有的通讯其实就是收发特定的xml。每收发一个信息,就是收发一个xml元素。本协议的xml元素总体分为两大类:<ts></ts>和<message><message>无论是<ts></ts>还是<message></message>有四个基本属性id,type,from,ro。分别表示消息的标号,消息的类型,消息的发送者,消息的接受者。如果要展开本协议的说明,可能要占用好大的篇幅,所以,我在此不展开,只举一些重要的例子来说明一下我们使用的通信协议。下面是我们的协议的例子。/1登陆:<ts id="1" type="set"><authquery xmlns="xq:ts:auth"><uid>Admin</uid><password>123456</password></authquery></ts>/注释:type要等于"set" 表示设置。/ <authquery></authquery>表示认证的数据/<uid></uid>表示认证的数据中的账号/<password></password>表示认证数据中的密码/当服务器返回的下面数据表示登陆成功<ts id="1" from="rootserver" to="Admin" type="result"><authquery xmlns="xq:ts:auth"><uid>Admin</uid></authquery></ts>/只要看type="result"就确定是知道成功。当然还要看有没有<authquery></authquery>。因为<authquery></authquery>表示的是认证。/如果type="error" .如下:<ts id="1" from="rootserver" to="Admin3" type="error"><authquery xmlns="xq:ts:auth"><uid>Admin3</uid></authquery></ts>/则表示失败,可能用户名错,密码错,或者已经在其它地方登陆了。/2。发送UDP包。让服务器记录自己的端口<ts form="用户名" type="set"><addressquery xmlns = "xq:ts:address"><port>0</port></addressquery></ts>/这个数据包服务器不会返回信息。但是,实际上会返回用户列表,/因为你发的这个UDP数据包,使得服务器的在线用户的数据更新了。/3。关于用户列表的说明<ts id="2" from="rootserver" to="caiqisheng" type="result"><rosterquery xmlns="xq:ts:roster"><item uid="caiqisheng" ip="127.0.0.1" port="2888" /><item uid="wenhaibo" ip="127.0.0.1" port="2886" /><item uid="Admin" ip="127.0.0.1" port="2878" />.</rosterquery></ts>/这个xml是由服务器主动发送给各个客户端的( 当服务器的列表更新的时候),/说明:/roster英文的意思是名单。/type="result"/<rosterquery></rosterquery>表示列表数据./<item></item>表示列表数据中的一个单元。/<item></item>中,uid表示账号,ip表示ip地址,port表示他的UDP端口。/4.关于注册一个新账号要注册,线连接,不须登陆(这个傻b都懂,但是我还是说一下)发送的数据如下<ts><registerquery xmlns="xq:ts:register"><uid>你想注册的账号</uid><password>密码</password></registerquery></ts>/说明:/<registerquery></registerquery>表示注册的数据/<uid></uid>表示注册的账号/<password></password>当然就是注册的密码。关于注册的服务器的回应说明:/如果收到服务器返回如下数据表示成功<ts id="1" from="rootserver" type="result"><registerquery xmlns="xq:ts:register"><uid>你刚想注册账号</uid></registerquery></ts>/关键是type="result"。如果收到如下数据表示失败,一般是由于已经有人使用了这个账号。<ts id="1" from="rootserver" type="error"><registerquery xmlns="xq:ts:register"><uid>你想注册的账号</uid></registerquery></ts>/关键看type="error"/5.关于转发由于目前xml数据包就只有2种一就是<ts></ts>,上面的都是,<ts></ts>类型的,<ts></ts>类型表示客户端与服务器之间的数据。第2种就是<message></message>类型的,<message></message>类型表示客户端与客户端的消息的交换。无论是<ts></ts>还是<message></message>都有id,to,from,type这四个属性。服务器只要收到type="transfer"的xml。不管是<message></message>还是<ts></ts>.都会转发。至于如何转发。看下面说明。/form属性表示发送者,to属性表示想接收者。服务器就是根据这两个属性判断如何转发。/比如:<message id="12" from="wenhaibo" to ="caiqisheng" type="tranfer">/<body>hello ! this packet is tranfer packet.</body>/</message>/服务器将把数据原封不动地发给caiqisheng这个在线用户。/也就是说,用户将收到 如下数据:/<message id="12" from="wenhaibo" to ="caiqisheng" type="tranfer">/<body>hello ! this packet is tranfer packet.</body>/</message>/2.2.3 服务器的详细设计:2.2.3.1 总体方案:1.一台电脑只能运行一个服务器实例。这是为了避免了服务器资源的冲突。2服务器使用了三层模式架构:数据库持久层,应用逻辑层,通讯接口层。 数据库持久层用来存储服务器所有的数据,包括用户数据,配置数据,运行记录等。应用逻辑层,用来实现服务器运行的逻辑,收到什么样的数据应该做出什么样的反应,什么时候做什么,都是由这个层实现。网络接口层,用来实现网络数据的收发和解析,数据的加密和解密。当然,这三个层里面会根据各自的情况又分几个层。这里就不展开说了。层与层之间的耦合性比较低,所以,他们基本是互相独立的,一个模块的改变,对其它的模块的影响做到尽量的小。这样方便以后的升级和更新。自定义协议(xml)数据库持久层应用逻辑层网络接口层客户端程序3服务器以会话的方式来与客户端建立通信。客户端与服务器端一旦连接,服务器就会建立一个会话,以一个对立的会话来跟客户端沟通。所以有多少个客户端连接到服务器,服务器就有多少个会话。这样可以方便的管理每个客户端的状态和请求。但是也有缺点就是有比较大的开销,包括内存开销,CPU开销,所以会影响性能。于是,我们在以会话来管理客户端的原则的基础上适当的增加其它的方式来灵活处理其它的客户端的请求。比如客户端的地址的登记,服务使用了一个独立的UDP端口来监听所有的客户端的请求(当然,请求要符合我们的xml协议)。4要求服务器能实现在线管理。包括能够以管理员的身份修改数据库的记录,从而修改用户数据以及服务器的配置。服务器能够以报表的方式出用户的数据。也可以实时察看服务器的现状,比如有多少人联机。5服务器的运行能够根据配置文件的配置来运行。这样的好处是,即使遇到新的环境,也不用为了这个环境重新编译一次程序,只要手动修改配置文件,就能使服务器以一定的方式来运行。2.2.4.2 实现:A服务器的关键类。B :实现一台电脑只运行一个服务器。在主函数控制实例的数量,如果是第一次启动,就正常启动。如果是第2个实例启动,就提示,并且限制地2个实例的启动。主要是使用了互斥类:Mutex。public static void Main()Mutex mutex = new Mutex(false, "ThisShouldOnlyRunOnce");/判断互斥体是否使用中。bool Running = !mutex.WaitOne(0, false);if (! Running)Application.Run(new MainBoard();elseMessageBox.Show("服务器进程已经启动!n不要重复启动!");C 服务器解析自定义xml协议的实现。服务器端解析xml,我们使用了目前只有.NET平台才有的技术,就是元数据。由于我们把收有的协议的数据都抽象为数据包,所以,所有的数据都继承语我们的数据包的基类Packet。而Packet类和子类都用另外一个特性类了描述它要如何转化为XML数据。那个特性类编译之后,就会成为Packet类的元数据了。然后,我们使用的xmlSerlizer类来序列化和反序列化这个类,一旦packet类被序列化,得到的结果就是我们想要的XML数据。然后就让这个xml数据直接发送出去就行了。不用再做其它麻烦的转换工作。看以下表示Packet类的关键代码:public class Packet/:IPacketprivate string _ID,_From,_To,_type;private StanzaError _Error;public Packet()System.Xml.Serialization.XmlAttribute("id")public string IDgetreturn this._ID;setthis._ID=value;System.Xml.Serialization.XmlAttribute("from")public string Fromgetreturn this._From;setthis._From=value;System.Xml.Serialization.XmlAttribute("to")public string Togetreturn this._To;setthis._To=value;System.Xml.Serialization.XmlAttribute("type")public string Typegetreturn this._type;setthis._type=value;System.Xml.Serialization.XmlElement("error")public StanzaError Errorgetreturn this._Error;setthis._Error=value;序列化协助类: public class XQSerizlizerprivate static XQSerizlizer _XQSerizlizer=new XQSerizlizer();SerizlizerHellperCollection _SerizlizerHellpers;internal SerizlizerHellperCollection SerizlizerHellpersgetreturn this._SerizlizerHellpers;private XQSerizlizer().public static XQSerizlizer Instancegetreturn _XQSerizlizer;public Packet Deserialize(XmlElement xe)SerizlizerHellper helper=this.SerizlizerHellpers.GetHelper(xe);if(helper=null)throw new System.Exception();StringReader sr=new StringReader(xe.OuterXml);XmlSerializer xs=new XmlSerializer(helper.Target,helper.GetOverrides(true);xs.UnknownElement+=new XmlElementEventHandler(helper.OnUnknownElement);object o=xs.Deserialize(sr);sr.Close();return (Packet)o;public string Serialize(Packet p)Debug.Assert(p!=null);SerizlizerHellper helper=this.SerizlizerHellpers.GetHelper(p);MemoryStream ms=new MemoryStream();XmlSerializer xs=new XmlSerializer(helper.Target,helper.GetOverrides(true)ms.Position=0;StreamReader sr=new StreamReader(ms);string s=sr.ReadToEnd();sr.Close();ms.Close();return s;D 数据库的设计及实现 :本系统在服务器端要记录大量的用户的数据,比如,涉及用户身份的登录帐号和密码记录。所有用户的详细资料等。庞大且重要的数据得用高效的安全的方法来管理。在此我们选用了两个方案。第一个方案:SQL Server 2000 作为数据库管理系统实现数据的存储管理。一个存在着庞大数据的系统,必须要有专业的数据库管理系统来管理。这是因为,庞大的重要的数据,一来要求性能高,在数据存取的时候,要保证速度。二来,要保证安全,软件损坏了,可以修复或者重装,不会给用户带来非常严重的后果,但是,如果是数据的丢失或损坏,往往会给用户带来灾难性的损失。三来,数据不能被“黑”,所谓的“黑”包括被居心叵测的人进行非法的盗取,篡改,删除等。所以在数据库系统的选择上,我们必须谨慎。市面上有不少功能强大,高效安全的数据库管理系统:DB2,orlcle,infomix,sql server 2000 等。下面对各种数据库管理系统进行分析比较。Orlcle是甲骨文公司拳头产品,这个数据库管理系统被非常多的巨大的公司,集团选用,因为他无论是性能上,兼容性,安全性上,可管理性等方面都无与伦比。是大型系统的首选。但是价格比较贵,没有一定实力的公司难以承受如此昂贵的价钱。DB2是IBM公司开发的数据库管理系统。一听是蓝色巨人IBM的产品,当然就不用怀疑它的质量。选用了DB2就是站在巨人的肩膀上了。DB2支持Windows平台、AIX系统、HP-U