Files

62 lines
1.1 KiB
Go

package ws
import (
"log"
"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)
}
}
}
}
}