feat: 封装 sendWs 工具函数,统一 WebSocket 消息格式

This commit is contained in:
fish
2026-03-28 20:35:11 +08:00
parent 9b2380fefb
commit 5ac0a52bb1

View File

@@ -36,6 +36,47 @@ func NewClient(hub *Hub, conn *websocket.Conn) *Client {
}
}
// sendWs 发送 WebSocket 消息,自动生成 seq、cmd、timestamp
func (c *Client) sendWs(cmd string, data interface{}) error {
// 生成唯一请求ID
seq := "req_" + time.Now().Format("20060102150405") + "_" + generateRandomString(8)
// 构建消息
message := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"data": data,
"timestamp": time.Now().UnixMilli(),
}
// 将消息转换为 JSON
msgBytes, err := json.Marshal(message)
if err != nil {
log.Printf("error marshaling message: %v", err)
return err
}
// 写入 WebSocket 连接
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteMessage(websocket.TextMessage, msgBytes); err != nil {
log.Printf("error writing message: %v", err)
return err
}
return nil
}
// generateRandomString 生成随机字符串
func generateRandomString(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
result := make([]byte, length)
for i := range result {
result[i] = charset[time.Now().UnixNano()%int64(len(charset))]
time.Sleep(1 * time.Nanosecond)
}
return string(result)
}
func (c *Client) readPump() {
defer func() {
c.hub.unregister <- c
@@ -244,14 +285,10 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) {
if !accountOk || !passwordOk {
// 回复错误信息
errorResponse := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error",
"content": "Invalid register command: missing account or password",
"timestamp": time.Now().UnixMilli(),
}
c.sendJSON(errorResponse)
c.sendWs(cmd, map[string]interface{}{
"type": "error",
"content": "Invalid register command: missing account or password",
})
return
}
@@ -262,71 +299,42 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) {
resp, err := c.hub.userService.Register(nil, account, password)
if err != nil {
// 回复错误信息
errorResponse := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error",
"content": "Register failed: " + err.Error(),
"timestamp": time.Now().UnixMilli(),
}
c.sendJSON(errorResponse)
c.sendWs(cmd, map[string]interface{}{
"type": "error",
"content": "Register failed: " + err.Error(),
})
return
}
// 回复成功信息
successResponse := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "text",
"content": "Register successful",
c.sendWs(cmd, map[string]interface{}{
"type": "text",
"content": "Register successful",
"data": map[string]interface{}{
"user_id": resp.UserId,
"account": resp.Account,
"message": resp.Response.Message,
"code": resp.Response.Code,
},
"timestamp": time.Now().UnixMilli(),
}
c.sendJSON(successResponse)
})
}()
} else {
// 回复错误信息
errorResponse := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error",
"content": "User service not available",
"timestamp": time.Now().UnixMilli(),
}
c.sendJSON(errorResponse)
c.sendWs(cmd, map[string]interface{}{
"type": "error",
"content": "User service not available",
})
}
}
return
default:
// 其他命令处理
response := map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "text",
"content": "Command executed successfully",
"data": data,
"timestamp": time.Now().UnixMilli(),
}
c.sendJSON(response)
c.sendWs(cmd, map[string]interface{}{
"type": "text",
"content": "Command executed successfully",
"data": data,
})
}
}
func (c *Client) sendJSON(data interface{}) {
// 将数据转换为 JSON 并发送
msgBytes, err := json.Marshal(data)
if err != nil {
log.Printf("error marshaling message: %v", err)
return
}
// 写入 WebSocket 连接
c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if err := c.conn.WriteMessage(websocket.TextMessage, msgBytes); err != nil {
log.Printf("error writing message: %v", err)
}
}