This commit is contained in:
poiuty 2023-07-06 16:24:14 +03:00
parent 2e7720d6d3
commit d56423a53a
2 changed files with 30 additions and 6 deletions

View file

@ -15,6 +15,11 @@ type Client struct {
Conn *websocket.Conn Conn *websocket.Conn
} }
type wsMsg struct {
Mes []byte
client *Client
}
var ( var (
wsClients = make(map[*Client]bool) wsClients = make(map[*Client]bool)
@ -22,10 +27,12 @@ var (
ws = struct { ws = struct {
Broadcast chan []byte Broadcast chan []byte
Send chan *wsMsg
Add chan *Client Add chan *Client
Del chan *Client Del chan *Client
}{ }{
Broadcast: make(chan []byte, 1), Broadcast: make(chan []byte, 1),
Send: make(chan *wsMsg, 1),
Add: make(chan *Client), Add: make(chan *Client),
Del: make(chan *Client), Del: make(chan *Client),
} }
@ -50,12 +57,15 @@ func broadcast() {
case client := <-ws.Add: case client := <-ws.Add:
wsClients[client] = true wsClients[client] = true
case conn := <-ws.Del: case client := <-ws.Del:
delete(wsClients, conn) delete(wsClients, client)
case r := <-ws.Broadcast: case msg := <-ws.Send:
sendMessage(msg)
case b := <-ws.Broadcast:
//fmt.Println(len(ws.Broadcast), cap(ws.Broadcast)) //fmt.Println(len(ws.Broadcast), cap(ws.Broadcast))
sendBroadcast(r) sendBroadcast(b)
case <-ticker.C: case <-ticker.C:
fmt.Println(len(wsClients), runtime.NumGoroutine(), len(ws.Broadcast), cap(ws.Broadcast)) fmt.Println(len(wsClients), runtime.NumGoroutine(), len(ws.Broadcast), cap(ws.Broadcast))
@ -63,6 +73,15 @@ func broadcast() {
} }
} }
func sendMessage(x *wsMsg) {
if _, ok := wsClients[x.client]; ok {
if err := x.client.Conn.WriteMessage(1, x.Mes); err != nil {
delete(wsClients, x.client)
x.client.Conn.Close()
}
}
}
func sendBroadcast(message []byte) { func sendBroadcast(message []byte) {
input := struct { input := struct {
Chanel string `json:"chanel"` Chanel string `json:"chanel"`
@ -126,11 +145,16 @@ func readWS(conn *websocket.Conn) {
ws.Del <- client ws.Del <- client
}() }()
ping := time.Now().Unix()
for { for {
conn.SetReadDeadline(time.Now().Add(30 * time.Minute)) conn.SetReadDeadline(time.Now().Add(30 * time.Minute))
_, _, err := conn.ReadMessage() _, message, err := conn.ReadMessage()
if err != nil { if err != nil {
return return
} }
if string(message) == "ping" && time.Now().Unix() > ping {
ws.Send <- &wsMsg{client: client, Mes: []byte("pong")}
ping = time.Now().Unix() + 15
}
} }
} }