InteliIM 1.0 设计文档 - 概要设计和详细设计(修订)

1.概要设计和详细设计

1.1.总体设计描述
首先,为了使用客户端,必须正确配置好服务器的 IP 地址和端口号。当然,在客户端使用过程中可以随时修改服务器配置,并重新登陆。

用已有的用户名和密码登陆服务器,若没有用户名,可以使用“注册新用户”对话框注册一个;若配置没有问题而且服务器工作正常并处于运行状态,则可以得到登陆结果消息。

若由于各种原因,比如输入的密码错误或者服务器处于非正常运行状态或者网络没有正确配置好,登陆出现失败,客户端会显示“登陆失败”的提示信息。

若登陆成功,客户端会显示来自服务器的欢迎信息,接着客户端请求当前已登陆的用户所拥有的联系人分组信息,当返回联系人分组信息后,客户端再依据所包含的联系人 ID 集合获取相关联系人的资料概要,以便在客户端显示出来。

你可以通过“修改用户资料”对话框来修改服务器上存储的用户个人信息。

在使用过程中,用户可通过简单的拖放操作实现联系人在联系人分组之间的自由移动,当把联系人从好友分组拖放到黑名单中或从陌生人分组拖放到好友分组等时,会得到相应的确认信息。当分组信息修改时,客户端会自动同步服务器里当前用户的联系人分组数据。

当你由于就餐,外出等原因而无法正常使用软件时,可以通过改变其联系人状态来通知所有在线好友。

当联系人上线,下线以及其他状态改变时,客户端均可收到相应的提示信息,用户可以根据需要设置是否显示这些提示信息。

不管联系人的状态如何,我们都可以向他发送即时文本消息,当他在线时则可以立即收到这些消息并按照主观需要给予答复;当他不在线时则当他下次成功登陆时可以收到这些消息。

但是为了减轻服务器端的数据存储压力,我们不可以向离线的联系人发送大数据量的消息,比如文件传输。

我们还可以通过搜索联系人功能查找所有用户,你如果输入空的查找字符串,系统则会返回所有的用户的资料摘要以及他们的在线状态。当然,你如果输入非空的查找字符串,系统则会按照正则表达式规则返回匹配的用户以及他们的相关数据。你还可以根据需要把搜索到的用户添加为好友,查看他们的详细资料。


1.2.流程图
1.2.1.用户注册

1.2.2.用户登录

1.2.3.用户注销

1.2.4.联系人状态改变

1.2.5.私有聊天

1.2.6.文本广播

1.2.7.文件传输

1.2.8.添加好友

1.2.9.删除好友

1.2.10. 搜索联系人

1.2.11. 服务器状态改变


1.3.类设计的总体结构
该项目采用 Visual Studio.NET 2003 简体中文版开发,共有 8 个子项目,分别为客户端,公共模块,多媒体,多媒体 SDK, 服务器,用户界面,客户端安装程序,服务器安装程序

程序的核心模块均包含在公共模块里,下面我们来看一下核心模块(Common)的类结构示意图:


1.4.数据集的设计
在工程前期,由于没有采用数据集概念,而是用自定义类来实现数据的载入和保存。后来运用 .NET Framework ADO.NET 数据集(DataSet)进行数据的表示,处理,查询和保存,使得不管使用数据库存储数据,还是直接用 XML 文件直接存储数据都变得极其方便。

1.在线用户表

名称
 描述
 类型
 
Id
 用户名
 string
 


2.用户表

名称
 描述
 类型
 
Address
 地址
 string
 
Age
 年龄
 Int
 
City
 城市
 String
 
Country
 国家/地区
 String
 
Description
 个人简要描述
 String
 
Email
 电子邮件
 String
 
Face
 头像编号
 Int
 
Gender
 性别(男 true, 女 false)
 Bool
 
GraduateSchool
 毕业院校
 String
 
HomePage
 个人主页
 String
 
Id
 用户名
 String
 
Mp
 移动电话
 String
 
Name
 真实姓名
 String
 
NickName
 昵称
 string
 
Occupation
 职业
 String
 
Password
 密码
 String
 
Phone
 固定电话
 String
 
Province
 省份
 String
 
ZipCode
 邮政编码
 String
 
No
 编号
 Int
 


3.消息表

名称
 描述
 类型
 
Content
 内容
 string
 
Id
 消息编号
 int
 
To
 接收者用户名
 string
 
Viewed
 接收者是否已经查阅
 bool
 


4.联系人组表

名称
 描述
 类型
 
Owner
 该联系人组信息拥有者ID
 string
 
Data
 包含数据的XML 文档文本
 string
 


1.5.消息定义
在本系统中,所有消息均继承于 Org.InteliIM.InstantMessage 类,它的属性列表如下:

