From 568dd266c947b2cbdf038baec5cd114b75b0ed7f Mon Sep 17 00:00:00 2001 From: poiuty Date: Thu, 1 Dec 2022 21:06:18 +0300 Subject: [PATCH] ping --- app/echo.go | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/app/echo.go b/app/echo.go index 5178320..43bd1e9 100644 --- a/app/echo.go +++ b/app/echo.go @@ -1,6 +1,8 @@ package main import ( + "fmt" + "time" "net/http" "github.com/gorilla/websocket" @@ -24,29 +26,42 @@ var ( Count chan int Send chan []byte Add chan *websocket.Conn + Del chan *websocket.Conn }{ Count: make(chan int, 100), Send: make(chan []byte, 100), Add: make(chan *websocket.Conn, 100), + Del: make(chan *websocket.Conn, 100), } ) func broadcast() { + ticker := time.NewTicker(30 * time.Second) for { select { case conn := <-ws.Add: wsClients[conn] = struct{}{} + case conn := <-ws.Del: + delete(wsClients, conn) + case <-ws.Count: ws.Count <- len(wsClients) case message := <-ws.Send: - for conn := range wsClients { - if err := conn.WriteMessage(1, message); err != nil { - conn.Close() - delete(wsClients, conn) - } - } + sendMessage(message) + + case <-ticker.C: + sendMessage([]byte("ping")) + } + } +} + +func sendMessage(message []byte) { + for conn := range wsClients { + if err := conn.WriteMessage(1, message); err != nil { + conn.Close() + delete(wsClients, conn) } } } @@ -56,5 +71,23 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { if err != nil { return } - ws.Add <- conn + go readWS(conn) +} + +func readWS(conn *websocket.Conn) { + defer conn.Close() + + ws.Add <- conn + + defer func() { + ws.Del <- conn + }() + + for { + _, _, err := conn.ReadMessage() + if err != nil { + fmt.Println("readWS", err.Error()) + return + } + } }