RelaxingChat|WebSocket模块

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

# 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

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

# 前提

  • 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通知有新用户上线
Last Updated: 2025/1/7 17:42:06