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() { func (c *Client) readPump() {
defer func() { defer func() {
c.hub.unregister <- c c.hub.unregister <- c
@@ -244,14 +285,10 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) {
if !accountOk || !passwordOk { if !accountOk || !passwordOk {
// 回复错误信息 // 回复错误信息
errorResponse := map[string]interface{}{ c.sendWs(cmd, map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error", "type": "error",
"content": "Invalid register command: missing account or password", "content": "Invalid register command: missing account or password",
"timestamp": time.Now().UnixMilli(), })
}
c.sendJSON(errorResponse)
return return
} }
@@ -262,21 +299,15 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) {
resp, err := c.hub.userService.Register(nil, account, password) resp, err := c.hub.userService.Register(nil, account, password)
if err != nil { if err != nil {
// 回复错误信息 // 回复错误信息
errorResponse := map[string]interface{}{ c.sendWs(cmd, map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error", "type": "error",
"content": "Register failed: " + err.Error(), "content": "Register failed: " + err.Error(),
"timestamp": time.Now().UnixMilli(), })
}
c.sendJSON(errorResponse)
return return
} }
// 回复成功信息 // 回复成功信息
successResponse := map[string]interface{}{ c.sendWs(cmd, map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "text", "type": "text",
"content": "Register successful", "content": "Register successful",
"data": map[string]interface{}{ "data": map[string]interface{}{
@@ -285,48 +316,25 @@ func (c *Client) handleNewCommand(seq string, cmd string, data interface{}) {
"message": resp.Response.Message, "message": resp.Response.Message,
"code": resp.Response.Code, "code": resp.Response.Code,
}, },
"timestamp": time.Now().UnixMilli(), })
}
c.sendJSON(successResponse)
}() }()
} else { } else {
// 回复错误信息 // 回复错误信息
errorResponse := map[string]interface{}{ c.sendWs(cmd, map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "error", "type": "error",
"content": "User service not available", "content": "User service not available",
"timestamp": time.Now().UnixMilli(), })
}
c.sendJSON(errorResponse)
} }
} }
return return
default: default:
// 其他命令处理 // 其他命令处理
response := map[string]interface{}{ c.sendWs(cmd, map[string]interface{}{
"seq": seq,
"cmd": cmd,
"type": "text", "type": "text",
"content": "Command executed successfully", "content": "Command executed successfully",
"data": data, "data": data,
"timestamp": time.Now().UnixMilli(), })
}
c.sendJSON(response)
} }
} }
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)
}
}