文件传输与聊天系统设计论文_第1页
文件传输与聊天系统设计论文_第2页
文件传输与聊天系统设计论文_第3页
文件传输与聊天系统设计论文_第4页
文件传输与聊天系统设计论文_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页1前言1.1文件传输与聊天系统的开发背景及选题意义互联网的普及和发展为人们的沟通提供了多种手段,近年来流行的即时通信是继电子邮件之后的又一种主流通信方式。以色列Mirablils公司1996年11月推出了世界上第一个即时通信软件,即后来风靡全球的"网络寻呼机ICQ",宣告了"即时通信"这一概念的诞生。即时通信系统利用服务器上的用户注册信息和联机用户建立起虚拟社区,服务器为社区成员提供状态信息和联系方式,以便用户之间互相通信,用户使用特定的即时通信客户端登录到服务器,找到他想联系的人进行交流。在ICQ取得巨大成功之后,许多公司纷纷效仿,如美国AOL公司的InstantMessenger,Yahoo公司的YahooMessenger等。有调查资料甚至列出了国外多达18种的即时通信软件。在我国,深圳腾讯公司1999年2月推出了腾讯QQ。目前国内数十家公司拥有自主知识产权的即时通信产品。ICQ公司号称建立了世界上最大的网络用户群,拥有12亿注册用户遍布全球。而腾讯公司则建立了中国最大的互联网注册用户群。在技术层面上,即时通信系统也从最早的专用即时通信工具发展到了最新的XML网站集成服务。更有甚者,美国微软公司把即时通信工具MSNMessenger捆绑在操作系统上随Windows2000等产品发行。短短几年间,即时通信系统迅猛发展,商业产品层出不穷,用户遍布世界各地,技术日新月异。即时通信工具凭借实时、有效的沟通功能,特别是凭借其对虚拟网络社区的建设,赢得了广大互联网用户的喜爱。目前,它又通过集成其他媒体、拓展应用模式等方式继续发展壮大,进军电子商务、计算机协同工作等更广阔的天地。本设计通过实际动手,用VC实现简单的即时通信系统,达到熟悉即时通信软件的应用环境及背景,熟悉即时通信软件的常用开发技术的目的。本设计将最主要研究在这类即时通讯软件的开发中是如何运用SOCKET套接字编程技术来实现通讯交流。本设计按照软件工程的思想从需求分析着手,进行总体设计,详细设计,编码及调试等步骤。其中通信部分软件的设计与开发是本设计的重点。本设计采用了CS体系结构和P2P方式通信的思想进行软件总体设计;撰写用以保证通信安全的密码算法,设计相关的密钥管理方案。1.2文件传输与聊天系统的发展现状现在国内面向个人的即时通信产品主要有腾讯QQ、微软MSN、网易泡泡、ICQ、雅虎通以及发展势头正猛的TOM-skype等。面向企业用户的即时通信产品比较多,但除了腾讯、微软等少数运营商用户比较多以外,其他产品推出时间都很短,用户极少。虽然即时通信业务已日益成熟,但目前各类即时通信软件及服务都存在不少缺陷,需要改进:(1)安全性问题。目前,大多数即时通信系统的安全性较差,极易受到病毒攻击。QQ、MSN就相继遭受过病毒的侵袭以及由网络故障带来的稳定性问题。即时通信要想进一步发展,首先要解决的就是安全性问题。(2)互联互通问题。受多种因素制约,各即时通信工具间的互联互通问题至今未解决。随着即时通信企业用户规模的进一步扩大,如何将不同的即时通信工具实现互联,以实现跨不同即时通信系统的即时通信就成了不可回避的话题。(3)差异化问题。市场上的几大即时通信工具,它们在服务功能、市场定位和目标市场选择上都基本雷同,缺乏特色。即时通信如果继续如此近乎无差异化地发展下去,最后唯一的结果就是竞争日益激烈,不利于即时通信的发展。1.3本论文的组织结构第1章是前言,主要介绍文件传输与聊天系统的背景、选题的意义以及本论文的组织结构。第2章是文件传输与聊天系统开发的技术基础,主要介绍开发即时通信软件的一些基本技术,网络开发的背景知识以及SOCKETAPI和MFCSOCKET编程的基础。第3章和第4章是文件传输与聊天系统系统分析及网络设计,主要详细的介绍开发即时通信软件网络设计的全过程,包括消息格式的设计,应用层协议的分析,以及相关网络通信类的描述,是本论文的重点。第5章是文件传输与聊天系统网络设计的结果分析,主要总结出本论文设计的结果并进行分析。最后的部分是结论、参考文献、致谢以及附录。

