feat: 实现网关服务的长连接功能
This commit is contained in:
55
backend/gateway/internal/ws/hub.go
Normal file
55
backend/gateway/internal/ws/hub.go
Normal file
@@ -0,0 +1,55 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user