收藏 分享(赏)

即时通讯系统的设计与实现毕业论文.doc

上传人:精品资料 文档编号:10413413 上传时间:2019-11-08 格式:DOC 页数:41 大小:370.43KB
下载 相关 举报
即时通讯系统的设计与实现毕业论文.doc_第1页
第1页 / 共41页
即时通讯系统的设计与实现毕业论文.doc_第2页
第2页 / 共41页
即时通讯系统的设计与实现毕业论文.doc_第3页
第3页 / 共41页
即时通讯系统的设计与实现毕业论文.doc_第4页
第4页 / 共41页
即时通讯系统的设计与实现毕业论文.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、 毕 业 论 文论文题目: 即时通讯系统的设计与实现专 业: 计算机应用技术 学 院: 计算机学院 年 级: 学习形式: 学 号: 论文作者: 指导教师: 职 称: 开 题 报 告论文题目: 姓名:_ 学号:_ 学院:_开题报告正文应包含以下几方面的内容:1.1 论文选题的目的和意义近年来,随着 Internet 的飞速发展,计算机网络得到了越来越广泛的应用,并且已经逐步走进千家万户。自迈入信息时代以来,距离已经不再是人们之间联络沟通的障碍,也正因为如此,人们对沟通交流的需求和依赖也越来越强烈,各行各业对信息交流的要求也越来越高。如今,通过各种即时通信软件,人们已经可以在足不出户的情况下,与远

2、距离甚至世界各地的人进行实时的聊天交流,这样的交流不仅满足了人们对交流沟通的需求,同时也给人与人之间的交流带来了极大的便捷和大量的经济节省。因此,即时通信(Instant Messaging)在人们的生活工作和学习中得到了更广泛的应用。目前,已经有不少即时通信软件在社会公众中流行,像 MSN,腾讯 QQ,新浪 UC 等,都是国内人们所熟知的知名流行即时通信软件,其技术方面也都处于国际领先水平。同时,由于即时通信软件的便利,其应用已经由最初的简单的聊天交友得到了巨大的拓展。适应各种场合的各式即时通信软件也开始出现在软件市场上,这就包括了一些与企业管理相关的即时通信软件,一个具有企业自己特色的集信

3、息管理和即时通信为一体的内部应用软件,能够使一个企业或者团队更像一个整体,同时也能够给企业的管理和信息交流带来极大的便利,在一定程度上提高工作效率。同样的,对于软件设计与开发的行业来说,过去的那种仅适用于 PC 机上的应用程序的开发已经远远不能满足市场的多样化的需求,网络程序的广泛应用和广大需求使学习与掌握与网络相关的编程技术显得尤为重要。本论文将结合一个具体的局域网即时通信系统的开发编写,以现有的各种技术,介绍讲解网络 IM 软件开发中的重要知识,并讨论其中关键环节的技术问题和各种解决方案和设计策略1.2 相关技术知识简介1.2.1 基于 SOCKET 的网络编程SOCKET 在英文中的意思

4、是插座,在网络编程中,其实际意义可以理解为网络通信连接的插座,通常称之为套接字。如果将网络连接的各终端类比为电话,则 SOCKET 即相当于电话线插座,为各终端提供或者创建与其他终端通信连接的桥梁或通道。所有的终端都必须接通此“插座” 来完成与其他终端的连接或通信,否则,它将独立于网络之外。由此可以知道知道,SOCKET 是终端间建立连接的核心对象。那么,对于一个 SOCKET 对象,它到底具备什么样的功能呢?通常,用 WINSOCK 库来创建和使用 SOCKET,运用 WINSOCK 库的基本API,就可以实现简单的数据输入和输出(即发送数据和接受数据) 。在创建一个 SOCKET 对象后,

5、通过指定 IP 地址来确定该 SOCKET 与哪台机器发生交流,通过指定机器端口号(一般为 1024 以上)确定与该机器上哪个应用程序进行交流。在确定了交流对象后,便可以使用 SOCKET 与对象机器上的应用程序进行数据的传输和信息的交流。在面向连接的网络通信中,还必须使用 SOCKET 进行连接的监听和创建,只有创建了稳定的连接后,才开始进行数据的传输。由于交互方式的不同,SOCKET 也分为两种,一种是无连接的数据报形式的,一种则是面向连接的流式套接字,这也是接下来两小节要阐述的内容。1.2.2 UDP 协议与 TCP 协议的简单介绍UDP 协议是一个简单的面向数据报的运输层协议:进程的每

