@@ -161,17 +161,21 @@ func (ws *WebSocketServer) WsPageHandler(w http.ResponseWriter, r *http.Request)
161
161
client .pingLoopChan = make (chan struct {})
162
162
client .keepAliveChanOpen = true
163
163
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
- })
170
164
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 () {
171
173
for {
172
174
select {
173
175
case <- client .keepAliveLoopChan :
174
176
client .keepAliveTimer .Stop ()
177
+ client .keepAliveLoopChan = nil
178
+ break
175
179
176
180
case <- client .keepAliveTimer .C : // Send KeepAlive message
177
181
keepAliveMsg , _ := json .Marshal (
@@ -192,9 +196,18 @@ func (ws *WebSocketServer) WsPageHandler(w http.ResponseWriter, r *http.Request)
192
196
if ws .DebugEnabled {
193
197
log .Printf ("Sent session_keepalive to client [%s]" , client .clientName )
194
198
}
199
+ }
200
+ }
201
+ }()
195
202
203
+ // Ping/pong handler loop
204
+ go func () {
205
+ for {
206
+ select {
196
207
case <- client .pingLoopChan :
197
208
client .pingTimer .Stop ()
209
+ client .pingLoopChan = nil
210
+ break
198
211
199
212
case <- client .pingTimer .C : // Send ping
200
213
err := client .SendMessage (websocket .PingMessage , []byte {})
0 commit comments