名称
  描述
  类型
 
From
  发送该消息的用户名
  string
 
To
  接收该消息的用户名
  string
 


该消息还定义了两个方法以实现串行化:

名称
  描述
 
Serialize()
  串行化
 
Deserialize(string text)
  反串行化
 


按照通讯双方的地位不同,可分为客户端与服务器端之间的消息 Org.InteliIM.CSInstantMessage以及客户端与客户端之间的消息 Org.InteliIM.P2PInstantMessage。

下面我们按照首字母排列顺序和分类介绍各消息的定义:

1.5.1.聊天
1.5.1.1. 文本广播消息 MessageBroadcast
名称
 描述
 类型
 
Subject
 主题
 string
 
Content
 内容
 string
 


1.5.1.2. 私有文本聊天消息 MessagePrivateChat
名称
 描述
 类型
 
Content
 内容
 string
 


1.5.2.测试连接
1.5.2.1. 测试连接消息 MessageTestConnection
1.5.2.2. 响应测试连接消息 MessageTestConnectionReply
1.5.3.联系人管理
1.5.3.1. 返回符合指定条件的联系人名单消息 MessageContactList
名称
 描述
 类型
 
Contacts
 联系人列表
 UserSummaryCollection
 


1.5.3.2. 联系人状态改变通知消息 MessageContactStatusChanged
名称
 描述
 类型
 
Id
 状态改变的联系人用户名
 string
 
Status
 改变后的联系人状态
 ContactStatus
 


1.5.3.3. 获取联系人资料消息 MessageGetContactInfo
名称
 描述
 类型
 
Id
 联系人用户名
 string
 


1.5.3.4. 获取联系人资料结果消息 MessageGetContactInfoResult
名称
 描述
 类型
 
Contact
 用户信息
 User
 


1.5.3.5. 获取指定联系人集合的资料摘要消息 MessageGetContacts
名称
 描述
 类型
 
Ids
 联系人用户名集合
 StringCollection
 


1.5.3.6. 获取符合指定条件的联系人名单消息 MessageSearchContacts
名称
 描述
 类型
 
ToSearch
 需要搜索的字符串
 string
 


1.5.3.7. 设置联系人状态消息 MessageSetStatus
名称
 描述
 类型
 
Status
 联系人状态
 ContactStatus
 

1.5.4.文件传输
1.5.4.1. 文件传输数据消息 MessageFileTransfer
名称
 描述
 类型
 
FileName
 传输的文件名称
 string
 
No
 顺序号
 int
 
Cancel
 是否取消
 bool
 
Begin
 是否为传输开头
 bool
 
End
 是否为传输结尾
 bool
 
Buffer
 文件传输数据
 Byte[]
 


1.5.4.2. 邀请文件传输消息 MessageInviteFileTransfer
名称
 描述
 类型
 
FileName
 传输的文件名称
 string
 


1.5.4.3. 邀请文件传输应答消息 MessageInviteFileTransferReply
名称
 描述
 类型
 
FileName
 传输的文件名称
 String
 
Ok
 对方是否接受
 bool
 


1.5.5.好友管理
1.5.5.1. 添加好友消息 MessageAddFriend
名称
 描述
 类型
 
RequestContent
 请求内容
 string
 


1.5.5.2. 添加好友结果消息 MessageAddFriendResult
名称
 描述
 类型
 
Ok
 是否成功
 Bool
 
FailedReason
 添加好友失败的原因
 AddFriendFailedReason
 


1.5.6.客户端登陆
1.5.6.1. 客户端登陆消息 MessageLogin
名称
 描述
 类型
 
User
 用于验证的用户资料
 User
 


1.5.6.2. 客户端登陆结果消息 MessageLoginResult
名称
 描述
 类型
 
User
 服务器返回的用户资料
 User
 
Ok
 是否登陆成功
 Bool
 
FailedReason
 登陆失败的原因
 string
 


1.5.7.客户端注销
1.5.7.1. 强制客户端注销消息 MessageForceLogout
名称
 描述
 类型
 
FailedReason
 强制注销的原因
 ForceLogoutReason
 


1.5.7.2. 客户端注销消息 MessageLogout
1.5.8.用户注册
1.5.8.1. 用户请求注册消息 MessageRegistration
名称
 描述
 类型
 
User
 需要注册的用户信息
 User
 


1.5.8.2. 用户注册结果消息 MessageRegistrationResult
名称
 描述
 类型
 
FailedReason
 注册失败的原因
 string
 
Ok
 是否注册成功
 bool
 


1.5.9.系统维护与管理
1.5.9.1. 当发生了一个错误时发送的消息 MessageErrorOccurred
名称
 描述
 类型
 
FailedReason
 发生错误的原因
 string
 