6、个输出操作都正好产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。这与面向流字符的协议不同,如 TCP,应用程序产生的全体数据与真正发送的单个 IP 数据报可能没有什么联系。UDP 不提供可靠性:它把应用程序传给 IP 层的数据发送出去,但是并不保证它们能到达目的地,其过程可以比做投递信件,它只关心信件确实投放到信箱,至于对方是否正确、按时收到信件,UDP 并不关心。尽管 TCP 和 UDP 都使用相同的网络层(IP),TCP 却向应用层提供与UDP 完全不同的服务。TCP 提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用 TCP 的应用(通常是一个客户和一个服务器)在

7、彼此交换数据之前必须先建立一个 TCP 连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“ 喂” ,然后才说明是谁并与之开始对话。1.2.3 WINSOCK 套接字 API 调用的简单流程本论文所要讨论的即时通信系统则是通过 WINSOCK 库的应用来设计和实现基于 TCP 的 C/S 结构的网络即时通信程序。这里,用图的方式简单的表示出对 WINSOCK 库提供的 API 函数调用过程。面向连接的流方式调用过程如图 1-1 所示。 调用 WSAStartup()初始化 SOCKET调用 socket()创建 SOCKET调用 bind()指定通讯端口调用 listen()设置等待连接

8、状态调用 accept()接收连接并生成会话 socket调用 send 和 recv 进行通讯会话调用 closesocket 关闭会话 socket调用 WSAStartup()初始化 SOCKET调用 socket()创建 SOCKET调用 accept()接收连接并生成会话 socket调用 send 和 recv 进行通讯会话调用 closesocket 关闭会话 socketSERVER 端 CLIENT 端图 1-1 面向连接的流式通信过程面向无连接的数据报方式的调用过程如图 1-2 所示调用 WSAStartup()初始化 SOCKET调用 socket()创建 SOCKET调

9、用 sendto 和 recvfrom 进行通讯会话调用 closesocket 关闭会话 socket图 1-2 面向无连接的数据报过程从图中可以看出,面向连接的流方式更能适应 C/S 结构系统的非对称结构的实现。1.3 论文的主要工作与章节安排本论文旨在设计一个面向企业内部的功能实用、性能良好的即时通信系统,并对其中关键模块做详细的分析和实现的说明。在系统的设计和实现中,要突出系统的模块化,各模块间相对独立,通过模块间的接口交互工作,使整个系统层次、模块清晰。在数据传输方面,要注意数据的封装,使数据尽可能结构化,保持良好的一致性。根据上述要求,论文中详细阐述了系统的设计方案和关键模块的的实

10、现方法,主要工作如下:(1)在确定系统结构后,根据系统相关需求妄称对系统功能的设计和分析,并对应系统功能做出用户信息数据的设计,详细说明数据库表项的设计。(2)对 CLIENT 与 SERVER 端的通信协议做详细的设计,并对协议数据包的结构的定义做出详细的阐释。(3)对系统中网络传输模块的设计做详细的说明,阐述网络传输模块在系统中的工作流程以及该模块的实现方案。(4)结合系统整体结构,说明系统在功能实现上的逻辑处理过程(选择最主要的功能如登陆认证和聊天消息收发),并展示系统部分功能实现后的运行结果。按照上述的工作内容叙述,本论文共分 5 章来分别阐述有关问题,各章节安排如下:第一章介绍论文背

11、景、项目的意义、项目相关技术知识以及论文主要工作。第二章对系统结构的分析做简单的介绍,针对系统的定性对其功能做详细的设计和分析,并设计出与系统功能相关的数据信息内容。第三章详细介绍 C/S 系统中 CLIENT 与 SERVER 端之间的通信协议,并说明在系统实现过程中,该数据包结构以及部分协议内容定义。第四章设计并分析系统中的核心模块网络传输管理模块,对模块中重点对象的设计做详细的说明,并介绍该模块的实现策略,以及其在系统中的工作流程。第五章介绍系统整体的结构模型,包含系统中各个模块中的对象,说明系统实现关键功能即登陆认证、聊天消息收发等的逻辑处理流程。并展示系统运行过程中的部分截图。2 系

