QQ软件详细设计_第1页
QQ软件详细设计_第2页
QQ软件详细设计_第3页
QQ软件详细设计_第4页
QQ软件详细设计_第5页
已阅读5页,还剩270页未读 继续免费阅读

下载本文档

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

文档简介

第1章基于VisualBasic的软件项目设计

L6软件文档

http:〃act.it.sohu.com/book/serialize.php?id=434

软件开发越来越复杂,软件功能也越来越丰富。而几乎所有成熟的商业软件,都是一个开发团队齐心协力的血汗?

1目管理的成败是控制开发成本的关键环节。这里少不了贯穿其中的重要步骤一一软件文档。

C档可以分为开发文档和产品文档两大类。

C档包括以下内容。

《功能要求》一一来源于客户要求和市场调查,是软件开发中最早期的一个环节。客户提出一个模糊的功能概念,§

/一个实际问题,或者参照同类软件的一个功能。有软件经验的客户还会提供比较详细的技术规范书,把他们的要,

台写在文档中,必要时加以图表解说。这份文档是需求分析的基础。

《需求分析》一一包括产品概述、主要概念、操作流程、功能列表和解说、注意事项、系统环境等。以《功能要求》

E行详细的功能分析(包括客户提出的要求和根据开发经验建议的功能),列出本产品是什么,有什么特殊的概念,1

旨分类,需要具备什么功能,该功能的操作如何,实现的时候该注意什么细节,客户有什么要求,系统运行环境的要

勺功能描述与以后的使用手册是一致的。

《技术分析》一一包括技术选型、技术比较、开发人员、关键技术问题的解决、技术风险、技术升级方向、技术方案

寸手技术分析等。以《需求分析》为基础,进行详细的技术分析(产品的性能和实现方法),列出本项目需要使用什/

为什么,有哪些技术问题要解决,估计开发期间会碰到什么困难,技术方案以后如何升级,对本项目的技术有什/

《系统分析》一一包括功能实现、模块组成、功能流程图、函数接口、数据字典、软件开发需要考虑的各种问题等。I

亍》为基础,进行详细的系统分析(产品的开发和实现方法),估计开发期间需要把什么问题说明白,程序员根据0

开始在项目主管的带领下进行编码。

《界面文档》一一包括软件外观、界面素材、编辑工具、文件名、菜单、按钮和其他界面部件的要求,这里与软件5

亍界面是一致的。

项目总结》一一包括项目简介、项目参与人员和开发时间、项目风险管理过程、项目功能列表、项目结构特点、

才项目的升级建议、对以后的项目的建议、人员素质情况等。

C档包含以下内容。

《产品简介》一一包括公司背景、产品概念、适用范围、产品功能、功能特点、运行要求和公司联系地址。

《疑问解答》一一列出用户关心的问题和处理方法。用于解答软件的操作功能和解决用户的疑难问题。

《功能介绍》一一以《需求分析》为书写基础,包括软件介绍、软件结构、功能列表、功能描述和公司联系地址。

技术白皮书》一一以《技术分析》为书写基础,包括功能实现、技术选型、关键技术问题的解决、技术方案特点、

亍向等。

《安装手册》一一包括系统环境、运行平台、产品安装过程、初始环境设置、安装记录等。

《使用手册》一一包括产品简介、功能列表、功能描述和解释、功能操作、客户服务和联系方式等。

《维护手册》一一包括产品简介、初始环境设置、系统配置、数据管理和备份、技术问题解答和联系方式等。

第2章企业信使软件

2.1企业信使软件的介绍

R业都希望尽量增进内部员工之间的交流,而且希望这种交流能够省时、方便、充分。

即使是传统企业,也开始使用计算机管理日常工作,更不用说现在的高科技企业了,计算机成了工作的必需装备,

子域网和互联网应用已经普及,为充分利用网络这个载体来互相交流提供了条件,如E-mail、公司内部论坛等等。

F为企业员工之间的交流又提供了一个新的手段,它是一个可以自定义的网络信息传递软件,能即时发送信息,当又

上信息也不会丢失。除了提供发送信息的功能外,还提供了用户分组、表情符号、信息提示等多种辅助功能。

目软件的设计、编程、测试前,为了让读者对该软件有个总体的认识,首先介绍一下该软件的特色和功能。

L企业信使软件的特色

氮吏软件是一个即时信息发送软件,用于辅助用户之间完成信息的交流。它具有以下几个特色。

组机制

三用户分成两个组一一“好友”和“黑名单”,对列入“黑名单”的用户的消息是拒收的。

息的人性化

