RelaxingChat|WebSocket模块
Fang 2024/12/28 RelaxingChat
# WebSocket模块
# 设计
# Client 客户端信息
// Client 代理客户端信息
// uid不为空说明已经登录
// uid可能同一,但是key可能不同,说明一个用户有多个客户端连接(发送消息注意多端消息同步)
type Client struct {
// key 客户端连接后生成的唯一key
key string
// uid 用户id
uid string
// email 用户邮箱
email string
// socket 客户端连接对象
socket *websocket.Conn
// send 将数据发送到客户端
send chan model.WSDataWrapper
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ClientManager 管理所有客户端信息
// ClientManager 客户端管理
type ClientManager struct {
// onlineClients 在线客户端存储(登录态/游客)
onlineClients map[*Client]bool
// broadcast 广播数据链
broadcast chan model.WSDataWrapper
// register 客户端注册通道
register chan *Client
// unregister 客户端关闭通道
unregister chan *Client
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
ClientManager简称cm
WebSocket简称ws
# 请求/响应枚举
// req
const (
Login WSReqTypeEnum = iota + 1 // 1 请求登陆二维码请求二维码登录(暂无)
Heartbeat // 2 心跳包
Authorize // 3 登陆验证
EmailLogin // 4 请求邮箱登录
)
// res
const (
LoginUrl WSRespTypeEnum = iota + 1 // 1 登录二维码返回
LoginScanSuccess // 2 用户扫描成功等待授权
LoginSuccess // 3 用户登录成功运回用户信息
Message // 4 新消息
OnlineOfflineNotify // 5 上下线通知
InvalidateToken // 6 使客户端的token失效,意味着客户端需要重新登录
Black // 7 拉黑用户
Mark // 8 消息标记
Recall // 9 消息撒回
Apply // 10 好友申请
MemberChange // 11 成员变动
LoginEmail // 12 邮箱登录返回
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 前提
- onlineClients 记录所有连接(游客态/登录态)
- 用户进入客户端,创建client,此时无id,无email
# 不同请求/响应流程
# 登陆验证 ws req=3 (客户端存在token)
- 请求登录,ws发送req=3的消息且携带token,验证成功后,用户登录成功后,将用户的uid绑定在该client上,代表该连接从游客态变成登录态,返回用户登录成功
- 该客户段返回登录成功后,cm向其他客户端发送res=5通知有新用户上线
# 邮箱登录 ws req=4 (客户端没有token)
- 用户请求邮箱登录,先ws发送req=4的消息且携带email,client绑定该邮箱
- 此时再http请求,登录成功后获取用户id,根据email,将uid绑定在client上,代表该连接从游客态变成登录态,最后返回用户登录成功
- 该客户段返回登录成功后,cm向其他客户端发送res=5通知有新用户上线