12、统的结构与功能设计2.1 系统结构的选择和设计2.1.1 系统通讯模式的选择在前面,已经分别介绍了基于 UDP 和 TCP 的两种即时通信系统的基本模式。在两者相比之下,由于 TCP 协议能够很好的提供数据传输的可靠性,并在面向连接的环境下提供更丰富的网络通信服务。而且,在面向连接的环境下,更有利于对网络应用终端的实时管理,为使用客户提供更加便捷可靠的网络服务。所以,在网络通信模式上,倾向于基于 TCP 的面向连接的流式通讯模式。2.1.2 集中式与分布式系统概述在目前的网络通信系统中,对于连接节点的管理有集中式和分布式两种管理模式。对于集中式的管理模式,系统的数据存储和管理以及各功能在网络连

13、接上的对应操作,都集中在网络管理节点上进行处理和实现,即由单一服务器来完成网络数据的集中管理。集中式网络管理模式最大的优点就是便于集中管理各端连接,易于实现,维护工作较为简单。但是,由于管理信息全部集中汇总到管理节点上,这就使得在通信高峰期会造成信息流拥挤,这对管理节点处的机器处理效率有很高的要求。另外,由于所有的信息管理都依靠于一台服务器,当管理节点发生故障时,整个网络系统都将停止工作。分布式管理模式,则是将网络管理客户机与一组服务器进行交互作用,由多个服务终端来共同协作完成对网络信息的管理。由于有多个服务端协同工作,集中式容易造成信息流拥挤、服务器负荷太大的问题可以得到很好的解决。同时,在

14、多服务器的环境下,服务端之间的分工设计可以由设计人员灵活设计,系统的可伸缩性,扩展性也较为良好。一般来说,采用的较多的则是多层管理或者服务器集群等技术方式。2.1.3 系统的结构设计本论文所要讨论的系统是一个供中小型企业内部使用的带有简单人事管理功能的局域网即时通信系统,由于要存储并管理用户相关信息的数据,同时要限制普通用户对数据信息的管理权限,比较合适的设计是采用 C/S 模式的系统架构,数据由数据库进行存储,由服务器对数据库进行直接操作,而客户端则通过对服务器发出请求得到相应的数据或者告知服务器对数据库进行何种操作。为了确保数据正确可靠地传输,系统采用面向连接的 TCP 协议作为数据传输模

15、式。通过上一小节对集中式网络管理和分布式网络管理的简单介绍,已经对两种管理模式有了初步的了解,可以看出,在对于功能繁琐多样,客户终端数量庞大的系统,分布式系统能够很好的减轻单个服务器的负载,以提高服务器管理网络连接的效率,为用户提供稳定而流畅的网络服务。而对于本系统,由于定性为面向中小型企业,且是基于局域网内部的小型即时通信服务系统,其同时连接的客户终端本身极其有限,另外,本系统的功能也是集中针对于用户信息的管理和简单的实时通信交流,在这样的情况下,选择分布式系统则显得有些大材小用,并可能会造成开发成本上的浪费,而选择集中式管理模式则更有利于集中管理和系统的简化,同时,单一服务器的结构也相对于

16、多服务器的结构更容易进行维护工作。综上所述,本论文要论述的系统系统将使用基于 TCP 的集中式管理的 C/S结构模型。在这个结构中,所有的数据信息都将由一个服务器程序进行统一的管理,对数据信息内容的各种相关操作也只能由服务器程序直接进行完成。客户端要获得数据信息或完成某操作,必须通过服务器的验证,正确建立连接后,向服务器发送请求,服务器则根据客户端的请求代劳完成对数据信息的相应操作并向客户端回馈数据信息。图 2-1 表示了系统大大体层次和结构模型。系统数据库服务器客户终端 客户终端 客户终端图 2-1 基于 TCP 的集中式 C/S 系统结构2.2 系统功能设计本系统的使用对象为中小型企业,拟

17、订要完成的主要功能为实时聊天会话功能,以及与之伴随的用户信息管理,并包括网络即时通信的相关通行功能。在扩展方面还应当加入固定群组会话与临时会话组等功能,进阶功能还包括文件传输,语音、视频对话等高阶功能。2.2.1 系统网络连接功能设计对于一个网络即时通信系统而言,由于本系统采用基于 TCP 的集中式 C/S结构,必须具备一些与网络连接相关的通用功能,无论系统的最终用途是什么,这些功能都是必不可少的,其中包括:(1)客户端登陆验证功能此功能用于用户使用客户端于服务器建立稳定连接,成功登陆是用户使用系统的先行条件。客户端在连接上服务器后最先要做的就是将用户输入的 ID 和密码发送给服务器,服务器将

