فهرست منبع

生成唯一的客户端名称

shizhongqi 11 ماه پیش
والد
کامیت
b6b2e7fa95
2فایلهای تغییر یافته به همراه17 افزوده شده و 69 حذف شده
  1. 15 4
      wsClient/client.go
  2. 2 65
      wsClient/room.go

+ 15 - 4
wsClient/client.go

@@ -13,6 +13,10 @@ import (
 // Client 表示一个聊天用户的连接
 // 每个 WebSocket 连接对应一个 Client 实例
 type Client struct {
+	// 客户端名称 -- 用作唯一标识,进行查找用的 (门店端: shop_{shopId}_{userId}, 买家端: customer_{customId}_{userId})
+	// 在消息中用于标识消息发送者
+	name string
+
 	// a socket is the web socket for this uer
 	// WebSocket 连接对象,用于与浏览器端进行双向通信
 	socket *websocket.Conn
@@ -26,10 +30,6 @@ type Client struct {
 	// 客户端所在的聊天房间引用
 	// 用于将发送的消息转发给房间
 	room *Room
-
-	// 客户端的显示名称(用户名)
-	// 在消息中用于标识消息发送者
-	name string
 	
 	// 新增的用户参数
 	userInfo UserInfo
@@ -94,3 +94,14 @@ func (c *Client) write() {
 		}
 	}
 }
+
+// 根据房间参数生成客户端名称
+// 用于生成客户端的唯一标识,用作唯一标识,进行查找用的 (门店端: shop_{shopId}_{userId}, 买家端: customer_{customId}_{userId})
+func clientName(roomParams *RoomParams) string {
+	// 首先根据 Type 来判断是门店端还是买家端
+	if roomParams.Type == "shop" {
+		return fmt.Sprintf("shop_%d_%d", roomParams.ShopId, roomParams.UserId)
+	} else {
+		return fmt.Sprintf("customer_%d_%d", roomParams.CustomId, roomParams.UserId)
+	}
+}

+ 2 - 65
wsClient/room.go

@@ -295,10 +295,10 @@ func (r *Room) HttpServe(w http.ResponseWriter, req *http.Request,roomParams *Ro
 	// -----------------------------------    生成客户端对象     ----------------------------------
 	// 创建新的客户端对象,使用解析出的参数
 	client := &Client{
+		name:     clientName(roomParams),
 		socket:   socket,                              // WebSocket 连接
 		receive:  make(chan []byte, messageBufferSize), // 接收消息的缓冲 channel
 		room:     r,                                   // 使用当前房间实例
-		name:     roomParams.Username,                 // 使用传递的用户名
 		userInfo: UserInfo{
 			UserId:   roomParams.UserId,
 			Username: roomParams.Username,
@@ -322,67 +322,4 @@ func (r *Room) HttpServe(w http.ResponseWriter, req *http.Request,roomParams *Ro
 	go client.write()
 	// 在当前 goroutine 中处理客户端的读消息(阻塞直到连接断开)
 	client.read()
-}
-
-// ServeHTTP 处理 WebSocket 连接请求
-// 实现了 http.Handler 接口,负责将 HTTP 连接升级为 WebSocket 连接,并创建新的客户端加入当前房间
-func (r *Room) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	// 解析WebSocket子协议中的参数
-	protocols := req.Header["Sec-Websocket-Protocol"]
-	roomParams, err := ParseWebSocketProtocols(protocols)
-	if err != nil {
-		log.Printf("解析WebSocket协议参数失败: %v", err)
-		http.Error(w, "Invalid WebSocket protocols", http.StatusBadRequest)
-		return
-	}
-
-	// 验证房间名称是否匹配
-	if roomParams.RoomName != r.name {
-		log.Printf("房间名称不匹配: 期望 %s, 收到 %s", r.name, roomParams.RoomName)
-		http.Error(w, "Room name mismatch", http.StatusBadRequest)
-		return
-	}
-
-	// 将 HTTP 连接升级为 WebSocket 连接,指定接受的子协议
-	responseHeader := http.Header{}
-	responseHeader.Add("Sec-WebSocket-Protocol", "chat") // 响应基础聊天协议
-	
-	socket, err := upgrader.Upgrade(w, req, responseHeader)
-	if err != nil {
-		log.Println("Upgrade error:", err)
-		return
-	}
-
-	// -----------------------------------    生成客户端对象     ----------------------------------
-	// 创建新的客户端对象,使用解析出的参数
-	client := &Client{
-		socket:   socket,                              // WebSocket 连接
-		receive:  make(chan []byte, messageBufferSize), // 接收消息的缓冲 channel
-		room:     r,                                   // 使用当前房间实例
-		name:     roomParams.Username,                 // 使用传递的用户名
-		userInfo: UserInfo{
-			UserId:   roomParams.UserId,
-			Username: roomParams.Username,
-			CustomId: roomParams.CustomId,
-			ShopId:   roomParams.ShopId,
-			Platform: roomParams.Platform,
-		},
-	}
-
-	// 如果用户名为空,生成一个默认用户名
-	if client.name == "" {
-		client.name = fmt.Sprintf("user_%d", rand.Intn(1000))
-	}
-
-	log.Printf("新客户端连接: 用户名=%s, 用户ID=%d, 自定义ID=%d, 店铺ID=%d, 平台=%s, 客户端类型=%s\n\n",
-		client.userInfo.Username, client.userInfo.UserId, client.userInfo.CustomId, client.userInfo.ShopId, client.userInfo.Platform, client.userInfo.Type)
-
-	// 将客户端加入当前房间
-	r.join <- client
-	defer func() { r.leave <- client }()
-
-	// 启动客户端的写消息 goroutine
-	go client.write()
-	// 在当前 goroutine 中处理客户端的读消息(阻塞直到连接断开)
-	client.read()
-}
+}