@@ -161,17 +161,21 @@ func (ws *WebSocketServer) WsPageHandler(w http.ResponseWriter, r *http.Request)
161161 client .pingLoopChan = make (chan struct {})
162162 client .keepAliveChanOpen = true
163163 client .pingChanOpen = true
164- go func () {
165- // Set pong handler. Resets the read deadline when pong is received.
166- conn .SetPongHandler (func (string ) error {
167- conn .SetReadDeadline (time .Now ().Add (time .Second * KEEPALIVE_TIMEOUT_SECONDS ))
168- return nil
169- })
170164
165+ // Set pong handler. Resets the read deadline when pong is received.
166+ conn .SetPongHandler (func (string ) error {
167+ conn .SetReadDeadline (time .Now ().Add (time .Second * KEEPALIVE_TIMEOUT_SECONDS ))
168+ return nil
169+ })
170+
171+ // Keep Alive message loop
172+ go func () {
171173 for {
172174 select {
173175 case <- client .keepAliveLoopChan :
174176 client .keepAliveTimer .Stop ()
177+ client .keepAliveLoopChan = nil
178+ break
175179
176180 case <- client .keepAliveTimer .C : // Send KeepAlive message
177181 keepAliveMsg , _ := json .Marshal (
@@ -192,9 +196,18 @@ func (ws *WebSocketServer) WsPageHandler(w http.ResponseWriter, r *http.Request)
192196 if ws .DebugEnabled {
193197 log .Printf ("Sent session_keepalive to client [%s]" , client .clientName )
194198 }
199+ }
200+ }
201+ }()
195202
203+ // Ping/pong handler loop
204+ go func () {
205+ for {
206+ select {
196207 case <- client .pingLoopChan :
197208 client .pingTimer .Stop ()
209+ client .pingLoopChan = nil
210+ break
198211
199212 case <- client .pingTimer .C : // Send ping
200213 err := client .SendMessage (websocket .PingMessage , []byte {})
0 commit comments