2文件传输与聊天系统开发的技术基础2.1网络协议简介2.1.1TCP/IP网络层次模型当谈到TCP/IP模型的时候,不得不首先介绍OSI层次模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,而在现实网络世界里,TCP/IP协议栈获得了更为广泛的应用。OSI参考模型(OSI/RM)的全称是开放系统互连参考模型(OpenSystemInterconnectionReferenceModel,OSI/RM),它是由国际标准化组织(InternationalStandardOrganization,ISO)提出的一个网络系统互连模型。OSI模型从上到下分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层(数据链路层)。在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。很多高级应用协议都是在这个层次实现的,在基于TCP协议中,比如文件传输协议FTP(FileTransferProtocol)、简单邮件传输协议SMTP(SimpelMailTranslateProtocol)、超文本链接协议HTTP(HyperTextTransferProtocol);基于UDP协议中,比如域名系统DNS(DemainNameSystem),简单文件传输协议TFTP(TrivialFileTransferProtocol)等。2.1.2TCP和UDP协议基础尽管TCP和UDP都使用相同的网络层(IP)且都工作在传输层,TCP却向应用层提供与UDP完全不同的服务。TCP协议提供了一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先是拨号振铃,等待对方接电话后,然后再进行说话交流。只有当建立好TCP连接后,双方才可以进行通信。与TCP不同,UDP是一种简单的无连接的面向数据报的传输层协议,它是不可靠的,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地,使用UDP协议的场合与TCP是不一样的,或许正因为它的无连接性使得UDP传输的效率很高,这也是为什么即使它的可靠性不高但是依然存在的理由。本次设计大量使用了UDP协议进行传输数据,并针对它的不可靠性做些处理。2.2Socket套接字编程2.2.1Socket套接字简介网络程序设计全靠套接字(SOCKET)接收和发送信息。什么是套接字?套接字的英文原意是“孔”或“插座”,作为BSDUNIX的进程通信机制,取后一种意义。套接字实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则没有办法建立联系并相互通信的。套接字是面向客户—服务器模型设计,针对客户和服务器提供不同的套接字操作。套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字。流式套接字可以提供可靠的、面向连接的通信流,对应于TCP协议。通过流式套接字接收的数据顺序和发送的数据顺序是一致的。数据报套接字定义了一种无连接的服务,对应于UDP协议。数据通过相互独立报文进行传输,是无序的,并且不保证可靠、无差错。原始套接字允许对底层协议如IP和ICMP直接访问,主要用于新的网络协议的开发实现和测试等,它工作在网络互连层,对程序员的要求比较高。Socket提供了一组通用的函数组,这些函数在现在绝大部分操作系统中都提供内核的支持,所以无论是什么编程语言,比如C,Perl,Java,Pascal,Basic等都可以提供这些函数的接口,使得Socket编程具有一定的移植性。2.2.2Socket函数以及TCP客户机/服务器模型下面是传统的Socket函数接口,这些函数已经足够编制出功能强大的网络应用程序了。intsocket(intdomain,inttype,intprotocol);intbind(intsockfd,structsockaddr*hostaddr,intaddrlen);intlisten(intsockfd,intbacklog);intrecv(intsockfd,void*buf,intlen,intflags);intsend(intsockfd,void*buf,intlen,intflags);intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,structsockaddr*to,inttolen);intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);传统的socket套接字函数是编写网络程序的基础,即便是使用MFC中的CSocket类来进行网络编程,对底层SocketAPI的了解也是非常有益的。以下为TCP客户机/服务器模型,如图2.1所示:图2.1TCP客户机/服务器模型2.3MFC网络编程类VC中提供的CSocket类以及CAsyncSocket类使得编写网络程序变得很简单,从创建套接字到数据的接收和发送都变得非常快捷,下面就主要就本设计将要用到的CAsyncSocket类进行重点描述。①创建一个套接字创建套接字一般分为两个步骤。先通过调用CAsyncSocket的构造函数不带参数,它创建一个空的套接字对象,真正的创建工作由Create函数完成,其函数原型如下:BOOLCreate ( UINTnSocketPort=0, IntnSocketType=SOCK_STREAM, LonglEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE, LPCTSTRlpszSocketAddress=NULL,);nSocketPort为套接字指定一个端口,若是服务器套接字,那么应该为其指定一个端口。如果是客户机套接字,则使用默认值即可。nSocketType指定套接字的类型。默认是流套接字(SOCK_STRAEM).如果设为SOCK_DGRAM,那么将创建数据报套接字。lEvent用于指定要生成的事件通知。默认所有事件都会生成通知lpszSocketAddress是套接字的网络地址,默认表示指定为本机地址。②建立与服务器的连接客户套接字可以使用CAsyncSocket的Connect函数创建与服务器的连接。如果成功则返回TRUE,否则返回FALSE。失败时可以调用GetLastError函数获得错误信息。Connect函数原型如下:BOOLConnect( LPCTSTRlpszHostAddress,UINTnHostPort,};BOOLConnect( constSOCKADDR*lpSockAddr, intnSockAddrLen);lpszHostAddress为套接字的主机网络地址,为IP地址或者机器名称。nHostPort为应用程序套接字的主机端口号。lpSockAddr为套接字地址指针。nSockAddrLen为套接字地址长度。③服务器的监听和接收客户端的请求Listen函数原型:BOOLListen( intnConnectionBacklog=5);Accept函数原型:virtualBOOLAccept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL);rConnectedSocket为当来了一个新的连接的时候所给的一个套接字的引用,以后就可以用这个新的套接字进行通信。lpSockAddr为接收到的客户机的地址,指针类型。lpSockAddrLen为接收到的客户机地址的长度的指针。④数据的发送与接收CAsyncSocket和SocketAPI中接收发送函数是一致的。⑤重载函数CAsyncSocket是异步模式,因此在进行一些处理的时候比如监听(Listen)或接收(Accept)时它不会阻塞后面的操作而是直接返回,为了能够处理相关事件必须要重载CAsyncSocket的相关函数。在服务器端一般都会重载以下函数:virtualvoidOnAccept(intnErrorCode);////当有接收事件发生时调用该函数virtualvoidOnReceive(intnErrorCode);////当有数据到达的时候调用该函数virtualvoidOnClose(intnErrorCode);////当客户端关闭套接字的时候调用该函数在客户端一般会重载以下函数:virtualvoidOnClose(intnErrorCode);////当有服务器关闭套接字的时候调用该函数virtualvoidOnConnect(intnErrorCode);///当连接到服务器的时候调用该函数virtualvoidOnReceive(intnErrorCode);////当接收到数据的时候调用该函数2.4开发环境及相关知识介绍所有代码将在WindowsXPSP2+VC.NET环境下开发;服务器的数据库支持使用Access+ODBC处理;密码算法使用国际上标准的DES算法和MD5单向加密算法来处理。