18、收到的 ID 和密码与数据库中内容进行对比,符合则通过验证继续维持该连接,否则将返回错误信息并断开此连接。(2)心跳功能客户端应该在一定时间间隔内向服务器发送心跳信息,以告知服务器该客户端连接的活动状态,以便于服务器管理客户连接,如果超过时间间隔,服务器未收到某连接上的客户端的心跳信息,则自动认为该客户端网络异常或已经掉线,断开与其之间的连接。(3)客户登出与登陆功能对应,客户可以主动断开与服务器之间的连接。这里需要注意的是,直接关闭客户端并不一定能够保证连接安全断开,未断开连接直接关闭可能会造成网络异常。2.2.2 用户信息相关功能设计由于在该系统中,包含着很多于用户相关的数据信息,这些信息

19、存放在服务器数据库中,并且用户会经常对这些信息进行即时查看或者修改更新,所以,与此相关的功能也是本系统中必须具备的基本功能,主要分为以下几个功能:(1)部门信息查看和管理在当今很多分工管理的中小型企业中,一个部门就是一个整体,部门之间往往都有着明确的分工,部门人员配置、职能也都各不相同,系统提供用户这样的功能能够使用户更便捷管理和了解企业中各个部门。(2)员工信息查看和管理与部门信息相比,作为一个即时通信系统,用户信息的查看和管理自然是必不可少的,用户可以通过此功能来查看自己或他人的详细信息,对自己的信息也可以做任意修改,我相信,任何一个即时通信系统都不会缺少这个功能。(3)人事调动管理功能这

20、个功能可以说是本系统相对于其他即时通信软件来说所特有的。由于有了此功能的设计,本系统中规定所有用户的注册工作全部由具有人事管理权限的用户通过此功能加入,同时,除个人详细信息外,所有用户与客户企业相关的信息也全部由有一定权限的用户来通过此功能设定或者修改。这样一来,此功能的加入使得该系统更具有针对性、专业性,为客户企业提供一个完善的管理交流平台,与平时常见的个人聊天软件有着本质上的区别。2.2.3 传输交流相关功能设计作为一款即时通信系统,正常的聊天交流功能当然是重中之重,在本系统中,此方面的功能基本上也都是传承了当今流行的即时通信软件的一些流行功能,简要介绍如下:(1)文字消息传输功能本功能是

21、即时通信中最简单的传输功能,也是最主要最常用的功能之一。同时,本系统中,此功能除了包含通常的个人聊天外,还包含临时会话即会议聊天,以及固定群组聊天信息,甚至邮件消息等。传输的主要内容也都是文字、字符信息。这个功能也是开发第一阶段里所用功能中最先进行开发和使用的。(2)表情功能此功能是模仿当今社会上所流行的多种即时通信软件,在文字消息的基础上添加默认表情的功能,而且通过字符转义来完成,这样就可以直接在文本消息的传输的基础上同时做到表情的显示。(3)文件传输功能由于现在不少企业单位都开始用计算机做为必备的办公工具,各种各样的文件大多数都是以电子文档的形式存放在工作计算机里,此功能的加入无疑给使用客

22、户提供了便捷的文件传阅途径。在该功能的支持下,各个客户终端间可以向对方发送本地机器中的任何格式的文件。为企业中电子文件的传阅省时省力,提高工作效率。(4)高级功能即扩展功能该部分主要包括了邮件收发,文件上传,以及多媒体实时传输(其中包括实时语音或视频聊天等) 。由于此功能对技术要求稍高,同时需要扩展服务器数据库容量,在中小型企业中需求也并不是那么明显,将作为第二期项目功能扩展进行实现,本论文中将不会提到这部分的设计和实现。2.3 数据信息及数据库设计在该系统中,需要在服务器中存储的数据信息主要包括员工信息和部门信息两个方面,在员工信息方面,又包含个人信息和工作相关信息两个方面,其中,个人信息是

