在做项目之前要把整体框架搭好,对于这个项目而言,数据库的设计与服务器和客户端之间的通信协议制定至关重要。
数据库而言,数据库的制定要考虑全面,如果在中途写代码的时候发现,发现数据库表设计不合理或者是缺少字段,这样严重影响项目的进度,会做很多无用功,因此在写代码之前,一定要把数据库设计的合理、完整。
对于这个项目主要是客户端和服务器之间的通信,通信协议是比较多的,这个项目我们是四个人一起做、写服务器的和写客户端的是不同的人,因此这个协议事先一定要商定好,组员之间要多沟通、多交流。
一、数据库设计
下面是我设计的数据库表。
-- 存放所有已经注册用户的信息
CREATE TABLE tbl_register_users
(
name VARCHAR(20) NOT NULL PRIMARY KEY, -- 主键
passwd VARCHAR(20) NOT NULL,
socketfd INT NOT NULL,
is_online TINYINT NOT NULL,-- 是否在线 0 不在线 1 在线
is_used TINYINT NOT NULL, -- 该文件描述符现在是否被用 0 没有被占用 1 被占有
securiety VARCHAR(30) NOT NULL, -- 密保
isOfflineMsg TINYINT NOT NULL -- 0 没有, 1 有离线消息
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 存放被禁言的用户,当禁言时间到了之后,就要把用户从禁言列表里面删除
CREATE TABLE tbl_gag_users
(
gag_name VARCHAR(20) NOT NULL PRIMARY KEY, -- 主键
gag_minutes INT NOT NULL -- 禁言时间
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 存放被管理员删除的用户,已经被加入该列表的用户,不能再注册
CREATE TABLE tbl_del_users
(
del_name VARCHAR(20) NOT NULL PRIMARY KEY -- 主键
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 存放某个用户和他的好友的信息
CREATE TABLE tbl_users_friends
(
name VARCHAR(20) NOT NULL ,
friend_name VARCHAR(20) NOT NULL,
CONSTRAINT pk_friend_name PRIMARY KEY (name,friend_name) -- 组合键作为主键
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 存放某个用户和他的QQ群的信息
CREATE TABLE tbl_users_groups
(
name VARCHAR(20) NOT NULL ,
group_name VARCHAR(20) NOT NULL,
CONSTRAINT pk_group_name PRIMARY KEY (name,group_name) -- 组合键作为主键
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 存放敏感词的信息
CREATE TABLE tbl_sensitive_words
(
sensitive_word VARCHAR(30) NOT NULL PRIMARY KEY -- 主键
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
-- 超级用户数据库表
CREATE TABLE tbl_super_users
(
super_name VARCHAR(20) NOT NULL PRIMARY KEY, -- 主键
passwd VARCHAR(20) NOT NULL
)ENGINE=InnoDB,CHARACTER SET 'gbk' COLLATE 'gbk_chinese_ci';
INSERT INTO tbl_sensitive_words VALUES('ddd'),('ssss'),('eee');
二、通信协议
下面是客户端向服务器注册用户的消息格式(标识类型是"01"):
标识类型 (2字节) | 名字长度 (2字节) | 名字 | 密码长度 (2字节) | 密码 |
|
|
|
|
|
因为通信协议是比较多的,我把我我们用到的标识类型在下面写一下。
客户端:
01 客户端-->服务器:注册用户
11 服务器-->客户端:给客户端返回注册是否成功的信息
111 :注册成功
112:该用户名已经注册
113:用户名已经删除
02 客户端-->服务器:用户登录
12 服务器-->客户端:给客户端返回登录是否成功的信息
121:登录成功
122:密码错误
123:登录的用户已经在线
124:用户名不存在
加好友:
07 客户端A-->服务器:申请加好友
39 客户端B->服务器:同意A加自己好友
40 客户端B-->服务器:拒绝A加自己好友
41 服务器-->客户端B:A要加自己好友
42:服务器-->客户端A:自己申请加好友的信息
0:B拒绝加自己
1:B同意加自己
99:B用户名不存在
加群:
08 客户端-->服务器:申请加群
96:添加的群组不存在
单聊:
04:客户端A-->服务器:聊天信息
19: 服务器-->客户端A: 告诉用户你被禁言
14: 服务器-->客户端B:你有单聊消息发送过来
找回密码:
03 客户端-->服务器:
13 服务器-->客户端:找回密码
1:修改成功
2:密保错误
3:输入的用户名错误
传文件:
89 客户端A-->服务器 文件
90 服务器-->客户端B 文件
71 服务器-->客户端A 用户不在线
72 服务器-->客户端A 文件传输成功
群聊:
06 客户端A-->服务器:群聊信息
15 服务器-->客户端B:把群聊的信息发送过去
登录:
18 服务器-->客户端:给用户发送它的所有好友列表
20 服务器-->客户端:给用户发送它的群列表
查看消息记录:
98 客户端A-->服务器 查看自己私聊的聊天记录 2A
97 服务器-->客户端A:自己的聊天记录 73
后台管理:
22 管理员客户端 -->服务器: 超级用户登录
23 服务器-->管理员客户端: 返回所有的敏感词
26 管理员客户端 -->服务器: 禁言用户
25 管理员客户端 -->服务器: 删除用户(当用户不在线的时候,才可以删除)
27 管理员客户端 -->服务器: 敏感词增加
28 管理员客户端 -->服务器: 敏感词删除
29 管理员客户端 -->服务器:信息广播
30 服务器-->管理员客户端: 返回超级用户登录
31 服务器-->管理员客户端: 返回注册的所有用户
32 服务器-->管理员客户端: 返回注册的群组
整体框架的设计:http://blog.csdn.net/u010889616/article/details/48413629