3文件传输与聊天系统系统分析3.1文件传输与聊天系统的开发概要3.1.1开发目的以及内容要求熟悉即时通信软件的应用环境及背景,熟悉即时通信软件的常用开发技术,主要是网络技术,SOCKET编程技术,网络数据库技术,以及网络安全技术。软件开发基于WINDOWS平台在VC上实现;按照软件工程的思想从需求分析着手,进行总体设计,详细设计,编码及调试等步骤;SOCKET可以使用API也可以使用已有类;通信部分软件的设计与开发是本设计的重点。采用CS体系结构和P2P方式通信的思想进行软件总体设计;撰写用以保证通信安全的密码算法,设计相关的密钥管理方案。3.1.2该软件开发的技术指标软件功能完整,应有即时消息通信、文件传输等基本功能,能支持的客户端的个数不少于254个;软件界面友好;通过服务器进行消息中转;要求至少能应用于局域网环境,最好能应用于INTERNET环境。应用数据库对通信用户及通信消息、活动日志等进行管理;能实现查询操作;对传输活动及消息进行加密管理,采用的算法应是国际上著名的算法,算法实现可以利用已有的API函数,借鉴现有成熟的代码,也可以自主完成;有完整的无明显漏洞的密钥管理方案及实现。3.1.3该软件开发的功能描述基本功能描述⑴用户的注册通过服务器的用户管理,提供用户的注册功能。用户只有通过注册的方式才可以与其他注册的用户进行信息的交流。注册的信息最重要的就是用户的昵称以及密码,当然还包括其他个人资料信息。用户唯一的标志是服务器提供的用户号码,当且仅当用户提出注册请求的时候,服务器才根据数据库中的信息提供新的用户一个用户号码,用户通过号码和个人密码进行后续的登陆操作。⑵用户的登陆通过服务器的用户管理,提供用户的登陆功能。用户只有通过登陆的方式才可以进入主界面获取其好友列表,然后才可以进行信息的交流和其他操作。用户的登陆操作会在服务器进行相关的记录,服务器可以随时查询在线用户的信息。用户的登陆应该是安全的,号码和密码信息都传输到服务器的过程中会经过动态加密,即时是同一个用户在同一地点进行多次登陆的时候,在网络传输的登陆相关信息也不是相同的,这才可以保证登陆的最大化安全。⑶添加好友功能用户在注册并成功登陆后可以获取其好友列表,最初的时候每个用户都是没有任何好友的,因此本设计需要提供可以添加好友的功能以便让用户有信息沟通的对象。不但可以添加在线的好友对于不在线的好友也可以发出添加好友的请求,服务器应该根据不同的用户的状态进行不同处理,当用户不在线的时候,应该将添加好友的请求信息保存在服务器的数据库中,以便当被添加者上线的时候将该添加请求发送出去。服务器对于添加好友的请求需要将相关信息进行数据库的操作。添加好友是个双向过程,当一方添加成功了另一方的时候,两者都需要在自己的好友列表中添加一个好友信息。⑷删除好友功能用户不仅可以添加好友也可以删除好友。当用户向服务器提出删除好友的请求后,服务器需要进行数据库的处理以便删除好友的记录在用户的信息里面得到更新,同时也需要通知被删除者被删除的过程。删除好友的操作也是一个双向的过程,在客户的双方都要将对方在自己的好友列表中删除掉。这和添加好友是一致的。⑸消息传送功能这是一个最基本的功能,即时通信最基础的要求就是要进行通讯信息的传送。具体表现为当一方客户需要向另一发客户发送消息的时候,只需要在好友列表中选择该好友,继而在弹出的对话框中输入通信内容,点击发送按钮后该消息将通过服务器的中转转发到接收方的客户端并弹出消息聊天对话框进行显示。这里传送消息有两种情况,其一是对方是在线用户,那么服务器马上可以进行转发而不用有任何的延迟;其二是对不在线的用户,如果对方不在线那么服务器需要将传送的信息保存在数据库中,一旦对方上线的时候再将未转发的信息发给该上线者。⑹文件传输功能这个也是基本功能之一。登陆成功后的双方用户为了某种要求需要进行文件的传输,显然文件传输应该是点对点的并且使用TCP连接才能保证文件传输的可靠性。一方用户A点击文件传输的选项继而选择要传输的文件名,此时在该用户实际已经建立起一个TCP监听套接字,在另一方的客户B将接收到对于文件传输的接收请求,同意或者拒绝接收文件。当客户B选择接收的时候即将调用connect函数远程连接到客户A,然后进行文件的传输。文件的传输是分段处理的因为对于大文件来说一定要进行分段分割的传输。⑺查找用户功能本设计需要提供用户的查询功能。某用户可以查询到当前在线的用户以及指定信息的用户。这里的指定信息主要是指用户号码,通过用户的号码来查询用户的个人信息。当然还可以通过昵称、国家、地区、年龄、性别等信息进行模糊查询。⑻个人信息修改本设计提供个人信息的修改功能。当个人用户需要修改自己的某个资料时,比如自己的密码,自己的昵称等,用户将修改好的信息传送给服务器,服务器根据相关信息进行数据库的修改将该用户的资料更新。⑼查看好友信息本设计提供查看好友信息的功能。对于某个好友,客户端向服务器发送查看该好友信息的请求,服务器操作数据库提取相关信息然后传送给客户端。客户端接收到好友信息后进行显示。⑽服务器的日志记录功能对于每个客户的活动,比如注册,登陆,上线时间等服务器都会进行日志的记录,以便于服务器的管理。⑾服务器的后台管理服务器的后台管理表示服务器通过查询数据库可以了解所有用户的信息,可以统计在线的人数,可以群体发布一些系统的公告。⑿服务器网络处理该功能是整个文件传输与聊天系统的核心。服务器应该可以协调多用户的请求服务,当用户的请求消息来临时能够通过开辟线程的方式来进行并行处理,服务器对客户的应答应该时快速的,对用户来说不应该感觉到有延迟。附加功能描述⑴用户状态改变功能用户可以改变自己的状态,比如在线,隐身,忙碌,离线等。用户状态的改变先通知服务器,服务器再将该用户状态改变的通知发送给该用户所有在线的好友,一旦好友接收到此通知后,将进行界面的处理,将这个用户的状态在自己的好友列表中修改。⑵用户退出客户端程序的功能当用户选择退出客户端软件的时候,该客户需要通知服务器下线通知,以便服务器能了解该用户的状态信息,同时进行相关的数据库处理。当某用户退出系统的时候,服务器需要通知该用户的其他好友,使得其他好友能明白该用户已经下线,与用户状态改变的功能是一致的。⑶用户保持在线的激活功能该功能表示用户和服务器在一定的时候内需要进行互相的激活,以便服务器能够准确的知道某个用户还在线。该功能的提出是因为用户可能会非法退出程序,比如非法关机,死机等情况,这个时候客户端软件无法正常的告诉服务器自己的退出请求。服务器将定时给在线用户发送激活消息,在一定时间内用户若没有应答,即做出该用户已经下线的判断,并做出相关的处理。系统用例图:图3.1系统用例图3.2文件传输与聊天系统的应用层协议设计以及相关数据结构3.2.1数据包格式定义为了让通信双方遵守一定的规则,必须要定义通信数据包的格式,如图3-2所示为本设计定义的数据包结构。版本号功能号数据内容加密后的长度未加密前的原始数据内容长度要传输的数据内容4个字节 4个字节 4个字节 4个字节 长度由前面的字段决定图3.2数据包结构前面的4个字段构成了数据包头部,后面的为数据内容。换而言之,本设计的每个数据包都由数据包头部和数据内容组成:数据包=数据头部+数据内容其中:①版本号版本号为该数据包的版本系统号,这样的设计是便于以后系统的扩展;另一方面也可以判断该数据包是不是合法的数据包,当服务器或者是客户端接收到的数据不是以指定的版本号开头说明该数据包是不是本系统要求的,那么可以一开始就剔除掉,以免后面错误的发生。版本号的长度为4个字节。②功能号功能号用于指定该数据包的用途。每个数据包都具有特定的功能作用,服务器或者是客户端对于接收到数据包就是根据不同的功能号才进行不同处理。也只有通过功能号才可以区分不同的数据包。功能号的长度为4个字节。③数据内容加密后的长度因为本设计的加密系统只是对数据内容进行加密,数据包头部是不会被加密的。该字段指明了原始的数据内容进行加密后的长度,因为加密系统对数据加密后的密文长度可能是改变了的。本字段长度为4个字节。④未加密前的原始数据内容长度本字段4个字节,记录数据内容在未加密之前的长度,和③字段配合只用足可以让加密后的数据内容解密还原。⑤要传输的数据内容该字段的内容在传输前经过了加密,这里讨论未加密前的数据内容格式。不同功能号对应的数据内容也是不一样的。根据功能号定义了不同数据内容的格式,数据内容的定义和功能号是一一对应的,比如若是功能号为a的数据包,那么它的数据内容的结构定义为structcontent_a,依次类推。下面介绍所有的数据内容格式,里面出现的数据类型在附录中均有定义。(1)功能号0功能描述:客户端与服务器之间的激活消息,客户端在登陆成功后就发送该消息;服务器每隔一定的时间就发送该消息给所有在线的用户。宏定义:#defineOP_ACTIVE 0数据内容定义:structcontent_0{ charuserNum[MAX_USERNUM];};数据内容描述:若该消息由服务器接收,那么userNum表示发送者的号码;若该消息由发送,那么userNum表示接受者的号码。(2)功能号1功能描述:客户请求注册,发送该消息给服务器。宏定义:#defineOP_REG_REQ1数据内容定义:structcontent_1{ MYINFOmyself;};数据内容描述:myself为MYINFO的结构体类型,里面填充了在注册时需要的各种资料信息。(3)功能号2功能描述:服务器对客户端注册应答。宏定义:#defineOP_REG_RESPONSE2数据内容定义:structcontent_2{ boolOK; charuserNum[MAX_USERNUM];interrCode;};数据内容描述:OK表示注册是否成功。若OK为true表示注册成功且userNum里面存放的是该用户的新号码;若OK为false表示注册失败,errCode里面存放的是错误代码。(4)功能号3功能描述:客户端发送登陆请求给服务器。宏定义:#defineOP_LOGIN_REQ 3数据内容格式:structcontent_3{ charuserNum[MAX_USERNUM]; charauthInfo[MAX_AUTHINFO];};数据内容描述:userNum为登陆用户的号码,authInfo为登陆者的认证信息。这点很复杂,为了保证登陆的安全性,登陆的过程是动态处理的,同一个用户每次登陆的authInfo信息都不是相同的,即便密码并没有改变。如何实现登陆的动态性将在后面讨论。(5)功能号4功能描述:服务器对客户登陆请求的应答宏定义:#defineOP_LOGIN_RESPONSE 4数据内容格式:structcontent_4{ boolOK;};数据内容描述:OK表示登陆是否成功。OK为true表示登陆成功;OK为false表示登陆失败。(6)功能号5功能描述:客户端请求服务器给一个好友发送一条消息。宏定义:#defineOP_SEND_REQ 5数据内容格式:structcontent_5{ boolOnline; charfriendNum[MAX_USERNUM]; USERADDRfriendAddr; charmyNum[MAX_USERNUM]; charmsgContent[MAX_BUFFER]; CTimesendTime;};数据内容描述:Online表示对方是否在线;friendNum为对方好友的号码;friendAddr为对方好友的UDP地址(IP地址和端口号);myNum为自己的号码;msgContent为传输的消息内容;sendTime为消息发送时间。(7)功能号6功能描述:服务器对客户转发好友信息,对接收者来说这是接收到的消息格式。宏定义:OP_SEND_RESPONSE数据内容格式:structcontent_6{ charfromNum[MAX_USERNUM]; chartoNum[MAX_USERNUM]; USERADDRfromAddr; charmsgContent[MAX_BUFFER]; CTimesendTime;};数据内容描述:fromNum为发送者号码;toNum为接收者号码;fromAddr为发送者的网络地址;msgContent为要传输的消息内容;sendTime为发送的消息时间。(8)功能号8功能描述:客户端收到系统发来的系统消息或者服务器向在线发送系统消息宏定义:#defineOP_RECV_SYSTEM 8数据内容格式:structcontent_8{ charmsgContent[MAX_BUFFER]; CTimesendTime;};数据内容描述:msgContent为数据的内容;sendTime为发送的时间。(9)功能号9功能描述:客户端自己的状态改变。宏定义:#defineOP_STATE_MYSELF 9数据内容格式:structcontent_9{ charmyNum[MAX_USERNUM]; intstate;};数据内容描述:myNum表示自己的号码;state表示状态改变号码。(10)功能号10功能描述:服务器向每个客户的好友发送该用户的状态改变信息。宏定义:#defineOP_STATE_RESPONSE10数据内容格式:structcontent_10{ charfriendNum[MAX_USERNUM]; intstate;};数据内容描述:friendNum为好友的号码;state为该好友改变的状态号码。(11)功能号12功能描述:客户端向服务器发送个人信息修改后的数据。宏定义:#defineOP_INFO_MODIFY 12数据内容格式:structcontent_12{ charuserNum[MAX_USERNUM]; MYINFOmyself; };数据内容描述:userNum为自己的号码;myself为自己修改个人信息后的资料。(12)功能号13功能描述:服务器对客户的个人信息修改请求应答。宏定义:#defineOP_MODIFY_RESPONSE 13数据内容格式:structcontent_13{ boolOK;};数据内容描述:OK为true表示个人信息修改成功;OK为false表示个人信息修改失败。(13)功能号14功能描述:客户端向服务器发送查看好友的信息请求。宏定义:#defineOP_VIEWINFO_REQ 14数据内容格式:structcontent_14{ charfriendNum[MAX_USERNUM];};数据内容描述:friendNum为要查看资料的好友的号码。(14)功能号15功能描述:服务器端对客户端发送的查看好友信息请求应答。宏定义:#defineOP_VIEWINFO_RESPONSE 15数据内容格式:structcontent_15{ FRIENDINFOmyFriend;};数据内容描述:myFriend为好友信息结构体类型,存放好友的个人资料。(15)功能号16功能描述:客户端发送查看指定号码的用户给服务器宏定义:#defineOP_SEARCH_ONE 16数据内容格式:structcontent_16{ charuserNum[MAX_USERNUM];};数据内容描述:userNum为要查询的好友的号码。(16)功能号17功能描述:对于功能号16的请求,当服务器找不到指定的用户号码的时候,返回该应答。宏定义:#defineOP_SEARCH_FAILED 17数据内容格式:structcontent_17{};数据内容描述:该功能号的数据内容为空。即只需要返回头部信息即可。(17)功能号18功能描述:服务器到到指定的用户,返回该用户的资料。宏定义:#defineOP_SEARCH_ONE_RESPONSE 18数据内容格式:structcontent_18{ FRIENDINFOmyFriend;};数据内容描述:myFriend存放查询到的用户的资料。(18)功能号19功能描述:客户端请求搜索在线用户。宏定义:#defineOP_SEARCH_ONLINE 19数据内容格式:structcontent_19{ charuserNum[MAX_USERNUM]; intoffset;};数据内功描述:userNum为提出搜索请求的用户号码;offset为搜索在线用户的偏移量。(19)功能号20功能描述:服务器返回客户端搜索在线用户请求的应答。宏定义:#defineOP_SEARCH_ONLINE_RESPONSE 20数据内容格式:structcontent_20{ FRIENDINFOmyFriend[GROUP_NUMBER];};数据内容描述:myFriend为一个数组,大小为GROUP_NUMBER,这也是每次返回的在线好友最大的个数,数组类型是好友信息的结构体。(20)功能号21功能描述:客户端请求添加好友。宏定义:#defineOP_ADDFRIEND_REQ 21数据内容格式:structcontent_21{ charfriendNum[MAX_USERNUM]; charmyNum[MAX_USERNUM]; charauthContent[MAX_AUTH_LEN];};数据内容描述:friendNum为对方好友的号码;myNum为自己的号码;authContent为认证信息,目前默认为空,即不需要验证。(21)功能号22功能描述:对于功能号21的请求,服务器判断该好友是否允许添加好友,若同意添加好友,应答该消息给添加者。宏定义:#defineOP_ADDFRIEND_RESPONSE 22数据内容格式:structcontent_22{ SIMPLE_FRIENDINFOmyFriend;};数据内容描述:myFriend存放被添加者的一些相关简单但必备的资料。(22)功能号23功能描述:当被添加者同意添加好友,服务器除了发送功能号22的消息外,还要发送此消息给被添加者通知他已经有人添加他为好友了。宏定义:#defineOP_ADDFRIEND_INFORM 23数据内容格式:structcontent_23{ SIMPLE_FRIENDINFOmyFriend;};数据内容描述:myFriend为添加者的个人简单资料。(23)功能号26功能描述:对于功能号21的请求,当被添加者不同意添加好友的时候,发送该消息给添加者。宏定义:#defineOP_ADDFRIEND_REFUSE 26数据内容格式:structcontent_26{ SIMPLE_FRIENDINFOmyFriend;};数据内容描述:myFriend为被添加者的简单资料。(24)功能号28功能描述:该信息返回登陆者的好友列表。宏定义:#defineOP_FRIENDLIST 28数据内容格式:该信息无法用固定长度的结构来表示,因为每个人的好友个数是不同的,因此用以下结构定义该数据内容,如图3.3所示。好友的个数Friend_NumSIMPLE_FRIENDINFO类型的动态数组,大小为Friend_Num4个字节 sizeof(SIMPLE_FRIENDINFO)*Friend_Num个字节图3.3好友列表的格式数据内容描述:数据内容的前4个字节为好友的个数;从第5个字节开始就是好友的信息了,以SIMPLE_FRIENDINFO类型的数据形成的连续的列表。组织的形式如下:SIMPLE_FRIENDINFOf1;SIMPLE_FRIENDINFOf2;……SIMPLE_FRIENDINFOfn;其中n为Friend_Num。(25)功能号29功能描述:客户端请求在自己的好友列表中删除某个其他好友。宏定义:#defineOP_DEL_FRIEND 29数据内容格式:structcontent_29{ charmyNum[MAX_USERNUM]; charfriendNum[MAX_USERNUM];};数据内容描述:myNum为自己的号码;friendNum为要删除的好友号码。(26)功能号30功能描述:客户端请求退出系统。宏定义:#defineOP_QUIT_REQ 30数据内容格式:structcontent_30{ charuserNum[MAX_USERNUM];};数据内容描述:userNum为自己的号码。(27)功能号31功能描述:当客户登陆的时候,服务器返回给客户端的个人信息。宏定义:#defineOP_MYINFO_RESPONSE31数据内容格式:structcontent_31{MYINFOmyinfo;};数据内容描述:myinfo存放个人的所有资料。(28)功能号32功能描述:客户端在登陆的时候请求随机数,用于生成动态加密信息。宏定义:#defineOP_RANDOM_REQ 32数据内容格式:structcontent_32{ charuserNum[MAX_USERNUM];};数据内容描述:userNum为登陆者自己的号码。(29)功能号33功能描述:服务器返回随机数给客户端,事实上是对功能号32请求的应答。宏定义:#defineOP_RANDOM_RESPONSE 33数据内容格式:structcontent_33{ UINTrandom;};数据内容描述:random为服务器随机生成的随机数。(30)功能号34功能描述:客户端删除了某个好友后服务器通知该被删除者。宏定义:#defineOP_USER_DELETED34数据内容格式:structcontent_34{ chartoNum[MAX_USERNUM]; charfromNum[MAX_USERNUM];};数据内容描述:toNum为被删除者的号码;fromNum为提出删除请求的用户号码。3.2.2应用层协议流程消息格式实际上已经定义了消息之间的互动关系。如下表3.1所示显示了消息之间的关系。表3.1消息之间的关系客户端发送给服务器服务器发送给客户端0(激活)0(激活)1(注册)2(注册应答)32(随机数请求)33(随机数应答)3(登陆)4(登陆应答)、28(好友列表)、31(个人信息)、10(状态改变应答)5(发送消息)6(消息转发)无8(服务器发送系统消息)9(状态改变)10(状态改变应答)12(个人信息修改)13(个人信息修改应答)14(查看好友信息)15(查看好友应答)16(查询一个用户)17(查询失败)或18(查询成功返回好友信息)19(查询在线用户)20(查询在线用户应答)21(添加好友请求)22(添加好友应答)、23(添加好友通知)、26(添加好友拒绝)29(删除好友)34(删除好友通知)30(退出系统)10(状态改变应答)其中表中的数字表示对应的功能号,括号内为功能描述。表中每行的意思为当客户端发送该行左边的功能号的消息给服务器时,服务器经过一系列处理后返回该行右边的功能号的消息给客户端。当有一方没有消息发送时,另一发是单向发送的。比如表中的8号功能消息,左边为“无“。3.3文件传输与聊天系统的总体模块分析以及网络通信模块设计3.3.1总体模块分析整个系统分为客户端和服务器,采取典型的C/S模式,而客户之间的文件传输采取P2P模式。客户端分为四大模块:界面显示模块,客户端通信模块,安全模块,客户端数据处理模块。其中界面显示模块用于显示界面,客户端通信模块用于处理与网络通信相关的内容。他们之间通过客户端数据处理模块联系起来。当需要发送消息给外界的时候,界面显示模块提取到相关内容通过数据处理模块调用通信模块的某个函数,发送给外界,这里的外界指别的客户端或服务器;当客户端收到网络上的某个消息的时候,首先是通信模块获取到有关消息,然后通过数据处理模块反馈到界面显示模块中去。安全模块相对独立,通信模块需要调用安全模块对数据进行加密,解密。服务器端分为四大模块:服务器端通信模块,安全模块,数据库操作模块,服务器端数据处理模块。其中数据库操作模块用于进行数据库的查询修改插入删除操作;服务器端通信模块用于处理与网络通信相关的内容,他们之间通过服务器端数据处理模块联系起来;当服务器端通信模块提取到网络上的某个消息的时候,通过数据处理模块调用数据库操作模块,进行相关操作;如果需要通信的话,再通过数据处理模块调用服务器端通信模块。安全模块和客户端一样,是公用的。系统模块之间的关系如图3.4所示:图3.4系统模块关系图3.3.2网络通信模块设计服务器网络通信设计如图3.5所示为服务器网络管理活动图。图3.5服务器网络管理活动图其中服务器开启后创建了两种类型的套接字,一种是TCP套接字,主要进行接收用户的注册和登陆的运作包括返回好友列表;另外一个是UDP套接字,对于除了注册和登陆之外的其他请求的运作,比如发送消息,状态改变等。对于TCP套接字,当接受到新连接的时候,随即在新的线程里面处理该新连接,每次接收到数据后就进行相关的事务处理,如图3.6所示为TCP事务处理的过程。接收到的数据包接收到的数据包数据包的拆分数据内容的解密判断版本号是否为当前版本否分析功能号注册请求随机数请求登陆请求1323发送2消息发送33消息发送4,28,31,10消息分析下一个数据包图3.6TCP事务处理图上的数字表示系统对应的功能号。UDP的事务处理与TCP的事务处理类似,如图3.7所示显示了UDP事务处理的过程。其中图中的数字为相关的功能号码。服务器每次发送给客户端的消息需要经过相关处理,比如封装和加密等,如图3.8所示显示了发送消息的过程。接收到的数据包接收到的数据包数据包的拆分数据内容的解密判断版本号是否为当前版本号分析功能号激活0发送0消息传输消息5发送6消息状态改变9发送10消息个人信息修改12发送13消息查看好友信息14发送15消息查询一个用户16发送17或18消息查询在线用户发送20消息19添加好友请求发送22,23,24消息21删除好友29退出系统发送34消息发送10消息30图3.7UDP事务处理加密加密原始数据长度版本号原始数据功能号加密后的数据长度加密后的数据数据封装成数据包发送数据图3.8发送数据的过程客户端网络通信设计客户端网络通信设计相对比较简单。客户端采用异步非阻塞的套接字,因此发送数据和接收数据是同时进行的,不会因为等待一个事件的发生而阻塞后面的操作。对应服务器的套接字,客户端也需要创建两个套接字和服务器进行通信。由于服务器的接收过程刚好是客户端的发送过程;服务器的发送过程是客户端的接收过程。因此,本文在这里只介绍构架客户端网络设计的总体框架。客户端点击登陆客户端点击登陆创建TCP和UDP两种套接字根据不同的要求发送不同的数据包接收数据并根据不同的功能号进行不同的处理发送数据接收数据图3.9客户端网络基本框架客户端的网络设计和服务器端是一一对应的,服务器根据客户端的请求做出不同的处理,同时客户端对于来自服务器的数据也做出同步的处理。