23、用户可以在获得登陆帐号后自行修改的,而工作相关信息只能由具有人事管理权限的用户通过人事管理功能来进行修改。下面将结合本系统的数据库设计,介绍系统中包含的主要用户信息数据。公司职员员工ID姓名 生日 登陆密码签名 简介加入时间权限公司部门属于职位描述部门 ID名称简介上级部门ID固定群组属于群内身份群号 ID简介进入方式在线状态联系邮箱手机号码性别图 2-2 系统数据库 E-R 关系图上面图 2-2 所示即为系统中用户信息数据的 E-R 关系图,接下来将以此 E-R 图来进行数据表的设计,按照数据表来创建系统服务器数据库数据。以下便是针对上述 E-R 建立的数据表(表中属性名后带* 表示该项为外

24、键):(1) 员工信息表如表 2-1 所示表 2-1 员工信息表列名中文别名 属性名 数据类型长度主键允许为空员工 ID s_id Varchar No名称员工用户名 s_userName Varchar No姓名 s_name Varchar No生日 s_birth Data登陆密码 s_pass Varchar签名 s_sign Varchar简介 s_intr Varchar加入时间 s_data Data No联系邮箱 s_email Varchar手机号码 s_phoneNumber Varchar性别 s_sex int员工状态 s_state int No(2) 权限查询表如表

25、 2-2 所示表 2-2 权限查询表列名中文别名 属性名 数据类型长度主键允许为空员工 ID s_id* Varchar No权限 s_right int No(3) 部门信息表如表 2-3 所示表 2-3 部门信息表列名中文别名 属性名 数据类型长度主键允许为空部门 ID d_id Varchar No名称 d_name Varchar No简介 d_intr Varchar上级部门 ID d_super* Varchar(4) 员工部门关系表如表 2-4 所示表 2-4 员工-部门关系表列名中文别名 属性名数据类型 长度 主键允许为空员工 ID s_id* Varchar No部门 ID

26、d_id* Varchar No职位描述 sd_desc Varchar(5) 群组信息表如表 2-5 所示表 2-5 群组信息表中文别名 属性名群 ID g_id Varchar No名称 g_name Varchar No简介 g_intr Varchar进入方式 g_state int No(6) 员工群组关系表如表 2-6 所示表 2-6 员工-群组关系表列名中文别名 属性名数据类型 长度 主键允许为空员工 ID s_id* Varchar No群 ID g_id* Varchar No群内身份 sg_degree int No2.4 本章小结在本章中,介绍了系统整体结构的大致模型,并

27、结合系统所针对的用户做了功能上的分析。通过对当今较为流行的系统模型的比较,在结构上,采用了基于 TCP 协议的集中式 C/S 模式,并对其进行了较为详细的描述。同时,根据系统的使用用户 以 及 需 求 , 设 计 出 了 一 与 寻 常 的 IM 系 统 相 比 更 具 有 特 色 具 有针 对 性 、 专 业 化 的 功 能 。 在 功 能 设 计 的 同 时 , 依 据 实 现 功 能 所 需 要 的 信 息 , 构造 了 系 统 的 数 据 库 模 型 以 及 用 户 的 数 据 库 信 息 。 为 整 个 系 统 的 性 质 和 功 能 做 了整 体 的 概 括 和 描 述 。 在 接

28、 下 来 的 章 节 中 , 将 围 绕 如 何 实 现 这 些 系 统 功 能 进 行 系统 的 设 计 和 实 现 方 案 的 描 述 。3 IM Client 与 IM Server 之间的通讯协议3.1 数据收发方式与数据结构的设计和定义3.1.1 数据收发方式的设计在 IM 中,所有功能的实现必须依靠客户端与服务端之间的数据通信来完成。在此,需要定义一个协议,让客户端与服务端之间按照定义的协议来进行数据通信,而不是杂乱无章的任意的数据收发。首先,按照一般惯例,将要发送的数据做成数据包的形式来进行传输,并且分为请求包和应答包。所有的操作都首先由客户终端发送请求包给 server 端,s

29、erver 对终端的请求进行相应的处理(可能访问数据库)后将结果作为应答包的一部分返回给客户终端,终端通过解析应答包来得到 IM server 的回应并继续执行相应操作。在进行通讯及运行任何其他的 command 之前需要进行连接认证。所有的操作都有“ 请求 应答” 的模式来进行,其过程如图 3-1 所示。client server DB库库库库库库库库图 3-1 请求应答顺序图3.1.2 通信协议数据包结构定义由于需要进行传输的数据以及客户端与服务端之间的通信数据的类型是多样化的,必须将种类繁多的数据,以尽可能相同或者相似的结构进行封装,否则,多样化的信息交互和数据传输将给实现功能和代码的编

