局域网通信软件设计

来源:互联网 发布:索尼xz premium 知乎 编辑:程序博客网 时间:2024/05/16 08:21

总体设计

 

 系统构架图

系统整体采用C/S构架,具体分为三层,用户层,服务器层,数据库成。

服务器层主要是与用户层进行交互,处理用户发过来的各种请求,并联合数据库,对用户进行相应。

数据库层主要功能是存储用户的信息,记录系统日志以便于日后的审查,并与服务器进行响应,服务于用户的各种查询。

客户层是才能桌面软件安装形式,是用户操作的接口。

 

 

  软件功能模块

 该局域网通信软件从宏观上可以划分以下几种功能,注册功能,登陆功能,聊天功能( 包括公聊和私聊),离线功能。具体的功能其核心是依靠网络通信协议完成数据包的传递。具体微观的细节实现在下面会继续详细讲解。

 

  系统业务流程图

 此系统业务流程是整体聊天软件系统的业务流程,包括服务器端和客户端的基本业务实现。用户使用该系统首先是注册,登录,服务器对其进行各种合法性的判断,如果是合法用户就可以是用系统提供的各种功能。流程很简单,如上图所示,各类通信主要是通过UDP/IP协议完成数据包的传送。数据库层与服务器层进行交互,为用户提供各种人性化服务。

 

服务器端业务流程图


此图是服务器端的设计,是整个聊天软件核心的部分,整个系统的性能基本是由服务器端的设计决定,比如负载的问题。以下是服务器端的基本流程:

1. 用户发送请求数据包给服务器,包括注册,登陆,离线,聊天(公聊和私聊)。

2. 服务器端写一个“数据包接收线程”的多线程来接收用户数据包,然后压入请求队列。队列可以建立五个请求队列,注册请求队列,登陆请求队列,聊天请求队列,离线请求队列,以提高并发执行速度。每个队列可以再各开一个“服务器处理线程”的多线程处理该队列的事件,进一步提高并发执行。

3. 有些数据包请求可能需要交互数据库,所以需要把需要与数据库交互的请求压入“数据库写入队列”,然后再用一个“数据库写入线程”的多线程来并行处理请求事件。

    4. 对于用户列表,包括在线和离线的有效用户,有些数据包请求可能需要获取用户列表并且加载到本地,比如登陆后在线好友的显示就需要在线用户好友的获取,因为用户列表占用内存空间少,所以可以设计一个数据结构,直接把全部用户直接加载到内存并长存之,需要时并与数据库层进行交互。

 

注册模块

 

1.  用户发送注册请求数据包给服务器。

2. 服务器接收请求数据包然后进行解析,判读是否合法。如果合法服务器就交互数据库,在数据库中插入新的用户注册信息,并且记录系统日志,然后服务器对用户响应注册请求,告知注册成功。如果不合法,则服务器直接返回用户一个数据包进行响应,告之注册失败,并且根据返回类型码查看注册失败的原因,比如用户已存在等。

 

登陆模块

1. 用户发送登陆请求数据包给服务器。

2. 服务器接收请求数据包然后进行解析,判读是否合法。如果合法服务器就交互数据库,在数据库中插入新的用户注册信息,并且记录系统日志,然后服务器对用户响应注册请求,告知注册成功。如果不合法,则服务器直接返回用户一个数据包进行响应,告之注册失败,并且根据返回类型码查看注册失败的原因,比如用户已存在等。

3. 数据库层与之交互,并且记录系统日志。

 

 

 

  聊天模块

1. 用户发送登陆请求数据包给服务器。

2. 服务器接收聊天请求数据包然后进行解析,判读是否合法。

3. 如果合法,则判读聊天的类型,是群聊还是私聊。如果是群聊所有的聊天内容全部经过服务器转发给其他的所有在线用户;如果是私聊,则用户A第一次发送聊天数据包给服务器,然后转给用户B,并且告知A的网络信息(IP地址),然后服务器再发送一个数据包给A,告知用户B的网络信息,之后AB进行点对点的通信。

4. 如果不合法,则服务器直接给A一个数据包,通过该数据包的类型码得知具体聊天失败的原因。

