Files
windows_lock_go/app/websocket/hub.go
2025-07-15 16:43:50 +08:00

64 lines
1.1 KiB
Go

package websocket
import "sync"
type Hub struct {
Clients map[string]*Client
Register chan *Client
Unregister chan *Client
mu sync.RWMutex
}
func NewHub() *Hub {
return &Hub{
Clients: make(map[string]*Client),
Register: make(chan *Client),
Unregister: make(chan *Client),
}
}
func (h *Hub) Run() {
for {
select {
case client := <-h.Register:
h.mu.Lock()
h.Clients[client.ID] = client
h.mu.Unlock()
case client := <-h.Unregister:
h.mu.Lock()
if _, ok := h.Clients[client.ID]; ok {
delete(h.Clients, client.ID)
close(client.Send)
}
h.mu.Unlock()
}
}
}
func (h *Hub) SendToClient(id string, msg []byte) {
h.mu.RLock()
defer h.mu.RUnlock()
if c, ok := h.Clients[id]; ok {
c.Send <- msg
}
}
func (h *Hub) SendToAll(ids []string, msg []byte) {
h.mu.RLock()
defer h.mu.RUnlock()
for _, id := range ids {
if c, ok := h.Clients[id]; ok {
c.Send <- msg
}
}
}
func (h *Hub) Broadcast(msg []byte) {
h.mu.RLock()
defer h.mu.RUnlock()
for _, client := range h.Clients {
client.Send <- msg
}
}