» Go:使用Socket.IO创建Web Chat App在线聊天应用 » 2. 开发 » 2.4 群聊消息

群聊消息

创建群组

Socket.IO 房间是一个虚拟概念,允许你将 sockets(连接)分组在一起。处于同一房间的 sockets 可以轻松地彼此通信。当你想要向特定组的客户端广播消息而不是向所有连接的客户端广播时,这个特性非常有用。

变更 main.go:

@@ -56,6 +56,26 @@ func main() {
 			}
 			io.Sockets().To(socket.Room(to)).Emit("chat", data)
 		})
+
+		// Create Room
+		client.On("create-group", func(args ...any) {
+			data, ok := args[0].(Data)
+			if !ok {
+				return
+			}
+			socketIds := data["sids"].([]interface{})
+			var individualRooms []socket.Room
+			for _, socketId := range socketIds {
+				individualRooms = append(individualRooms, socket.Room(socketId.(string)))
+			}
+			roomName := data["name"].(string)
+			roomId := data["id"].(string)
+			// Join Room
+			io.Sockets().In(individualRooms...).SocketsJoin(socket.Room(roomId))
+			// Broadcast to all participants
+			io.Sockets().To(socket.Room(roomId)).Emit("create-group", data)
+			fmt.Printf("Room %s => %s created\n", roomId, roomName)
+		})
 	})
 
 	http.Handle("/socket.io/", io.ServeHandler(nil))
  • sids 带有待创建群组的所有 socket ID。
  • roomId 是一个唯一的字母数字字符串。相比于用户输入的房间名称,它更适合作为房间的内部标识。

io.Sockets().To(socket.Room(roomId)).Emit(...) 通知所有参与者“新群组已经创建”。

转发群聊消息

变更 main.go:

@@ -76,6 +76,18 @@ func main() {
 			io.Sockets().To(socket.Room(roomId)).Emit("create-group", data)
 			fmt.Printf("Room %s => %s created\n", roomId, roomName)
 		})
+
+		client.On("group-chat", func(args ...any) {
+			data, ok := args[0].(Data)
+			if !ok {
+				return
+			}
+			roomId, ok := data["room"].(string)
+			if !ok {
+				return
+			}
+			io.Sockets().To(socket.Room(roomId)).Except(socket.Room(client.Id())).Emit("group-chat", data)
+		})
 	})
 
 	http.Handle("/socket.io/", io.ServeHandler(nil))

io.Sockets().To(...).Except(socket.Room(client.Id())).Emit(...) 转发消息给所有房间参与者,除了发送者自己。