5. 数据库层与之交互,并且记录系统日志。

 

  群聊模块

    群聊模块所有的信息全部通过服务器中转,通信协议采用UDP/IP协议。

   私聊模块

 私聊模块主要是点对点的进行信息传递,聊天数据包只有第一次中转服务器。具体逻辑如上图所示。

 

   离线模块

1. 用户发送登陆请求数据包给服务器。

2. 服务器接收聊天请求数据包然后进行解析,判读是否合法。

3. 如果合法则发送离线通知的数据包给所有用户告知该用户下线,其他用户得到该消息,重新刷新本地的好友列表,把该好友从本地在线的列表移动到离线的好友列表中。数据库记录系统日志。

4. 如果不合法,服务器发送数据包给该用户,并且通过类型码可以判断出离线失败的原因。

 

4. 通信协议设计

   本通信协议采取UDP/IP的用户数据包通信协议以及私聊时的一对一的P2P通信协议,数据包通过组合的形式完成传送。

 


 

类型码规定:

: 注册 , 11 : 注册成功, 

: 登陆 , 12 : 登陆成功, 

3:  公聊,  4  : 私聊   ,13 聊天连接成功

5:  下线,  15:  下线成功

-1: 账号不存在,   -2: 账号已在线,  -3:密码错误

 

注册数据包的传递:

1.  用户注册时发送数据包ConnProto + UserContent,

2.  服务器向用户数据包  ConnProto

 

登陆数据包的传递:

1:用户A给服务器发送数据包ConPorto + UserContent

2:如果合法服务器其发送数据包ConnPorto +UserContent 给其他用户。发送数据包ConnProto给用户A

3:如果不合法服务器其发送数据包ConnPorto给用户A

 

 

私聊数据包的传递:

1:用户A给服务器发送数据包ConPorto + ChatContent

2:如果合法服务器其发送数据包ConnPorto +UserContent 给用户B。发送数据包ConnProto给用户A。然后AB点对点通信。

3:如果不合法服务器其发送数据包ConnPorto给用户A

 

公聊数据包的传递:

用户间传送聊天数据包ConnProto + ChatContent,而且通过服务器中转。

 

离线数据包的传递:

 

1. 用户A发送离线数据包ConnPro给服务器。

2. 服务器广播数据包ConnPorto给所有用户通知用户A下线。

 

4. 数据库设计

 

 1用户信息表

   

UserID

用户账号ID

Int

主键

Name

用户名

String

Not null

Password

密码

String

Not null

IP

用户IP地址

String

Not null

Port

端口号

Int

Not null

Regtime

注册时间

String

Not null

 

 2 系统日志表

ID

ID(自增用)

Int

主键

UserID

用户账号ID

Int

Not null

Type

类型码

Int

Not null

UserIP

用户IP地址

String

Not null

Port

端口号

Int

Not null

OpTime

操作时间

String

Not null

 

  3 好友表(UserID1 < UserID2

User1ID

用户账号ID

Int

主键

User2ID

用户账号ID

Int

主键

 

User1ID

User2ID

1

2

1

3

3

5

5

6

 

  4 群管理表

ID

ID(自增用)

Int

主键

GroupID

群号

Int

Not null

Name

群明

String

Not null

 

ID

GroupID

Name

1

1101

云计算群

2

1102

数据挖掘群

3

1103

人工智能群

4

1104

人工智能群

5

1105

云计算群

 

  5 群表(单个的群的名字为群管理表中的GroupID

UserID

用户账号ID

Int

主键

UserName

用户名

String

Not null

 

 

表名:1103人工智能群)

UserID

UserName

100001

Damon

100002

Caroline

100003

Niclaus

 

具体的表在程序代码中通过SQL语句动态的建立,比如1103(人工智能群)的表。

 5 触发器

 5.5.1  不允许同时删除用户表的用户数超过1个。

 5.5.2 当删除某个用户时,相对应的系统日志表中的关于该用户的数据同时删除。

 5 视图

    对不同管理员建立不同的视图,项目开发完成后使用时再进行视图的建立。

 6 索引

   每个表对主键和常用的字段相对应的建立索引。

 7 账号约束

群号

1001 - 9999

四位

用户账号

10001 - 999999

六位

 


0 0
原创粉丝点击