30、写带来巨大的麻烦和极其烦琐复杂的工作。同时,数据的多样化使得各个数据包的长度将不相一致,甚至某些数据包的长度大小将是动态可变的,而在 SOCKET 网络编程中,每一次数据的接收和发送都是需要确定长度的。为此,设计出这样一种方案:将端与端之间一次要发送的数据包分离为两个部分,称为包头和包体,包头中包含有该数据包的相关属性信息,由于只是包含数据包属性而非真正的数据,所以,包头的长度可以是固定不变的。而包体中,则是真正传输的数据所在,数据接收方根据包头中提供的信息得知包体中数据内容的类型,从而针对不同类型的包体做相应的接收和解析工作。图 3-2 表示出了数据包的大致结构特征。数据包包头包体内容包括:

31、包类型(请求、应答) ,操作码,返回码,发送方 ID,接收方 ID,包体长度等等其中为相应类型的数据,请求的内容,回应的数据等等,根据数据包的作用和类型不同而不同,长度可变图 3-2 C/S 通信协议数据包结构示意图3.2 通信协议数据包在实现过程中的定义3.2.1 数据包包头定义如图 3-2 所示,数据包的包头如同人的大脑一般重要,其中包含着该数据包所有的相关属性,能否正确接收变长的包体,解读包中的数据,将其转化为有用的信息,都取决于包体内容的正确解析。在此,将请求包和应答包的包头统一起来,设计出一个一致可行的结构,其实现代码如下:typedef struct data_packetchar

32、 m_nMajorType;char m_strServiceCode;char m_strOperationCode;char m_nReturnCode;int32 m_nUseless;int32 m_nSendID;int32 m_nRecvID;int32 m_nPacketLength;其中,每个字段的说明如下表,表后有请求包和返回包的具体说明,如表 3-1所示。表 3-1 字段说明表名称 长度(byte) 说明m_MajorType 1区分 IM 和 Mail 的消息IM:0x01Mail:0x02为二期开发邮件功能所留m_strServiceCode 1 服务名m_strOpe

33、rationCode 1 命令名,具体定义见m_nReturnCode 1 返回值m_nUseless 4 协议扩展m_nSendID 4发送者的 ID下面的是特殊 ID0 服务器m_nRecvID 4接收者 ID,下面的是特殊 ID0 服务器m_nPacketLength 4 包体数据长度总长 20每个终端请求包中:m_MajorType 字段用来区分不同的服务类型,现阶段只使用 0x01 作为 IM的类型,将来可能会增加 0x02 作为:PushMail 的类型。m_strServiceCode 用于区分不同的服务,如认证服务,命令服务等。m_strOperationCode 用于区分同一

34、服务类型中不同的操作,如认证服务中包括登陆请求,断开连接两个操作。设计服务和操作有助于今后的扩展。m_nReturnCode 由应答包使用,请求包将不使用。m_nPacketLength 表示数据包体的长度,以便收取方缺定整个包的长度。每个服务器应答包中:m_MajorType,m_nFunctionCode ,m_nSourceCode,以及m_strOperationCode 将不使用,只是将请求包的对应值复制到应答包。m_nReturnCode,供终端判断请求是否执行成功,具体定义见下:#define RT000 0 /operate sucessful#define RT001 1 /

35、deal moudle not found#define RT002 2 /invalid terminal type#define RT003 3 /invalid signal name#define RT004 4 /no data#define RT099 99 / socket error #define RT100 100 / general errorm_nPacketLength 同请求包。服务器每次收到客户请求后,将更新用户当前状态,便于服务器判断用户在线情况。3.2.2 数据包包体定义包体的定义实际上则为各类通信的通信数据的定义,由于通信数据种类繁多,在本论文无法将全部定义

36、写出,这里仅通过登陆验证和用户信息获取两个用例的协议数据包定义来阐释数据包具体的定义方式,其他操作相关的数据包包体定义与之类似。1)用户登陆认证服务Socket 在 connect 后,发送认证包:m_MajorType 为0x01,m_strServiceCode 为 0x01, 包体中存放 32 字节的认证码,前 20 字节为用户 ID,后 32 字节为 MD5 后的密码,如果通过校验,则用户可以继续进行接下来的工作;否则,服务器将 close 掉 socket。如果连接后没有发送校验包,超时也将断掉连接。下面将分别介绍在代码实现中如何定义请求包和应答包:(1)请求包定义其包头中的属性设置

