package ws import ( "log" ) type Hub struct { // 注册的客户端 clients map[*Client]bool // 从客户端接收的消息 broadcast chan *Message // 注册请求 register chan *Client // 注销请求 unregister chan *Client } func NewHub() *Hub { return &Hub{ broadcast: make(chan *Message), register: make(chan *Client), unregister: make(chan *Client), clients: make(map[*Client]bool), } } func (h *Hub) Run() { for { select { case client := <-h.register: h.clients[client] = true log.Printf("Client connected. Total clients: %d", len(h.clients)) case client := <-h.unregister: if _, ok := h.clients[client]; ok { delete(h.clients, client) close(client.send) log.Printf("Client disconnected. Total clients: %d", len(h.clients)) } case message := <-h.broadcast: for client := range h.clients { select { case client.send <- message: default: close(client.send) delete(h.clients, client) } } } } }