4文件传输与聊天系统网络详细设计4.1公共通信相关类以及函数描述图4.1公共通信相关类类图下面描述服务器和客户端通信用到的公用类,这些在服务器和客户端都要得到相同的实现。4.1.1CPacketCommon类该类实现网络数据包封装功能。主要方法说明:①CPacketCommon(char*_packet);这个是类的构造函数,传入的参数为要拆分的数据包。使用了这个构造函数,说明程序是为了拆分数据包。②CPacketCommon(UINT_ver,UINT_opNum,UINT_dataLen,char*_payload);这个也是类的构造函数,是对①构造函数的重载函数之一。传入参数_ver表示版本号;_opNum表示功能号;_dataLen表示数据内容的长度;_payload表示要封装的数据内容。调用该构造函数,表示程序是为了数据包的封装。③voidsplit();该函数表示拆分数据包。和①函数一起使用。④voidwrap();该函数表示封装数据包。和②函数一起使用。4.1.2MD5类该类提供数据包的MD5加密。该类主要用一个函数如下:CStringGetMD5(char*pBuf,UINTnLength);该函数提供字符数组的MD5加密。参数pBuf为要加密的字符数组,nLength为字符数组的长度,函数返回加密后的32为MD5密文,CString类型。4.1.3DES类该类提供数据包的DES加密解密功能。主要提供了两个函数:①BOOLDesEncrypt(char*in,char*out,intdatalen);该函数提供DES加密过程。字符数组in为要加密的数据,out为加密后数据存放的数组,datalen为加密数据的长度。②BOOLDesDecrypt(LPCBYTEin,LPBYTEout,intdatalen);该函数提供DES解密过程。字符数组in为要解密的数据,out为解密后数据存放的数组,datalen为解密数据的长度。4.2服务器通信类以及相关函数描述图4.2服务器通信类类图4.2.1CServerListen类该类开启监听端口接收客户端的连接并在新的线程中为之创建新的套接字。该类继承于CAsyncSocket,主要重载一个函数如下:virtualvoidOnAccept(intnErrorCode);当有连接进入的时候,调用该函数。4.2.2CTCPClient类该类继承CAsyncSocket,应用于一个新的套接字。对于CServerListen类中OnAccept连接的一个新套接字中将创建该类的一个实例,以后服务器就通过与该实例的通信进行信息的交换。该类主要重载以下函数:①virtualvoidOnReceive(intnErrorCode);该函数重载了父类的同名函数。当有数据到达的时候,触发该函数的发生。该函数里面就可以调用Receive函数来接收数据。②virtualvoidOnClose(intnErrorCode);该函数重载了父类的同名函数。当有对方客户端关闭了套接字的时候,该函数触发。该函数将关闭本套接字。③voiddataManage(char*pHeader,char*pContent);该函数进行数据的初步处理,包括数据的解密并根据不同的功能号分别调用CDataProcessing类中的相关函数进行数据库以及其他处理。参数pHeader为数据包的头部,pContent为数据内容。④boolsendData(char*pData,intnLen);该函数主要用于数据的发送。但该函数还需要实现数据内容的DES加密,并修改数据包头部的相关信息,然后再调用发送函数Send进行数据的发送。TCP中所有数据的发送都将调用该函数。pData为封装后的数据,nLen为该封装数据的长度。4.2.3UDPSession函数UINTUDPSession(LPVOIDpParam);该函数为UDP线程函数,每到达一个合法的UDP数据包请求,都将创建一个这样的新的线程。该线程里面拆分数据包并进行数据包的分析,根据不同的功能号调用CDataProcessing类中的相关函数进行数据库以及其他的网络操作。4.2.4CUDPSock类该类实现和客户端UDP数据包的通信过程。主要函数:①virtualvoidOnReceive(intnErrorCode);该函数重载了父类的同名函数。当有数据到达的时候,触发该函数的发生。该函数里面就可以调用ReceiveFrom函数来接收数据。在该函数里面对于合法每个数据包的到来将创建一个线程为之服务,线程函数是UDPSession,在这个UDPSession才进行UDP的数据处理。②voidStart(void);该函数创建UDP套接字并绑定在本地地址。③boolsendData(char*pData,intnLen,USERADDRuserAddr);该函数提供数据发送的功能。在函数里面需要对数据内容进行DES的加密。并修改相应的头部字段,然后再调用Send函数进行消息的发送。其中pData为要发送的数据包,nLen该数据包的总长度,userAddr为客户端对方的地址。4.2.5CDataProcessing类该类就是实现所有通信与数据处理之间的接口的类。无论是TCP数据还是UDP数据,经过系统的接收分析之后就进入到该类进行数据处理。该类协调着网络处理和数据库处理,每个处理都有可能和客户进行消息的通信。该类的方法特别多,在附录DataProcessing.h中提供了该类的成员函数以及相关注释。4.3客户端通信类以及相关函数图4.3客户端通信类类图4.3.1CTCPClientSock类该类继承于CAsyncSocket类,用于客户端的TCP数据包的发送和接收。在这里主要用该类实现用户的登陆和注册以及对好友列表的返回。①voidStart(void);该函数创建TCP连接并绑定本地地址,随后连接到远程服务器。②virtualvoidOnReceive(intnErrorCode);该函数重载了父类的OnReceive函数。当有数据到达系统的时候触发该函数,该函数内部就可以调用Receive函数来接收数据。③boolsendData(char*pData,intnLen);该函数提供数据发送的功能。在函数里面需要对数据内容进行DES的加密。并修改相应的头部字段,然后再调用Send函数进行消息的发送。其中pData为要发送的数据包,nLen为数据包的长度。④voiddataProcessing(PACKET_HDR*pHeader,char*pData);该函数对接收到的数据进行初步处理,分析其功能号,并根据不同的功能号码调用CClientCommon类中的不同方法进行处理。4.3.2CUDPClientSock类该类继承于CAsyncSocket类,用户客户端的UDP数据的发送和接收。在这里除了用户登陆注册以及好友列表返回,其他的操作都是用该类来处理。该类的主要方法和TCP的方法名完全一致,只不过内部处理稍有不同:voidsendData(char*pData,intnLen);voiddataProcessing(PACKET_HDR*pHeader,char*pData);voidStart(void);4.3.3CClientCommon类该类实现了网络数据处理以及客户端的界面显示。和服务器端的CDataProcessing类非常相似。从套接字类接收到的数据进入该类里面调用不同的方法进行处理。每次进行一次处理或者进行界面的显示或者将相关数据再发送给服务器。该类方法特别多,在附录ClientCommon.h中提供了该类的成员函数。4.3.4CFileTranslate类该类实现客户端之间的文件传输过程。主要实现两个方法:①voidStart(CStringfilepath);该函数为提出文件传输请求方要调用的函数。filepath为要传输的文件路径,该函数创建本地TCP套接字并处于监听状态,等待对方的连接并在对方连接后传输文件。②voidStart(CStringfilepath,CStringremoteIP,UINTremotePort);函数为文件传输的接收方调用的函数。filepath为文件要保存的位置;remoteIP为对方的IP地址;remotePort为对方端口号。该函数连接到对方的网络地址,连接成功后进行文件的传输。4.4客户端的登陆过程以及MD5加密用户在客户端的登陆过程可以说是最复杂的一个过程之一,下面介绍本文设计的安全登陆过程。当客户输入了用户号码以及密码然后点击登陆按钮请求登陆,客户端先发送一个请求随机数的数据包给服务器,发送的是功能号为32的消息,里面存放了客户登陆填写自己的号码;服务器接收到这个请求后,随机产生一个1~65535的数字N,并将该数字发送给客户端,同时服务器将该用户号码和这个随机数关联起来形成一个MAP映射(从号码可以获取随机数)。客户端接收到这个随机数后,准备形成真正的登陆验证信息,过程如下:①先将输入的密码进行一次MD5加密形成32位的密文M。②将自己的号码C,密文M,随机数N以字符串的形式连接成一个新的字符串L,即L=C+M+N,’+’表示连接的意思。③将L再进行一次MD5加密形成最后的登陆验证信息X④将自己的号码C和登陆验证信息X一起以登陆请求的方式发送到服务器。在服务器端进行如下过程:①接收到登陆请求分析出号码C和登陆验证信息X。②根据号码C读取服务器内容中的号码-随机数的MAP映射,得到随机数n。③根据号码C操作数据库读取该号码C的用户密码字段中的32位数据,该字段内容是用户在注册的时候进行了一次MD5加密的。不可能是明文保存的。获取密文m。④将号码C,密文m,随机数n以字符串的形式连接起来形成LL,即LL=C+m+n,‘+’为连接的意思⑤将LL也再进行一次MD5加密形成32为的密文XX。⑥比较X和XX是否相等,若相等表示登陆成功;否则登陆失败。以上就是登陆的全过程,很显然登陆的时候在网络上传输的密文就是经过了2次MD5加密后的数据,而且还加入了一个从服务器来的随机数的参与,要想进行密码的破解,是非常困难的。这样就保证了登陆的安全。4.5文件传输的过程文件传输是本设计主要的一个功能之一,下面介绍文件传输的过程。①发送文件方创建本地一个TCP套接字并设置为监听状态,同时将自己的号码,对方接收方的号码,自己新创建的TCP地址(包括IP地址和端口)和文件名作为一个数据包封装起来发送到服务器。②服务器接收到该数据包后提取对方接收方的号码,查询该号码的用户是否在线,若在线则将该数据包进行转发,告诉接收方文件接收的通知;若不线,不做任何处理。③接收方接收到以上数据包后,可以选择是否接收文件传输。如果不同意文件传输,则告诉服务器拒绝信息;若同意接收文件,则随即创建TCP套接字并连接到远程文件发送方,建立好连接后就可以传输文件了。④服务器若接收到接收方的拒绝文件传输的请求,则发送通知给发送方,告诉相应的拒绝消息。5文件传输与聊天系统网络设计的结果分析5.1服务器的大数据流量控制首先本文假设服务器端程序运行的硬件配置就非常高,现在从程序的角度去分析大数据流量的控制技术。⑴服务器对于每个TCP连接都将创建一个新的线程和套接字来处理,并且将套接字加入到一个类似链表的数据结构;服务器在线程中用这个套接字来与每个用户进行数据的交互。一旦客户端TCP请求完成或者结束,一定要释放该线程,并且删除链表中的套接字。⑵服务器对于每个UDP的数据包的到来都创建一个线程来处理。考虑到如果有成千上万的UDP数据包的来临可能会导致服务器的数据阻塞,但是每个数据包需要的处理时间都并不长,因此新创建的线程很可能在很短的时间内就会释放出来。假如不用线程技术来处理每个数据包,那么当有很多数据到达的时候,如果某个用户的处理时间过长,会导致后面的数据包排队等待而无法快速的响应,这样对于客户来说速度会更慢,因此使用线程技术来进行数据处理是很合理的。5.2服务器对客户端的消息中转技术分析本设计讨论的很多消息的交互都是经过服务器的处理。比如消息的发送接收、文件传输等。下面讨论该技术的特点:⑴消息内容的转发本文设计的客户端消息发送接收并不是采取P2P(点对点)的方式来进行的,换而言之,客户端给每个好友发送消息都经过了服务器的中转。考虑到消息的发送使用的是UDP技术,不需要像TCP一样建立连接后才可以发送消息,因此从用户的角度来思考的话,用户只需要将数据发送出去就可以了,用户会感觉非常的快;服务器对于用户数据只是进行简单转发一般不会做特别的处理,除非对方好友不在线。如果客户端之间采取TCP的方式来传输消息,虽然可以保证信息的完整性和安全性,但是每次打开一个聊天窗口就必须和对方建立一个TCP的连接,这对客户来说是一个负担,在时间方面也会有一定的延迟,尤其对于那些机器配置不高的客户,速度会更慢。因此采取服务器中转来进行消息的传输不失为一个好办法。⑵文件传输的分析前面讨论过文件传输的相关技术。文件传输应该是C-S-C,然后才是C-C模式,即首先客户端要和服务器交互信息,服务器分析后再告诉另一个客户端,最后才是客户端之间的文件传输。这种方式的处理也是和前面的消息传输是一致的。因为在客户端本地不会主动保存好友的网络地址,因此当一方客户想点对点的进行文件传输的时候必须通过服务器交互才能知道对方的地址。⑶其他数据的交互和中转对于其他的消息类型,比如一个客户的上线通知,状态改变等,客户端首先告诉服务器自己的消息,然后服务器将该消息进行多人转发,即将该消息告诉该客户的所有在线好友。因此服务器的中转可以说是服务器设计的核心,服务器的稳定性决定了整个系统。5.3发送数据的超时与重传处理接收数据是被动的,只要有数据到达才会触发,因此发送数据的超时处理才显得更重要,因为对于UDP的数据包来说,它是无连接的,数据不可靠,到达对方的顺序可能不相同,或者根本就无法知道自己的数据是否成功的被对方(服务器)接收到了。因此本设计考虑一种方案,每次发送一个UDP的数据包都需要得到对方(服务器)的回执,一般设定一个时间,在这个时间内如果没有收到对方的回执,那么发送方就判断这次的数据发送没有成功,需要再发送一次。一般重发3次,每次的时间间隔不一样,第一次间隔3秒,第二次间隔8秒,第三次间隔15秒,这样可以保证每次消息的传输延迟时间不会超过30秒。当经过了3次重传都没有得到回执就可以放弃该次发送消息。5.4客户端与服务器的激活消息客户端用户登陆后将发送一个激活消息给服务器告诉服务器自己的在线情况,服务器记录该用户的IP地址和UDP的端口。在以后的时间里服务器就可以通过该IP以及UDP的端口与客户端进行UDP通信。服务器每个一定的时间间隔就发送一个激活给所有在线的用户,然后在指定的时间内等待激活信息的回复。如果在该段时间内没有收到客户端的回复就可以判断客户端已经因为某种原因掉线了,随即进行修改用户在数据库中的状态。5.5程序运行情况如图所示为客户端执行的基本情况。图5.1服务器端执行界面图5.2客户端登录界面 图5.3客户端设置服务器IP界面图5.4客户端聊天界面图5.5客户端登录以后 图5.6客户端注册界面

