» Go:使用Socket.IO创建Web Chat App在线聊天应用 » 2. 开发 » 2.2 联系人列表

联系人列表

使用 map[string]map[string]interface{}map的map)在内存中保存所有用户信息。

在大规模项目中,你需要使用数据库来存储信息。

更新 main.go:

@@ -8,6 +8,8 @@ import (
 	"github.com/zishang520/socket.io/v2/socket"
 )
 
+type User = map[string]interface{}
+
 const port = 4000
 
 func main() {
@@ -15,10 +17,32 @@ func main() {
 	opts := &socket.ServerOptions{}
 	opts.SetCors(&types.Cors{Origin: "*"})
 
+	users := make(map[string]User)
+
 	io := socket.NewServer(nil, opts)
 	io.On("connection", func(clients ...any) {
 		client := clients[0].(*socket.Socket)
 		fmt.Println("A user connected:", client.Id())
+
+		client.On("user-join", func(args ...any) {
+			user, ok := args[0].(User)
+			if !ok {
+				return
+			}
+			if _, ok := user["name"]; !ok {
+				return
+			}
+			id := string(client.Id())
+			fmt.Printf("User %s => %s %s joined\n", id, user["emoji"], user["name"])
+			user["sid"] = id
+			users[id] = user
+			// Broadcast to all connected clients
+			var items [][]interface{}
+			for k, v := range users {
+				items = append(items, []interface{}{k, v})
+			}
+			io.Sockets().Emit("contacts", items)
+		})
 	})
 
 	http.Handle("/socket.io/", io.ServeHandler(nil))
  • var items [][]interface{} 是数组的数组。它使得 js 客户端将数据解析成 Map 的时候更容易。
  • io.Sockets().Emit 将最新的联系人列表广播给所有用户。
上页下页