37、为:m_MajorType = 0x01;m_nServiceCode = 0x01;m_nOperationCode = 0x01;m_nPacketLength = 52; 包体结构的定义如下:typedef struct data_loginchar m_nUserName 20; /用户名(20bytes)char m_nPassword32; /密码 md5 值(32bytes ) DATA_LOGIN;(2)应答包定义应答包的包头中,除了 PacketLength 包体长度和 ReturnCode 返回码以外,其他的都与请求包相同。在应答包中,m_nPacketLength = 4

38、,ReturnCode 则用来标识认证是否通过,具体返回码可以参见 2.1 中的内容。包体中则是认证后返回给客户端的对应用户的 ID 码,如果认证失败,返回的 ID 码为 0,程序将关闭其 SOCKET 其结构定义如下:m_nPacketLength = 4;typedef struct data_back_loginuint32 m_nStaffID; DATA_BACK_LOGIN;2)获取用户详细信息客户端通过发送请求包,告知服务器要进行获取信息的操作以及需要获取何用户的信息,以 ID 号标识用户。此操作的 MajorType 为 0x01,ServiceCode为 0x02,Opera

39、tionCode 为 0x28,包体长度为 4,仅包含要请求的用户信息对应的 ID。以下为该协议请求包和应答包结构定义的关键实现代码:(1)请求包定义其中,包头中关键属性设置为:m_nMajorType = 0x01;m_nServiceCode = 0x02;m_nOperation = 0x28;m_nPacketLength = 4;包体的结构定义如下:typedef struct data_getInfoint32 m_nStaffID; DATA_GETINFO;(2)应答包的定义同其他应答请求包一样,包头中的m_nMajorType,m_nServiceCode,m_nOperat

40、ion 这三个标识操作类型的属性在请求包和应答包中是对应相等的。而作为应答包,另一个重要的关键属性就是ReturnCode 的值,以此来告知请求方服务端对其请求的响应结果。此应答包包体包含内容为对应请求包包体中 ID 号的对应用户的全部详细信息。结构定义代码如下:Typedef struct staff_infoInt32 m_nStaffID; /员工 IDInt8 m_nStaffNameLen;Char m_nStaffNameMAX; /员工姓名Int8 m_nEmailLen;Char m_nEmailMAX; /联系邮箱Int8 m_nPhoneLen;Char m_nPhoneM

41、AX; /手机号Int8 m_nAddressLen;Char m_nAddressMAX; /联系地址Byte m_nSex; /性别(0 男 1 女)Byte m_nDateTime8; /加入时间(YYYYMMDD)Byte m_nBirthday8; /出生年月(YYYYMMDD)Byte m_nUserState; /用户在线状态,0 表示在线 1 表示不在线 STAFF_INFO3.3 本章小结本章主要介绍了本系统在 TCP 模式下具体的数据传输办法,详细设计出了系统 C/S 结构下 Client 端与 Server 端之间进行网络传输的通信协议。并在通信协议数据包中,以三个常见的

42、典型功能作为示例论述了协议包的设计和实现方案。4 网络数据传输控制模块的设计与实现4.1 异步套接字与多线程同步介绍4.1.1 SOCKET 的阻塞方式在 SOCKET 网络编程中,WinSocket 基本 API 的 socket 函数通常是以阻塞方式进行的,即在执行数据收发过程的时候,程序线程会在收发过程完成之前阻塞,只有在完成了当前数据收发工作后,才会执行其他指令,这样一来,接收数据、发送数据、处理数据、逻辑过程等都无法同步进行,在频繁的网络数据传输过程中,各种传输工作以及处理工作都有可能同时发生,无法同步显然会造成用户使用过程中过多的等待,给用户操作带来极大的不良感觉。在这样的情况下,

