package main import ( "encoding/json" "fmt" "github.com/brianvoe/gofakeit/v6" "github.com/gorilla/websocket" log "github.com/sirupsen/logrus" "net/http" "time" ) // We'll need to define an upgradeToWs // this will require a Read and Write buffer size var upgradeToWs = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func apiV1WebSocketHandler(w http.ResponseWriter, r *http.Request) { upgradeToWs.CheckOrigin = func(r *http.Request) bool { return true } ws, err := upgradeToWs.Upgrade(w, r, nil) if err != nil { log.Println("cannot upgrade websocket", err) return } mid := apiV1GetMachineId(r) wsq.MapMidToConnection(mid, ws) // helpful log statement to show connections log.Println("Websocket Api/V1: Client Connected", mid) wsReader(ws) } func wsReader(conn *websocket.Conn) { wsq.addConnection(conn) for { stillExist := wsq.has(conn) if !stillExist { return // the connection has been removed. } // read in a message messageType, p, err := conn.ReadMessage() if err != nil { wsq.del(conn) log.Println(err) return } // print out that message for clarity // fmt.Println(string(p)) if err := conn.WriteMessage(messageType, p); err != nil { wsq.del(conn) log.Println(err) return } if string(p) == "send dummy string for 500 times" { go wsDummySender(conn) } } } func WsBroadCast(msg string) { wsq.wsDoBroadcast(msg, "") } func WsSend(To string, msg map[string]string) { b, e := json.Marshal(msg) if e != nil { log.Error("cannot broadcast websocket message, cannot convert to json", msg) } conn := wsq.getConnBySessionId(To) if conn != nil { err := conn.WriteMessage(websocket.TextMessage, b) if err != nil { wsq.del(conn) } } } func WsBroadCastExceptMe(me string, msg map[string]string) { b, e := json.Marshal(msg) if e == nil { wsq.wsDoBroadcast(string(b), me) } } func wsDummySender(conn *websocket.Conn) { //write subsequent 5 copies, each after 1 second log.Info("start sending server data to client ..") p := "dummy string from server " for i := 1; i < 500; i++ { time.Sleep(1 * time.Second) //msg := fmt.Sprintf("copy %d, %s, %s", i, p, wsDummyString()) // 4M long string no issue msg := fmt.Sprintf("copy %d, %s ", i, p) log.Info("dummy sender is working, ", msg) if err := conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil { log.Println("wsDummySender stopped on error: ", err) return } } } func wsDummyString() string { s := gofakeit.LetterN(4096000) // 4M return s }