资源描述
计算机网络课程设计题目:基于WinSock的即时通信软件功能原理模拟专业班级:_ 学 号:_姓 名:_成 绩:_目录1 摘要32相关技术32.1主流即时通信模型32.2主流即时通信协议62.3 W i nSock技术82.4 C#中的网络编程93 系统总体设计103.1 功能需求103.2系统总体模块设计113.3系统中主要用到的类124 系统分块设计134.1服务器端设计134.2 客户端设计174.3通讯协议模块215系统具体实现225.1关键模块的具体实现225.2客户端运行效果286 课程小结337 参考资料341 摘要随着网络通信技术和计算机技术的进一步发展,即时通信(Instant Messaging)正在成为网络在线活动中不可缺少的业务,对它的研究是互联网应用中一个热点课题。本课题在现有的网络通信技术的基础上设计并实现了一个简单的即时通信系统的模拟。该系统工作机制模仿即时通信软件的基本功能,登陆,上线,传递信息等等。首先,分析了当今流行的各种即时通信软件,确定了基本即时通信系统的功能,抽象出了整体的软件模型。对即时通信系统中采用的关键技术进行了简化,设计了一个整合P2P(PeertoPeer,对等连接或对等网络)和CS(ClientServer,客户服务器)模式、支持多协议转换通信协议和实名制身份认证的即时通信系统。然后,论文对即时通信系统的服务器端和客户端的主要组成模块进行了详细的剖析,论述了各个模块详细的设计和实现方式,分别阐述了每个模块的主要功能,并给出了模块流程图。最后,论文对所设计的即时通信系统服务器端进行了运行,并截取了软件运行图片。结果表明系统实现了设计的要求,具有登陆、上线、信息传递的功能。2相关技术2.1主流即时通信模型目前主流的即时通信模型主要有CS模型与P2P模型,这两种模型各有千秋,所以许多的软件机构和计算公司把P2P和CS一样的看重,经常把两者结合在一起使用。CS模型CS(ClientServer,客户服务器)模型,简称CS架构,其模型如图所示。该模型可以合理利用两端硬件环境优势,将任务合理分配到客户端6rill务器,降低系统通信开销。在这种结构中,服务器处于一个中心地位。服务器是一个拥有强大处理能力和很大带宽的高性能计算机,数据和信息都保存在服务器上。服务器始终处于工作状态,一般同时为多个客户提供服务,它被动地接受客户连接,根据客户的请求提供相应的服务。这就造成了服务器设计的复杂性。特别是像即时通信服务器这类具有社区性的服务器,它只有为群体提供服务才有意义。即时通信服务器是数据中心,它是客户活动的中介,需要同时应对众多客户的请求。CS通信主要特点是客户端之间的通信都要通过服务器的转发,会造成服务太集中,在CS模型中,当网络增大时(即越来越多的客户加入),服务器的压力就越大。当增加一个客户,服务器的性能就会弱化,甚至会而使服务器失效而导致整个网络的瘫痪等,其优点是便于集中管理,象这种结构一般用在用户数量少的局域网内。P2P模型P2P(Peerto Peer,对等连接或对等网络)模型,是指网络中的物理节点在逻辑上以相同的地位进行通信的模型,而不是处理能力的对等。相对于传统的CS模型,其弱化了服务器的概念,系统中的各个节点不再区分服务器和客户端的角色关系,每个节点既可请求服务,也可提供服务,节点之间可以直接交换资源和服务而不必通过服务器。P2P的最大特点就是用户之间直接共享资源,使得PC不再是被动的客户端,而成为具有服务器和客户端双重特征的设备,P2P模型如图所示。基于P2P的模型与客户服务器模型相比,它最大的实力是降低了对服务器的依赖及其分散控制(相对于服务器的集中控制),用户不需要服务器就能直接通信,模型中的节点是动态的,可以随时加入或退出,而且随着用户的加入,不仅服务的需求增加了,整体资源和服务能力也在同步地扩充。信息在对等节点间直接交换,高速及时,降低中转成本。采用P2P模型可以有效地利用网络中散布的大量普通点,将任务或存储资料分布到所有结点上。利用其中闲置的计算能力或存储空间,达到高性能计算和海量存储的目的。同时因为资源分布在多个节点,部分结点或网络遭到破坏对其它部分的影响很小,也更好地实现了整个网络的负载均衡。P2P已经在共享资源和服务器的价值方面动摇了网络的边界。当然P2P也有许多不足之处。首先P2P缺乏管理机制,管理者再也无法对其用户进行必要的管理,不象在CS模式中只需要在中心点进行管理, 所以P2P模型的网络资源往往并不可靠。其次P2P网络中数据的安全性难以保证。另外还存在大多数用户之间传送大量大体积文件而存在吞噬网络带宽问题、版权问题。还有就是目前还没有制定出一致的P2P标准,这对P2P技术进一步发展也是一个障碍。我们常用的QQ、MSNMessenger,ICQ等即时通信软件都是P2P应用的实例,它们允许用户互相交换信息、交换文件。2.2主流即时通信协议传输控制协议TCP(Transmission Control Protocal)和用户数据报协议UDP(User Datagram Protoc01)是TCPIP协议族的两个主要的传输协议,这两个协议都使用IP作为网络层协议。在网络通信传输机制中,TCP是属于“面向连接,可靠传输”的类型,面向连接的传输意味着在进行通信以前,需要在两个系统之问建立逻辑连接,在每个数据传输的过程中都需要进行应答以保证数据包的完整。这种方法需要的网络丌销较大,但却提供一种可靠的传输层服务。UDP是属于“面向无连接,不可靠传输”的类型,该协议只负责接收和传送上层协议传递的消息,UDP本身不做任何检测、修改与应答,上层协议需要自己处理这些事务。他们实际上最大的区别在于为应用协议提供不同的服务。TCP协议TCP是一个面向连接的、可靠的传输层协议,协议提供的服务包括面向连接、双向、有序且无重复的数据流传送,有效的流量控制、全双工操作和多路复用。它主要的功能是提供大量数据的传输并确保其传输无误,并提供错误检查、数据复原以及数据超时重传等机制,适用于传输可靠性要求比较高的数据传输。TCP连接的建立采用了三次握手机制,这一机制保证校验了数据,保证了他的可靠性。同时,TCP协议采用面向字节的方式,将报文段的数据部份进行编号,每一个字节对应一个序号,虽然耗时、占资源,但是可以确保消息传输的可靠与准确的传递。另外,在传输数据包期间,TCP会根据链路中数据流量的大小来调节传送的速率,传输时如果发现有丢包,会有严格的重传机制,从而以保证数据包可靠的传输。使用数据流传送,在一个TCP连接中,源节点发送一连串字节给节目的节点即提供字节流服务,并以序列号标识的这些非结构化字节流。这种服务给应用带来了便利,因为它们不必在将数据传给TCP之前对数据进行分块。TCP将它们分组后交给m发送。通过面向连接、端到端和可靠的数据包发送,TCP提供互联网络数据报传输的可靠性。TCP通过使用转发确认号保证数据按顺序接收,由可靠性机制处理丢失、延迟、重复或读错的数据包,由超时机制检测丢失的数据包并请求重新传输。TCP提供有效的流量控制,这表示当向源节点发送确认时,接收TCP进程会指示它可以接收而不会引起内部缓冲区溢出的级高序列号;全双工的操作表示TCP进程可以同时进行发送和接收。而多路复表示大量高层对话可以同时通过一个单独的连接发送出去。即时通信系统的消息传输一般是建立在TCP协议基础之上的,客户与服务器之间都是通过TCP传输数据。服务器端口一般固定。去掉截获的TCP包头信息,对数据部分进行分析可以找出协议的发送和接收数据的基本格式,但是TCP面向连接的,在国内目前IP地址短缺,很多采用通过局域网连入Intemet的网络状况下,TCP的对等连接显然不能满足所有的要求,而且目前由于黑客软件和病毒的泛滥,大部分上网的个人计算机都配置了防火墙在很大程度上阻止了许多的入站请求。所以数据传输大都是先尝试直接连接,如果连接不通的话采用通过服务器中转的方式。目前基于TCP的各种应用有Telnet、H1vrP、FTP和SMTP等,这些应用通常都是用户进程。UDP协议用户数据报协议UDP是建立在网际协议之上的,提供面向无连接、不可靠(不保证数据的正确传送和重复出现)的数据报传输服务的传输层协议。UDP传输不像TCP传输一样需要预先建立一条连接;UDP把数据发送出去但不进行差错控制和流量控制,报文可能丢失、重复或者失序,而发送方是得不到通知的,数据也不会被重传。因此,UDP提供的是一种不可靠的应用数据传输服务。它不需要通过一些握手协议确保连接的可靠性,发送方直接把数据广播到网络上,任何欲接受者都可接收到数据。在UDP的广播消息中,数据的目标不是指定地址唯一的一台机器,而是特殊的广播地址,数据可发送到同一子网络上的所有机器上。UDP使用底层网络的广播和组播设施交互报文时,必须制定报文边界。其优点在于:1、使用UDP时,每个数据中都给出了完整的地址信息,发送数据之前不需要建立发送方与接收方的连接,因此减少了开销和发送数据之前的时延;2、不使用拥塞控制,也不保证可靠传输,因此主机不需要维持具有许多参数的、复杂的连接状态表;3、用户数据报只有8个字节的首部开销,比TCP的20个字节的首部要短,因此它的网络开销一般要小于TCP;4、UDP不进行流量控制,没有序列与确认、没有超时重发等机制,因此它处理和传输数据的速度快;作为一种面向无连接的传输协议,基于UDP的应用程序在高可靠性、低延迟的网络中运行得很好,但是在通信子网的服务质量相对低下的Intemet上,它可能就无法正常运行了,因为数据报的丢失过于频繁。原因就在于UDP的不可靠性,而这些应用程序自身可能又没有提供可靠性保障。因此,基于UDP的应用程序如果想在可靠性低下的网络中运行的话,必须自己提供可靠性保障,例如丢失数据报的重传、失序数据报的组合等。UDP与TCP之间的差别主要在于可靠性方面。但也不是说,因为UDP是一种不可靠的传输协议而毫无用处。在一个良好的网络环境下,使用UDP传输数据还是相当可靠的,而且效率也比较高。UDP比TCP更适合于与时问有关的应用数据的传输。在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。目前基于UDP工作的即时通信软件主要有OICQ。由于UDP的特点,亦是进行网络广播的首选协议。传统的NFS(NetFile System,网络文件系统)使用UDP。2.3 W i nSock技术随着Intemet的迅猛发展,网络通信应用程序的开发成为一个研究热点。Windows环境下进行通信程序设计的最基本方法是采用WinSock技术实现。WinSock规范以uCBerkeley大学BSD UNIX中流行的Sockets接口为范例定义了一套Micosoft Windows下网络编程接口1。应用程序调用WinSock的API实现相互之间的通信。又利用下层的网络通信协议功能和操作系统调用实现实际的通信工作。WinSock工作原理如图所示。Sockets也称为套接字,是一种网络编程接口,它是通信端点的一种抽象,提供了一种发送和接收数据的机制。用户目前可以使用两种类型的套接字,它们是数据报套接字(Datagram Sockets)和流式套接字(Stream Sockets),这两种套接字传输的数据类型是不同的,因而其使用方法和相应的程序设计模型也是不同的。2.4 C#中的网络编程服务器端:第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;第二步:建立一个Socket对像;第三步:用socket对像的Bind()方法绑定EndPoint;第四步:用socket对像的Listen()方法开始监听;第五步:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;第六步:通信结束后一定记得关闭socket;客户端:第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;第二步:建立一个Socket对像;第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;第五步:用socket对像的Receive()方法接受服务器发来的信息 ;第六步:通信结束后一定记得关闭socket;3 系统总体设计3.1 功能需求1、包括服务器端和客户端两部分,通过TCP/网络连接,可以独立运行。多个客户端之间通过服务器端实现相互通信。2、服务器端为客户端分配唯一标识号,并且负责维护客户端列表。负责转发客户端消息及广播客户端上线及下线消息。3、客户端由客户使用,可以指定服务器连接端口,可以获取现有客户端列表、发送消息到指定客户端、广播发送消息等。同时还可以接收来自其他客户端的消息。4、发送的消息只支持文本消息,暂不支持图片及其他格式的信息。5、没有进行数据库方面的支持,即不可以记录通信记录及用户信息等。根据上面的要求,可以将聊天软件分为服务器端和客户端两个部分开发。但是两个部分并非完全独立,首先,它们之间需要定义彼此的通讯协议,其次,还可以共享通讯协议模块。软件模块结构如图:协议处理模块服务器服务器界面 服务器对外接口客户端客户端界面客户端对外接口模块说明协议处理模块:负责服务器端和客户端通讯数据的打包解包操作。服务器模块:负责服务器端所有功能的实现,服务器通过调用协议处理模块完成通讯数据的打包和解包。逻辑上分成界面和对外接口两个部分,实现时可以集成到一起。客户端模块:负责客户端所有功能的实现,客户端也是通过调用协议处理模块完成通讯数据的打包和解包。逻辑上分成界面和对外接口两个部分,实现时可以集成到一起。3.2系统总体模块设计所设计的系统模块结构图如下:即时通信系统服务器端客户端启动服务器断开服务器监听客户端连接管理客户端消息处理连接服务器断开服务器消息发送选择好友3.3系统中主要用到的类类主要作用主要方法类TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。可使用 TcpClient 或 Socket 来连接 TcpListener。TcpListener.Start()/开始监听TcpListener.AcceptSocket()接收Socket类型的远端连接TcpListener.Stop()关闭监听操作类TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。TcpClient.Connect (IPEndPoint) 使用指定的远程网络终结点将客户端连接到远程 TCP 主机。 TcpClient.Connect (IPAddress, Int32) 使用指定的 IP 地址和端口号将客户端连接到 TCP 主机。 TcpClient.Connect (IPAddress, Int32) 使用指定的 IP 地址和端口号将客户端连接到远程 TCP 主机。 类NetworkStream 类提供在阻止模式下通过 Stream 套接字发送和接收数据的方法。可以在同步和异步数据传输时使用 NetworkStream 类。NetworkStream.Read()/从 NetworkStream 读取数据。NetworkStream.Write()/将数据写入 NetworkStream。4 系统分块设计4.1服务器端设计服务器端系统设计应用程序中,通常是一个服务器端接受多个客户端的链接,同时与连接成功的客户端进行数据传输。服务器端常具有以下几个功能:监听连接及提供端口。为客户端提供连接端口,并监听客户端的连接请求,为客户端分配通讯端口。管理和维护客户端的链接。实时更新客户端的链接状态。当客户端断开连接的时候,相应的断开其通信。接受数据管理。接受所有客户端的数据,根据应用程序的通讯协议对接受数据进行处理,并作出响应。(较为简单的是文字传送,扩展功能的时候可以添加文件传送等,需要更加高级的技术支持。)发送数据管理。将数据发送到一个或者多个客户端,即点对点的数据发送,或者信息群发,有的时候需要支持广播发送。根据具体的应用程序的要求不一样及版本的升级,服务器还有其他根据客户需要的扩展升级功能需要完善。可以比照当前流行的聊天软件,腾讯QQ、飞信等进行功能完善。服务器模块用例图服务器端详细设计、服务器的启动启动流程图:程序初始化启动服务器运行停止服务器界面更新后台更新提示信息启动相应线程、服务器对客户端的监听判断客户端的连接需要用到Socket类或者是TcpListener类。在系统选择TcpListener类来监视客户端的连接。、服务器对客户端的管理作为服务器,必须同时支持多个客户端的连接,因此,就需要对多个客户端进行管理。在该软件中采用Dictionary类来管理客户端,客户端具有唯一的标识,同时也是客户端的编号。创建类ImClient,用来表示一个已经连接的客户端,包含编号和连接套接字两个重要的属性,前者表示唯一的客户端,后者用于数据收发。创建ImServer类,它是服务器的主类,通过Dictionary泛型来管理客户端。对客户端系统提供两个事件,连接及断开。并提供相应的方法。、服务器处理客户端消息服务器类完成了对客户端的监听及连接管理的操作,另外的一个主要功能就是处理客户端之间发送的消息,接受客户端发送过来的消息并进行相应的处理然后发送到目的客户端。以上两个步骤的具体流程如图:启动服务器启动监听线程启动接收线程连接分配参数添加客户端列表断开移除删除相应客户端遍历每个客户端数据连接可用移除广播更新客户端列表接收解析处理客户号广播号广播转发、服务器的停止服务器的停止类似于服务器的开始流程,进行相应的界面更新以及后台更新。4.2 客户端设计客户端程序开发步骤:仅从网络通讯层次上看,网络应用程序客户端的开发比服务器开打要简单的多,通常只需要与一个服务器连接即可。客户端应用程序包括连接到服务器、发送数据到服务器、从服务器接收数据三个主要功能。在框架之下,客户端的开发步骤通常包含四个步骤:1、连接到服务器指定端口,可以通过类和类来实现。2、通过网络套接字类和类发送数据到服务器。3、通过独立线程,从类和类接收来自服务器的数据,并进行应对处理。4、处理完成之后,断开和服务器的连接,释放网络资源。客户端系统设计客户端用例图:客户端详细设计、连接服务器通过TcpClient类连接到服务器,需要所要连接的服务器的IP地址及端口号。通过界面获取服务器的IP地址和端口号作为参数传递进行连接。在客户端界面中,连接服务器通过“连接”按钮触发。程序初始化连接界面初始化获取参数界面更新成功后台更新提示失败、处理服务器消息在客户端中,网络传输层次上的数据处理比较简单,主要是从服务器接收数据,数据接收后的处理就随着需求和功能上的不同而完全不同,可以很简单,也可以非常复杂。在客户端中,只需要接受来自服务器的消息,通过独立的接受线程即可实现。连接服务器成功之后就启动了接受线程。接受线程接收到数据之后,同样是通过通讯协议处理模块完成通讯协议的处理,这里就体现出通讯协议模块独立出来的好处。根据扫描的命令,进行相应的操作。启动接受显示提示信息接受命令连接更新列表添加客户移除客户端接受分配ID接受消息更新ID消息、发送聊天信息、断开服务器4.3通讯协议模块通讯协议设计服务器端和客户端之间的通信需要定义一致的通讯协议,保证信息的正确传送。通讯协议格式以简单便于扩展为标准。定义的通讯格式是:#CMD#Type#SrcClient#DistClient#Content#END#它包含多个字段,不同字段用#分开,各字段意义如下:CMD:固定文本,表示命令的开始Type:命令的类型SrcClient:消息的来源客户端DistClient:消息的目的客户端Content:命令的具体内容END:固定文本,表示命令的结束协议实现定义枚举类型CommandTypes,枚举可能用到的命令类型。定义类ImCommand,用来表示单条通讯命令。最后通过类CommandScanner实现对协议命令的打包解包,它需要结合数据类型CommandTypes和ImCommand。由于其实一组函数的集合,所以将其声明为抽象类,所有的方法都是静态成员。ParseCommand在一个字节流数据中找到符合协议格式的命令,解析成ImCommand命令返回。BuildCommand将一个ImCommand对象表示的类型转换成需要发送的字节流数据,自动转换成标准格式。StringToBytes将一个string类型的字符串按照Unicode格式转换成byte字节流。BytesToString将一个byte字节流按照Unicode格式转换成一个string类型的字符串。5系统具体实现5.1关键模块的具体实现通讯模型服务器端和客户端的信息交互模型应答分配给客户端通讯端口通过指定端口连接服务器端信息的处理模式以服务器端为主体分析信息传递的几种模式,主要体现通讯的设计机制,以下为基本的流程图,以后进行功能扩展的时候可以以此为基础,进行相关的功能丰富。例如传递信息的多媒体化等等。主要类的设计类的主要依赖关系图:服务器的启动this._Server.Stop()Start(int port)this._ReceiveThread.Start( )this._ReceiveThread.Start( )e.Information信息提示启动IsRunning客户端数据接受连接过程流程图:this._TcpCli.Connect(srv, port)this.lstClients.Items.Clear( )Connectedthis._ReceiveThrd.Start( )error客户端的信息处理具体数据接收过程流程图:ReceiveFunc( )信息提示ConnectedDealCommand(cmd)Items.Add(srcId) this._ClientID = contentthis.AppendInfo(str)显示消息ClientConnectClientIDSendMessage5.2客户端运行效果服务器端启动界面客户端启动界面启动服务器客户端接入服务器运行时界面显示客户端列表显示选中客户信息可以主动断开选中的客户端客户端运行时界面客户端显示连接到服务器的客户端列表有对话框显示对话信息有显示文字编辑框及选中的聊天对象6 课程小结总结该软件设计时以C#语言为依托,基本实现了1、利用WinSock进行点对点通信;2、工作机制模仿即时通信软件的基本功能,登陆,上线,传递信息等等。3、分为客户部分和服务器部分两块,客户部分类似一般通信软件例如QQ,服务器部分主要提供客户端用户基本数据配置。在这个过程中,简单了解了即时通讯软件的工作流程,信息传递的基本原理,通讯协议的基本应用。主要熟悉了即时通讯软件系统的构建,主要模块,基本框架。改善之处该套软件是即时通讯软件的简单实现,只可以实现基本的上线下线功能及简单的文字信息传递。在此基础之上可以扩展更多的功能。1、后台数据库的设立为该系统附加一个数据库,对客户信息保存,客户的基本信息,如年龄、性别、昵称等。同样,也可以实现用户密码登录。以及相关信息的记录,由此可以丰富个人信息,并实现个人信息的修改,查询,好友的修改及查询。2、完善文件传输功能在简单文字的基础之上,加强数据传输的能力。实现图片、音频、视频等文件的传输。增大聊天软件的功能。3、实现更加友好的聊天界面。这种实现需要设计到更为复杂的软件设计,还需要图形界面的设计与编程技巧。 7 参考资料完全自学宝典C#3.0 清华大学出版社 强锋科技 杨明羽编著 硕士学位论文 基于WinSock的企业即时通信系统研究及其实现 姚丽琴计算机网络 谢希仁 编著 电子工业出版社34
展开阅读全文