1.5.9.2. 服务器状态改变消息 MessageServerServiceStatusChanged
名称
 描述
 类型
 
Status
 改变后的服务器状态
 ServerStatus
 


1.5.10. 用户管理
1.5.10.1.获取特定用户的联系人组消息 MessageGetContactGroups
1.5.10.2.获取特定用户的联系人组结果消息 MessageGetContactGroupsResult
名称
 描述
 类型
 
ContactGroups
 联系人组
 ContactGroupCollection
 


1.5.10.3.修改用户资料消息 MessageModifyUserInfo
名称
 描述
 类型
 
User
 新的用户信息
 User
 


1.5.10.4.修改用户资料结果消息 MessageModifyUserInfoResult
名称
 描述
 类型
 
User
 服务器返回的用户资料
 User
 
Ok
 是否修改成功
 Bool
 
FailedReason
 修改失败的原因
 string
 


1.5.10.5.设置特定用户的联系人组消息 MessageSetContactGroups
名称
 描述
 类型
 
ContactGroups
 联系人组
 ContactGroupCollection
 


1.5.10.6.设置特定用户的联系人组结果消息 MessageSetContactGroupsResult
名称
 描述
 类型
 
Ok
 是否设置成功
 bool
 
FailedReason
 设置失败的原因
 string
 


1.6.底层通讯的实现
系统采用 UDP 实现底层数据传输,因此可以在局域网内无障碍的传输数据。为了得到良好的可扩展性,我们采用单独的类来负责最底层的网络传输: Org.InteliIM.IMCommunicator, 即时通讯器类。该类负责消息的发送与接收,ReceiveMessage() 和 SendMessage(InstantMessage)。而 Org.InteliIM.IMModule 则负责启动与停止通讯服务,如 Start()和Stop()方法,是一个通用的即时通讯必需模块,服务器端类和客户端类均继承于它。其中服务器端和客户端分别重载了相关的方法,以实现相关服务的启动和停止以及客户端的登陆与注销。

值得一提的是,在客户端发送即时消息的流程是这样的:

客户端发送消息,若消息的接受方用户在线,则直接发送给用户, 即 P2P 方式;否则发送给服务器,由服务器保存,当接收方用户再次登陆时服务器向接收方发送尚未接收的离线消息,这样他就可以看到你发送给他的离线消息了;当然,你不能与离线的用户进行文件传输和语音聊天等需要双方同时在线的任务。


1.7.服务管理
为了统一各种服务管理,我们设计了基类来提供通用服务管理的一些基本方法,如载入与保存等。

1.7.1. 用户管理
系统的用户管理功能几乎全部在服务器端实现,Org.InteliIM.UserMananger 类实现了全部的服务器端用户信息的维护功能,诸如: 添加,删除,修改用户资料,用户登陆,注销,维护在线用户列表,维护滞留的属于特定用户的即时消息,维护用户的联系人分组信息,等等。它是由服务管理器 Org.InteliIM.ServiceManager 类派生而来的。UserManager 类包含了一个类型为InteliDataSet 的数据集,该数据集包含如下几个表: User, OnlineUser, Message, Feedback, ContactGroup,分别表示用户,在线用户,滞留的即时消息,反馈以及联系人组。UserManager 类的每一个操作,根据需要在执行过程中调用 UserManager 的Load() 和 Save()方法载入和保存数据,这两个方法使用 System.Data.DataSet.ReadXml() 和 System.Data.DataSet.WriteXml()方法实现了内存中的数据与XML 文件中数据的同步。

1.7.2. 消息管理
系统的消息管理功能由 UserManager 类中的获取指定用户的滞留消息 GetPendingMessages(),清除指定用户的滞留消息ClearPendingMessages(),去掉临时消息ClearTemporaryMessages(),保存指定消息 StoreMessage() 等方法完成。其数据保存与载入功能由 InteliDataSet 中的Message 表来实现。


1.8.程序中用到的算法
1.8.1.服务器端的分配用户帐号的算法
系统采用由用户自主选择唯一帐号并注册的方案,服务器端按照帐号即用户 ID 进行管理,用户 ID 可以是字母或数字形式。


1.8.2.服务器端检查用户是否仍然在线的算法
服务器端每隔一定时间间隔向各个在线的客户端发送测试连接消息,若客户端工作正常且处于在线状态,则会发送给服务器一个测试连接应答。服务器若在指定的时间段内收到特定客户端的应答信息,则视其为在线状态,否则将其注销。


1.8.3.服务器端处理用户请求的算法
服务器不断侦听来自特定网络端口的客户端请求信息。每当服务器成功接收并分析出一个即时消息后,它会激发 MessageReceived 事件,所有已注册的针对该事件的处理方法都会捕捉到该事件,并完成相应的处理任务。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值