项目名称:实现一个在线聊天系统?

一、需求

1. 海量用户在线聊天系统;
2. 用户登录注册;
3. 根据用户ID或者Nickname搜索并添加用户;
4. 动态知道好友上下线;
5. 可以创建群并添加好友到群组成员;
6. 可以实现一对多及一对一交流;
7. 可以接收离线消息;
8. 实现客户端甚至实现手机app交流;

二、需求分析设计

设计主要分为三大块:

. 客户端
. 服务端
. 客户端与服务端通信协议

三、服务端开发

1. 用户管理

用户id:数字
用户密码:字母数字组合
用户昵称:用来显示
用户性别:字符串
用户头像:url
用户上线登录时间:字符串
用户是否在线:online

用户信息使用结构体表示:

type User struct {
UserId int `json:"user_id"`
Passwd string `json:"passwd"`
Nick string `json:"nick"`
Sex string `json:"sex"`
Header string `json:"header"`
LastLogin time.Time `json:"last_login"`
Status int `json:"status"`
}

使用redis的hash表完成用户数据存储:

redis hash: users
key:userId value:序列化 User 结构体

2. 处理用户动作

(1)发送信息
(2)接收信息

3. 用户注册&登录

4. 用户消息离线存储

四、客户端开发

1. 发送用户登录注册请求;
2. 添加好友请求;
3. 发送信息请求;
4. 接收消息请求;
5. 获取用户列表;

五、通信协议

1. 客户端和服务端数据通信协议形式如下:

  • 首发送本次通信数据的长度(将数据长度保存到buf[0:4]的数组中)
  • 发送序列化的数据(将要发送的数据保存到buf[0:8192]的数组中)

chat聊天系统项目-LMLPHP

2. 每次发送的的数据为一个序列化为结构体:

type Message struct {
Cmd string `json:"cmd"`
Data string `json:"data"`
}

其中 Cmd:表示此次通信的动作,是登录还是注册等;

Data:表示Cmd动作的数据。

六、代码实现

目前搭建了一个框架,实现了部分功能,后面会持续更新:实现见Github地址:https://github.com/XJL635438451/QQChatProject

05-08 08:35