6结论已完成的工作和结果的总结:本文设计出了文件传输与聊天系统网络构架部分,在服务器的网络数据库的支持下实现了客户端之间的即时通信,在此基础上分析了本网络通信设计的特点和新的想法。未解决的问题:⑴本设计没有考虑相关错误异常处理。当客户端提出的请求有问题或者服务器处理出现了异常的话并没有设计出相关的消息格式来通知客户端错误的发生而只是简单的被忽略了。这在后期的研究中将得到改善。⑵本设计的网络通信设计没有经过大规模的测试,即没有让多人同时上线同时发送消息,没有测试过服务器的有多大的承受能力,在后期的研究中需要经过详细的测试。⑶客户端之间的文件传输部分目前尚存在Bug,不能正常运行。文件传输部分的设计不支持断点续传的功能。⑷本设计的网络通信没有在广域网中进行过测试,很有可能在Internet中进行UDP传输的时候会出现数据包丢失的情况,这在后期需要仔细研究。⑸既然没有支持Internet上的网络传输,也不支持任何的代理和对防火墙的突破。⑹目前测试的数据量都比较小,无论是客户端还是服务器测试的数据都比较小,好友列表也不多,无法预测一旦一次传输的数据量多大的时候会出现什么样的情况,这在后期需要解决的问题。

