Files
asset_helper/backend/gateway/internal/ws/hub.go

62 lines
1.1 KiB
Go

package ws
import (
"log"
"backend/gateway/internal/service"
)
type Hub struct {
// 注册的客户端
clients map[*Client]bool
// 从客户端接收的消息
broadcast chan *Message
// 注册请求
register chan *Client
// 注销请求
unregister chan *Client
// 用户服务
userService *service.UserService
}
func NewHub(userService *service.UserService) *Hub {
return &Hub{
broadcast: make(chan *Message),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
userService: userService,
}
}
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)
}
}
}
}
}