43、必须通过自行创建额外线程来辅助程序主线程的工作,以多线程同步的方法来解决阻塞方式数据传输带来的不良影响。为此,除了主线程外,每一次数据接收、数据发送、数据处理等工作都将分别单独占用一个线程,以此来完成数据接收发送以及处理的同步工作。图 4-1 所示即为多线程控制下的数据传输同步过程的示意图。线程启动处理线程线程启动发送线程由线程函数参数获得数据信息调用 SEND发送数据反馈发送结果(成功与否)关闭线程由线程函数参数获得数据包信息线程启动接收线程等待接收到来的数据接收数据将收到的数据做为参数创建处理线程线程随主线程关闭解读数据包分析数据按照数据完成相应操作线程关闭线程启动功能初始化等待用户操作指

44、令根据用户指令创建请求发送线程线程关闭程序结束主线程图 4-1 多线程实现数据传输同步过程4.1.2 异步套接字的使用在 WinSock 库中,本身也提供了一种基于消息的非阻塞式数据传输方法,称为异步套接字。在异步套接字中,无论数据的接收或发送工作是否完成,函数都会立刻返回。这也是为了支持 Windows 的消息驱动机制,使开发者能够更方便的处理网络通 信 , 同 时 也 有 利 于 提 高 应 用 程 序 的 性 能 。 在 异 步 套 接 字 中 , 操作 系 统 会 监 听 程 序 中 登 记 的 网 络 事 件 消 息 , 当 有 网 络 I/O 事 件 发 生 时 , Windows

45、系 统 会 给 应 用 程 序 窗 口 发 送 相 应的消息加入主线程消息循环列表中,应用程序则根据消息内容进行相关操作。CAsyncSocket 是 MFC 对异步套接字的一个简单封装,其中包含了创建socket、建立连接、发送接收数据、对应消息响应等成员函数,本系统就是通过由 CAsyncSocket 自行派生异步套接字类来创建自己的网络传输管理对象。以此方式来避免多线程同步中带来的一些较为棘手的问题。4.2 网络传输管理模块的设计与实现4.2.1 数据包缓冲区的定义在系统中,创建一个数据缓冲区来存放即将要发送的数据或者刚刚接收到的数据,在缓冲区中,所有类型的数据包都以字节流的形式存放在缓

46、冲区中。在此,对缓冲区还要进行封装,构造一个提供按字节读取数据的 READ 接口和将数据按字节写入的 WRITE 接口的缓冲区对象,同时,为了该对象与网络传输模块进行良好的洽接,还为该对象加入将其中数据写出发至网络或者将网络中发来的数据写入缓冲区的功能。下面是程序中对缓冲区对象类的定义源代码:class CBufferpublic:CBuffer();virtual CBuffer();/初始化,申请空间,由长度参数确定缓冲区实际大小bool Init(uint32 len);/关闭,所有成员置空置void Shutdown();/将数据写入缓冲区uint32 Write(int8 * buf

47、,uint32 len);int32 SocketSend(CIMSocket * socket); /将m_buf中的数据发送到指定的 SOCKET上int32 SocketRecv(CIMSocket * socket); /在指定的 SOCKET上接收数据,放入m_buf中,返回缓冲区的读标记位int8 * GetBuffer(); /获得缓冲区数据空间的首地址指针uint32 GetSize(); /获得缓冲区的长度大小int8 ReadChar();/读取一个字节并做为char类型数据返回uint8 ReadByte();/读取一个字节以无符号整形返回int16 ReadShort(

48、); /读取两个字节以带符号数返回uint16 ReadWord(); /读取两个字节以无符号数返回int32 ReadInt(); /读取四个字节以带符号形式返回uint32 ReadDword(); /读取四个字节以无符号形式返回int64 ReadLongLong(); /读取八个字节以带符号形式返回uint64 ReadULongLong(); /读取八个字节以无符号形式返回/读取一定长度的数据以String类型返回结果void ReadString(std:string void ReadString(int8 * buf,uint32 len);protected:bool Rea

49、dData(int8 * buf,uint32 bytes);public:int8 * m_pBuf; /缓冲区数据存放空间的地址指针uint32 m_nLen; /缓冲区长度,用来动态申请缓冲区空间uint32 has_writen; /已写标记uint32 has_read; /已读标记;这个缓冲区的对象将作为每一个网络会话管理对象的一个成员,专门负责数据的 I/O 工作。4.2.2 会话管理对象的定义为实现网络传输层的良好封装,在系统中设计一个会话管理对象来负责完成网络传输的工作,并设计其与系统逻辑层的接口。下面,首先通过图 4-2 来看一下这个会话管理对象的类视图,再依次分析其中的成员

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报