H业信使软件发送消息时,可以使用如下的表情符号。

)回。②勺♦❷少调学学与,3«»单动工10审》旨二三国

上可以发送图文并茂的信息。

古意:在一次消息发送过程中,只能使用一个图标,否则就会报告消息过长。

息的安全性

自信息后,如果对方没有在线,那么服务器会保留信息,等到对方上线后会自动发送给对方,这样可以防止信息丢:

息的即时提醒

k到信息后,操作系统上的状态栏图标就会不停闪烁,提示用户收到了新的消息。用户处理完新的消息后,图标就专

2企业信使软件的功能

乳更软件的功能分为两大类一一客户端功能和服务器端功能。

年功能L即时消息收发功能

F运行过程中,可以给指定的用户发送即时消息,如图2-1所示。

剃攵到其他用户发送给自己的消息,操作系统状态栏上的图标就会不停地变化以提示用户,如图2-2所示。

/栏图标上单击鼠标右键,就会弹出一个菜单,如图2-3所示。

"显示新消息”菜单项可以显示用户收到的新消息,如图2-4所示。

」企业信使I

-Rm8:49区4。8:52

毯野a星期五如星期五

《力2004-6-4(•)2004-5-4

图2-1发送即时消

图2-2

栏图标提示用户

显示新消息

显示历史消息

发送消息

退出

图2-3弹出菜

2-4新收到的消息

友新消息,就会自动将该消息从新消息队列中删除,并且添加到历史消息中。

常功能2:历史消息查询功能

」端会保留用户收到的历史消息,在状态栏的图标上单击鼠标右键,在弹出的快捷菜单中单击“显示历史消息、”菜一

也示历史消息,如图2-5所示。

图2-5历史消息

年功能3:留言功能

土方不在线,用户同样可以发送消息。该消息会保存在服务器端,对方登录服务器后,服务器会自动发送消息给对:

年功能4:多用户功能

一个客户端上,允许多个用户同时登录并使用,由客户端软件来协调各个用户之间的数据存取。

指功能5:人机界面功能

寺使客户端的主界面如图2-6所示。

图2-6主界面

'菜单”可以启动如图2-3所示的菜单;单击“离线”(或“上线”)按钮可以切换客户端是否在线;单击“黑名单”

1户设定的黑名单;单击“我的好友”可以显示用户设定的好友名单。

乳更在运行的过程中,在操作系统的状态栏上会增加一个图标,并且该图标在用户收到新的消息时会不停地变换。

昌端功能1:监测用户状态

?器端,不但可以看到所有用户的注册信息,还可以实时地看到用户的在线状态(通过Status字段的值),如图2-7

导端功能2:显示用户留言

考个用户给另外一个不在线的用户发消息、,那么就会在服务器端作为留言记录下该条信息,如图2-8所示。

图2-7服务器端

图2-8服务器端的留言

3企业信使软件的客户定位

上针对下面这样的客户群。

外一企业内的办公人员。

H业规模较大或经常需要异地办公的IT人士。

争望使用自己的聊天软件的固定交往群体。

工些客户都具有一些共同点:那就是即时信息对他们都具有非常重要的意义,而且由于使用了独特的企业信使软件,

了以得到更大的保障

第2章企业信使软件

2.2系统设计与选型

『面的介绍,读者对企业信使软件已经有了总体上的认识,下面开始介绍该软件的设计过程和开发细节。

L了解用户需求

攵件,也许源于公司的需要,也许是受人委托,无论哪种情况,充分了解用户的需求才能开发出好用的软件。

三工作以前,先充分了解用户的需求才能最终满足该软件用户的需求,这样才可能避免在软件开发过程中进行一而I

勺改动,耗时耗力,增加了成倍的工作量。

更多软件公司不仅自行开发商业软件,还有一个重要的业务就是“接项目”一一应客户的需求开发软件。项目开发至

软件已经成形,内部测试后就演示给客户,往往这时候麻烦来了,麻烦产生的原因一般都是在于用户的需求发生:

一开始对软件的功能往往只有初步的认定(甚至只是初步的意向),只有具体的东西真正放在面前时,他才可能会关注

m出流程不是这样的,应当还具备什么样的功能等等,或者报表的形式如何如何。

