From 5ac0a52bb12e7c045683f634ba74078b819551e8 Mon Sep 17 00:00:00 2001 From: fish Date: Sat, 28 Mar 2026 20:35:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=81=E8=A3=85=20sendWs=20=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=87=BD=E6=95=B0=EF=BC=8C=E7=BB=9F=E4=B8=80=20WebSoc?= =?UTF-8?q?ket=20=E6=B6=88=E6=81=AF=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/gateway/internal/ws/client.go | 116 ++++++++++++++------------ 1 file changed, 62 insertions(+), 54 deletions(-) diff --git a/backend/gateway/internal/ws/client.go b/backend/gateway/internal/ws/client.go index 503214c..489bab6 100644 --- a/backend/gateway/internal/ws/client.go +++ b/backend/gateway/internal/ws/client.go @@ -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) - } -}