62 lines
1.1 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|