参考文献(References)[1]史济民,顾春华等.软件工程—原理、方法与应用(第二版)[M].高等教育出版社,2002.[2]王艳平,张越.Windows网络与通信程序设计[M].人民邮电出版社,2006.[3]刘斌.面向对象程序设计VisualC

++[M].清华大学出版社,2003.[4]孙飞,林巍.VisualC++.NET入门[M].清华大学出版社,2002.[5]牛力,傅韵.VisualC++.NET编程宝典[M].电子工业出版社,2006.[6]邓全良.Winsock网络程序设计[M].中国铁道出版社,2002.[7]张健.网络程序设计[M].武汉大学出版社,2004.[8]丁展.VisualC++网络通信编程实例案例精选[M].人民邮电出版社,2004.[9]W.RichardStevens.TCP/IP详解卷1:协议[M].机械工业出版社,2000.[10]杨波.现代密码学[M].清华大学出版社,2003.[11]/;MSDNlibraryandcode.[12]MySQLAB著.MySQL5管理员标准指南及语言参考.电子工业出版社.2007.[13]MichaelKofler著.MySQL5权威指南.人民邮电出版社.2006.403-436[14]WALLACEB.MCCLURE等著.SQLSERVER2005ORACLE与MySQL基于ADO.NET2的高级编程.清华大学出版社.2007.277-296[15]贝尔著,杨涛等译.深入理解Mysql.人民邮电出版社.2010.276-289[16]Java语言与面向对象程序设计.清华大学出版社.2002,2.57-67[17]谭浩强主编.邵光雅等编著.java语言程序设计.清华大学出版社.2002.6.78-93

致谢基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论