(远是这方面的专家。所以,在进行系统设计前一定要充分与用户交谈,了解用户的行业、行业术语、日常业务、{

E看以往的书面报表等等。尤其要注意的是如果用户以前也使用计算机管理,一定要研究以前使用的管理软件,为彳

不好的地方在哪方面,需要保留的好的方面是什么,这样才能在系统设计时尽可能提供详细的设计说明书。

1户需求很可能产生变动,所以增量迭代(incrementalanditerative)的方法确实值得推广,但是这又涉及到一彳

乏的问题,因为由此会提高对Architect的能力要求,而且需求管理和测试更加要求严格。

k性质的软件,更是要充分调查潜在消费者的需求,然后确定软件的功能和风格等等,错误的市场定位必然导致软系

攵。由此可见,了解用户需求是多么重要。

企业信使软件,用户的基本需求如下。

1户登录功能:只有注册过的用户才能使用该软件发送和接受信息。

斤用户注册功能:注册新用户。

旨够添加好友,并显示在好友名单中,

旨够在好友名单中选择一个好友,给好友即时发送信息;

名送的信息中可以带有表情符号。

4好友不在线时信息存储在服务器,也就是可以给其留言。

刍收到信息时要求有提示,避免错过及时查看信息。

旨够存储历史信息,一边查看以前的信息。

购多将某些人添加到黑名单,能自动屏蔽黑名单中的人发送来的信息,避免被骚扰。

力能集中,所以看起来很简单。即使如此,由于绝大多数项目没有足够的时间或资源实现每个功能,所以需要决定W

公要的,哪些是重要的,这些是需求开发的主要部分。只能由客户负责设定需求优先级,因为开发者不可能按照客尸

工需求优先级。尽管没有人愿意看到自己所希望的需求在项目中未被实现,但毕竟是要面对现实,业务决策有时不?

匕级来缩小项目范围,或在质量上寻求折中。

,信使软件来看,最重要的需求一般是第1、2、4项。

2软件工具的选型

考虑可能的解决方案。例如,使用何种开发工具,信息存储使用传统的文件系统还是数据库,使用何种方式进行R

I常至少应该考虑下述几类可能的方案。

E成本的解决方案:系统只能完成最必要的工作,不能多做一点额外的工作。

」等成本的解决方案:这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具f

乌功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在2

目是很有价值的。

于成本的“十全十美”的系统:这样的系统具有用户可能希望有的所有功能和特点。

》权衡各种方案的利弊的基础上,选择一个较好的系统(最佳方案)。本例企业信使软件的主体开发环境选择的是Vi

6.0(SP6),搭配的是ADO技术调用Access数据库,选择的理由如下。

:软件的技术难度不是很大,但是需要实现的细节功能比较多,所以选择一个相对比较容易使用的开发工具有利于*

口在软件的功能本身,而不是开发工具的使用,所以选择VisualBasic6.0(SP6)中文版作为开发环境。

E服务器端需要利用数据库记录用户的留言信息,在客户端需要利用数据库记录用户接受到的新消息和历史消息。i

F构成很大的数据量,所以不需要采用MSSQLServer等大中型数据库,而采用ADO控件可以非常方便调用的Acce

到微软的网站上给VisualBasic安装补丁SP6后,使得本软件的开发工作节省了不少力气,否则ImageCombo控聿

Io

3功能分析

打吏软件的客户端功能细分如下。

E状态栏的状态栏区上显示图标。

E主界面中通过菜单调用新消息处理界面。

E主界面中通过菜单调用历史消息处理界面。

I过状态栏图标可以调用菜单,并且以动画形式醒目地提示用户收到了新消息。

1ADO控件读写包含rtf文档的数据库。

、在线用户发送即时消息。

、不在线用户发送留言消息。

刍息中可以包括图标和文本。

丁以设置消息文本的颜色和字体。

为联系人分组。

屏蔽黑名单的信息。

乳更软件的服务器端功能细分如下。

三界面中显示所有用户的注册信息。

三界面中显示所有用户的在线状态。

也示所有的留言信息。

存时修改用户的注册信息。

朋寸修改留言信息。

I模块分工设计

支计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次哙

3绘软件的结构。

、项目中,包含两类软件模块——窗体模块和Module模块,如图2-9所示。

,块结构图,各窗体的分工如下。

客户端”主窗体:显示客户端主界面。

登录”窗体:已经注册过的用户直接登录,或者激活注册向导。

"注册向导1"窗体:已经注册过的用户仍然可以通过这里直接登录,没有注册过的用户可以进入注册向导2。

“注册向导2"窗体:输入注册用户的信息并且连接服务器获得用户ID。

"新消息处理”窗体:显示用户接收的新消息,并且在其中可以将新消息转移到历史消息中。

"历史消息处理”窗体:显示用户接收到的所有消息,并且在其中可以进行删除操作。

"消息发送”窗体:给指定用户发送消息。

支务器主窗体:显示服务器主界面。

lule模块的分工如下。

三模块:获取程序中公用的参数,并且决定启动“客户端”主窗体。

D存索引模块:从配置文件中读取信息(好友名单和黑名单)到内存中、将数组中存储的信息存储到配置文件中。

尺态栏操作模块:为状态栏添加图标、删除图标、改变图标等。

本除件S目

图2-9模块结构图

第2章企业信使软件

2.3网络协议的设计⑴

布中服务器软件、客户端软件之间的协作完全依赖网络通信,通信信息采用ASCH码明文传送,这样对不同类型的类

另一的方式。

古意:本系统中,服务器的IP地址已经固化在客户端的程序中——192.168.0.1,如果服务器的IP地址不是192.168.0.1,请在“名

FrmClient的FormLoad事件中修改。

导息总体格式定义如下。

命令号(Integer)命令内容(String)

彳固定占有3个字符的空间,内容的具体格式与命令有关。

『绍了定义的一些基本命令,需要时扩充。

1申请新用户的命令

拿一个新用户

才令号:001

1容:”用户昵称;用户密码;用户的电子邮箱地址”

W接受新用户的申请

士令号:002

,容:“用户ID”

W拒绝新用户的申请

上令号:003

1容:”新用户申请失败的原因”

!个命令的处理流程如图2-10所示。

图2To001、002、003命令处理流程

2信息处理的命令

,端读取指定用户的信息

上令号:101

1容:“用户ID”

&指定用户的信息

上令号:102

1容:“用户ID=用户昵称;用户电子邮箱地址;用户表情”

M发送指定用户的信息

上令号:103

1容:“读取用户信息出错信息”

三个命令的处理流程如图2-11所示。

।-------------------101(读取摄定用户的格息)----------

I---------------

<、AE匏益二>103(柜班发送报运用户的信息L客户端

x__]

1----------------102(发送抵运用户的信息)--------1

图2Tl101、102、103命令处理流程

I设置好友的命令

导添加一名好友

方令号:121

1容:“客户ID:好友ID”

々添加好友的申请

上令号:122

1容:“好友ID=好友昵称;好友电子邮箱地址;好友表情”

自添加好友的申请

上令号:123

1容:“拒绝接受申请的理由”

三个命令的处理流程如图2-12所示。

I------------------121(由话■添加-名好友)----------

I

既外器7—123(拒绝港加好友的奉询一*客户端

Y__I

1-------------------122(极受港加好友的电请)---------1

图2-12121、122、123命令处理流程

I与登录相关的命令

W服务器

F令号:151

1容:”用户ID;用户密码”

F登录服务器

上令号:152

1容:“用户ID=用户昵称;用户电子邮箱地址;用户表情”

M登录服务器

上令号:153

1容:”拒绝登录的原因”

三个命令的处理流程如图2-13所示。

151(登录展务部)------------

服务黔)--------153(拒绝变承展务格)------客户选

I________________152(允许登柔服外部)

图2-13151、152、153命令处理流程

5设置黑名单的命令

导添加一名黑名单

士令号:161

1容:“客户ID:黑名单ID”

七添加黑名单的申请

上令号:162

,容:“黑名单ID=黑名单昵称;黑名单电子邮箱地址;黑名单表情”

£添加黑名单的申请

上令号:163

1容:”拒绝接受申请的理由”

三个命令的处理流程如图2-14所示。

161(由诗潘加一名取名羊)---------

163(拒绝添加黑名能的由南一客户端

162(接受添加黑名故的中请)-------

图2T4161、162、163命令处理流程

5获取消息的命令

克务器获取留言

方令号:200

1容:“”

卜器发送消息给用户

方令号:204

1容:”发送消息的用户ID①发送消息的时间②消息内容③发送消息的用户ID①发送消息的时间②消息内容③…”

囱个命令的处理流程如图2-15所示。

图2-15200、204命令处理流程

第2章企业信使软件

2.3网络协议的设计⑵

2.3.7发送消息的命令

1.发送消息给服务器

(1)命令号:201

(2)内容:”接收消息的用户ID=消息内容”

2.不能成功地发送消息给指定用户

(1)命令号:203

(2)内容:“用户ID=消息内容;失败原因”

以上两个命令的处理流程如图2-16所示。其中204命令号在2.3.6节中已做了

描述。

图2-16201、203、204命令处理流

第2章企业信使软件

2.4数据环境的设计

首先分析本系统所需要存储的数据。在服务器端,需要存储用户信息,以进行用户登录、注册新用户,为用户

之间的交流提供平台。

在服务器端,由于需要接收客户端发送来的消息,并根据自定义的网络协议解析消息的含义,做出相应的处理,

例如,将接收到的消息发送给指定用户,所以还需要存储服务器工作记录。

在客户端,需要存储接收到的新消息和看过后保存起来的消息。

综上所述,本系统中需要设计两个基于Access的数据库,分别存储在服务器端和客户端应用程序路径下面,

服务器端的文件名为Users,mdb,客户端的文件名为Data.mdb。

另外还需要为客户端设计一个ini文件,文件保存在客户端应用程序路径下面,用来记录好友名单和黑名单,

文件名为Users,inio

2.4.1服务器端Users,mdb的结构

Users.mdb仅仅用于在服务器端。

首先用Access创建数据库Users,mdb,并且为该数据库添加一个表Userslnformation,在Userslnformation

表中有6个字段,见表2-L

表2-1UsersInformation表的字段

字段名数据类型

UserID数字

Password文本

NickName文本

Mail文本

Status数字

UserFace数字

其中UserID字段用于存储用户ID,Password字段用于存储用户密码,NickName字段用于存储用户的昵称,

Mail字段用于存储用户的邮箱地址,Status用于存储用户的在线状态(0为离线,1为在线),UserFace用于

存储用户选择的头像索引。

然后再为该数据库添加一个表Messages,在Messages表中有4个字段,见表2-2。

表2-2Messages表的字段

字段名数据类型

ReceivedID数字

SentID数字

Content备注

Time日期/时间

其中ReceivedID字段用于存储发送消息的用户ID,SentID字段用于存储接收消息的用户ID,Content字段用

于存储消息内容,Time字段用于存储服务器接收到消息的时间。

经验总结:Content字段设置为备注类型,就可以存储图文混排的消息内容了。

2.4.2客户端Data,mdb的结构

Data,mdb仅仅用于在客户端。

首先用Access创建数据库Data,mdb,并且为该数据库添加两个表NewMessages和HistoryMessages,在

NewMessages和HistoryMessages表中都有4个字段,并且它们的字段设置相同,见表2-3。

表2-3NewMessages表和HistoryMessages表的字段

字段名数据类型

ReceivedID数字

SentID数字

Content备注

Time日期/时间

其中ReceivedID字段用于存储发送消息的用户ID,SentID字段用于存储接收消息的用户ID,Content字段用

于存储消息内容,Time字段用于存储服务器接收到消息的日期/时间。

2.4.3客户端Users,iini的结构

Users,ini文件仅仅用于客户端记录联系人的信息,它是一个文本文件,典型的文件内容如下:

[1001_Friends]

Count=2

[1001_Friends_Item0]

UserID=1000

UserNickName=1000

UserMail=0

UserFace=4

[1001_Friends_Iteml]

UserID=1002

UserNickName=haha

UserMail=h

UserFace=5

[1002_Friends]

Count=l

[1002_Friends_Item0]

UserID=1000

UserNickName=1000

UserMail=0

UserFace=4

[1002_Badboys]

Count=l

[1002_Badboys_Item0]

UserID=1001

UserNickName=1001

UserMail=l

UserFace=6

举例来说:[1001_Friends]下面代表用户ID为1001的总体好友信息,Count记录了好友的数目。

[1001_Friends_Item0]下面存储了用户ID为1001的第1个好友的信息,如好友ID、好友昵称、好友邮箱以

及好友的头像索引。

[1002_Badboys]下面代表用户ID为1002的总体黑名单信息,Count记录了黑名单的数目。

[1002_Badboys_Item0]下面存储了用户ID为1002的第1个黑名单的信息,如黑名单ID、黑名单昵称、黑名

单邮箱以及黑名单的头像索引。

经验总结:本软件中通过ini文件存取数据量很小的程序参数,非常方便。通过Access数据库可以存取数据量很大的

图文混排的消息。

第2章企业信使软件

2.5各个功能模块的创建⑴

由于各个功能模块之间并不是完全独立的,有父子关系的,有交互关系的,所以在这里按照

图2-17所示的顺序介绍各个功能模块。

图2-17各个功能模块的介绍顺序

2.5.1服务器端主窗体frmServer

新建一个工程,将工程的名称设置为“服务器”,工程的文件名为prjNetChatServer.vbp,为

该工程添加一个窗体frmServero

向服务器端主窗体frmServer上添加两个Frame控件(Name属性分别为fraUsers>

fraMessages)>两个DataGrid控件(Name属性分别为dgdUsers>dgdMessages)>两个Adodc

控件(Name属性分别为adoUsers>adoMessages)>一个RichTextBox控件(Name属性为

rtfMessage)>一个Winsock控件(Name属性为wskServer)和一个Timer控件(Name属性为

tmrOnline)。

设计完成的服务器端主窗体如图2-18所示。

各控件的主要属性设置如下。

(1)tmrOnline控件的Interval属性设置为lOOOo

(2)wskServer控件的Index属性设置为0,Protocol属性设置为O-sckTCPProtocol,RemotePort

属性设置为50400o

(3)dgdUsers控件的DataSource属性设置为adoUserSo

(4)dgdMessages控件的DataSource属性设置为adoMessageso

(5)rtfMessage控件的DataSource属性设置为adoMessages,DataField属性设置为Contento

各控件的作用如下。

(1)fraUsers控件提供了一个框架容器,它包含dgdUsers和adoUsers控件。

(2)adoUsers控件用来读取Userslnformation表的内容。

⑶dgdUsers的DataSource属性设置为adoUsers,它用来显示adoUsers控件读取到的内容,

也就是Userslnformation表的内容。

(4)fraMessages控件提供了一个框架容器,它包含adoMessages>dgdMessages控件和

rtfMessage控件。

(5)adoMessages控件用来读取Users.mdb数据库中Messages表的内容。

(6)dgdMessages的DataSource属性设置为adoMessages,它用来列表显示adoMessages控件

读取到的内容,也就是Messages表的内容。

⑺rtfMessage控件:显示在dgdMessages控件中选中行(留言)的具体内容。

(8)tmrOnline控件的Interval属性设置为1000,也就是每隔1秒钟就刷新在线用户数目。

1.服务器的初始化

在服务器工作过程中,首先执行Form_Load过程,设置adoMessages、adoUsers控件的属性,

使得它们分别读取Users.mdb数据库中Messages>Userslnformation表的记录。

读取Users.mdb数据库中Messages表的记录:

Me.adoMessages.ConnectionString=z,Provider=Microsoft.Jet.OLEDB.4.0;〃&_

“Per

sistSecurityInfo=False;"&_

〃Dat

aSource="&APPPATH&"Users.mdb〃

Me.adoMessages.CommandType=adCmdTable

Me.adoMessages.RecordSource="Messages”

Me.adoMessages.Refresh

读取Users.mdb数据库中Userslnformation表的记录:

Me.adoUsers.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;〃&_

“Persist

SecurityInfo=False;"&_

“Data

Source="&APPPATH&"Users.mdb〃

Me.adoUsers.CommandType二adCmdTable

Me.adoUsers.RecordSource="Userslnformation”

Me.adoUsers.Refresh

adoMessages>adoUsers都为Adodc控件,其ConnectionString属性设置要连接的数据源(数

据库),需要提供数据源的类型、存储路径和名称等。

对于Access2000数据库,Provider应为Microsoft.Jet.OLEDB.4.0o

DataSource设置为"&APP.PATH&“Users.mdb”则数据库的存储路径为当前应用程序目录,

数据库文件名称为User.mdbo

adoMessages控件的RecordSource属性设置为Messages,则说明adoMessages控件的记录源

为User.mdb数据库中的Messages表。

服务器初始化的时候,还需要对窗体上的wskServer控件进行初始化。该控件的Index属性

设置为0,这也就是说wskServer实际上是一个控件数组,通过以下语句设置wskServer数

组中第1个控件元素的属性,并且处于Listen状态,等待客户端的连接:

IfMe.wskServer(0).State<>0Then

Me.wskServer(0).Close

EndIf

Me.wskServer(0).LocalPort=50400

Me.wskServer(0).Listen

同时设置LinkCount全局变量的数目为0,它表示已经成功连接到服务器的客户端的数目:

LinkCount=0

由于在服务器开始运行阶段,不可能有客户端进行连接操作,所以设置所有用户为离线状态:

'如果adoUsers.Recordset.EOF和adoUsers.Recordset.BOF都为真

'说明没有任何用户所以跳出此过程

IfMe.adoUsers.Recordset.EOFAndMe.adoUsers.Recordset.BOFThenExitSub

'移动记录指针到最后一条记录

Me.adoUsers.Recordset.MoveLast

'移动记录指针到第1条记录

Me.adoUsers.Recordset.MoveFirst

'从第1条记录开始遍历所有记录并设置Status字段值为0

WhileNotMe.adoUsers.Recordset.EOF

Me.adoUsers.Recordset.Fields(zzStatusz/).Value=0

Me.adoUsers.Recordset.MoveNext

Wend

2.接受客户端的连接

如果有客户端连接到服务器,那么就会激活wskServer的wskServer_ConnectionRequest事件

过程:

PrivateSubwskServer_ConnectionRequest(IndexAsInteger,ByVairequestIDAs

Long)

'错误处理

OnErrorResumeNext

LinkCount=LinkCount+1

LoadwskServer(LinkCount)

wskServer(LinkCount).LocalPort=0

wskServer(LinkCount).AcceptrequestID

EndSub

程序首先将连接到服务器的客户端的数目加1,然后通过Load方法为wskServer控件数组添

加一个新的Winsock控件元素,并且通过wskServer(LinkCount).AcceptrequestID语句设置这

个新控件元素专门对应这个客户端的连接。

第2章企业信使软件

2.5各个功能模块的创建(2)

3.服务器与客户端的数据交互

服务器与客户端的数据交互是frmServer窗体编程的重点,也是本软件的重点之一,服务器端接收到客户端数据后,处理的流

程如下。

(1)接收客户端发送的数据并存储在strReceived变量中。

(2)从strReceived变量中分析出客户端发送的命令号和命令内容,分别存储在变量intCommandID和strCommandContent中。

(3)根据intCommandID变量的值,按照不同的规则分析命令内容,并且做出响应。

下面介绍实现服务器与客户端数据交互的主要代码。如果服务器接收到数据,就会激活wskServer_DataArrival过程,首先通

过以下语句接收客户端发送的数据并存储在strReceived变量中:

wskServer(Index).GetDatastrReceived

strReceived变量分析出客户端发送的命令号和命令内容,分别存储在变量intCommandID和strCommandContent中:

‘存储命令号

DimintCommandIDAsInteger

intCommandID=Vai(Left(strReceived,3))

‘存储命令内容

DimstrCommandContentAsString

strCommandContent=Mid(strReceived,5)

由于命令号占3个字节,所以使用Left(strReceived,3)获得strReceived变量的前3个字符即可取得命令号,再使用Vai将取得

的命令号由字符转换为数字。

然后根据不同的命令号,按照不同的规则分析命令内容,并且做出响应:

SelectCaseintCommandID

'申请一个新用户

'命令号:001

'内容:〃用户昵称;用户密码;用户的电子邮箱地址〃

Case1:

'取指定用户的信息

'命令号:101

‘内容:"用户ID”

Case101:

‘申请添加一名好友

'命令号:121

‘内容:"客户ID:好友ID”

Case121:

'登录服务器

'命令号:151

‘内容:”用户ID;用户密码”

Case151:

'申请添加一名黑名单

'命令号:161

‘内容:"客户ID:黑名单ID”

Case161:

’从服务器获取留言

'命令号:200

‘内容:""

Case200:

'发送消息给指定用户的申请

'命令号:201

‘内容:"用户ID=消息内容”

Case201:

EndSelect

对于服务器与客户端进行交互的处理过程已经很清楚了,现在就以对注册新用户的命令为例,介绍处理数据的流程。

申请一个新用户的命令号为001,命令内容为“用户昵称;用户密码;用户的电子邮箱地址”,所以,当命令号为001时,首先

获取用户昵称并存储,代码如下:

DimstrNickNameAsString

intPos=InStr(1,strCommandContent,vbBinaryCompare)

strNickName=Left(strCommandContent,intPos-1)

在代码中,首先定义变量strNickName用来存储用户昵称,然后获取命令内容中符号第1次出现的位置,根据符号

第1次出现的位置就可以确定用户昵称在命令内容中的位置,从而获得用户昵称并保存在strNickName变量中。

获取用户密码的代码如下:

'从命令内容中去掉用户昵称部分仍然存储在strCommandContent变量中

strCommandContent=Mid(strCommandContent,intPos+1)

'获取用户密码

DimstrPasswordAsString

intPos=InStr(1,strCommandContent,〃;〃,vbBinaryCompare)

strPassword二Left(strCommandContent,intPos-1)

在代码中,首先从命令内容中去掉用户昵称部分存储在strCommandContent变量中,此时strCommandContent变量中存储的命

令内容为“用户密码;用户的电子邮箱地址”,然后使用与获得用户昵称同样的方法,就可以获得用户密码并存储在strPassword

变量中。

获取用户电子邮箱地址的代码如下:

strCommandContent=Mid(strCommandContent,intPos+1)

'获取用户电子邮件

DimstrMailAsString

intPos二InStr(1,strCommandContent,〃:vbBinaryCompare)

strMail=Left(strCommandContent,intPos-1)

strCommandContent=Mid(strCommandContent,intPos+1)

取得新用户的详细信息后,为新用户的UserID字段准备值:

DimintUserlDAsInteger

intUserlD=1000+Me.adoUsers.Recordset.RecordCount

添加新用户:

Me.adoUsers.Recordset.AddNew

Me.adoUsers.Recordset.Fields(,zUserID,z).Value=intUserlD

Me.adoUsers.Recordset.Fields("Password").Value=strPassword

Me.adoUsers.Recordset.Fields(〃NickName〃).Value二strNickName

Me.adoUsers.Recordset.Fields(,/Mail,/).Value=strMail

Me.adoUsers.Recordset.Fields(,zStatusz/).Value=1

Me.adoUsers.Recordset.Fields(〃UserFace〃).Value二strCommandContent

保存并更新:

Me.adoUsers.Recordset.Save

Me.adoUsers.Recordset.Update

发送申请新用户成功的消息给客户端:

wskServer(Index).SendData〃002:〃&CStr(intUserlD)

对其他各个命令的处理方法请参见后面的详细代码

第2章企业信使软件

2.5各个功能模块的创建(3)

4.客户端断开连接

如果客户端断开与服务器的连接,那么就会激活wskServer的wskServer_Close事件过程:

PrivateSubwskServer_Close(IndexAsInteger)

OnErrorResumeNext

'向数据库中写入客户的状态信息

IfwskServer(Index).Tag<>〃〃Then

'移动记录指针到第1条记录

Me.adoUsers.Recordset.MoveFirst

’查找断开连接的用户

Me.adoUsers.Recordset.Find〃UserID=〃&wskServer(Index).Tag

’将该用户的Status设置为0

Me.adoUsers.Recordset.Fields(^Status^).Value=0

EndIf

UnloadwskServer(Index)

EndSub

程序首先向数据库中写入客户的状态信息一一设置Status字段的值为0,然后通过Unload

方法从wskServer控件数组中删除关闭的Winsock控件。

5.服务器断开同客户端的连接

当服务器停止运行时,就会主动断开所有与客户端的连接:

PrivateSubForm_Unload(CancelAsInteger)

DimwskTempAsWinsock

ForEachwskTempInMe.wskServer

wskTemp.Close

Next

EndSub

本模块(frmServer.frm)的详细代码如下:

’设置所有变量必须声明

OptionExplicit

'定义LinkCount变量用来记录已经成功连接到服务器的客户端的数目

DimLinkCountAsInteger

'定义APP_PATH变量用来存储应用程序目录

DimAPPPATHAsString

PrivateSubForm_Load()

'如果应用程序目录的最后一个字符为'则APP_PATH变量直接为App.Path的值

'否则APP_PATH变量为App.Path的值加上'

IfRight(App.Path,1)二〃\〃Then

APP_PATH=App.Path

Else

APP_PATH=App.Path+〃\〃

EndIf

'通过属性设置使adoMessages控件读取Users,mdb数据库中Messages表

Me.adoMessages.ConnectionString=_

“Provider=Microsoft.Jet.OLEDB.4.0;〃&_

Per

sistSecurityInfo=False;"&

Dat

aSource=〃&APP_PATH&"Users.mdb〃

Me.adoMessages.CommandType二adCmdTable

Me.adoMessages.RecordSource="Messages”

Me.adoMessages.Refresh

'通过属性设置使adoUsers控件读取Users,mdb数据库中UsersInformation表

Me.adoUsers.Connectionstring="Provider二Microsoft.Jet.OLEDB.4.0;〃&_

“Persist

SecurityInfo=False;"&_

“Data

Source=〃&APPPATH&"Users,mdb”

Me.adoUsers.CommandType=adCmdTable

Me.adoUsers.RecordSource二,ZUsersInformation/z

Me.adoUsers.Refresh

'对wskServer控件进行初始化

'设置wskServer数组中第1个控件元素的属性并且处于Listen状态

'等待客户端的连接

IfMe.wskServer(0).State<>0Then

Me.wskServer(0).Close

EndIf

Me.wskServer(0).LocalPort=50400

Me.wskServer(0).Listen

LinkCount=0

’设置所有用户为离线状态

IfMe.adoUsers.Recordset.EOFAndMe.adoUsers.Recordset.B0FThenExitSub

Me.adoUsers.Recordset.MoveLast

Me.adoUsers.Recordset.MoveFirst

WhileNotMe.adoUsers.Recordset.EOF

Me.adoUsers.Recordset.Fields(z,Status,z).Value=0

Me.adoUsers.Recordset.MoveNext

Wend

EndSub

PrivateSubForm_Unload

温馨提示

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

评论

0/150

提交评论