Skip to content

Commit 15a3f31

Browse files
committed
abnornal closure fix: ping-pong
1 parent 6c4012c commit 15a3f31

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

cmd/client/client.go

+56
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,55 @@ func HandleClient(port string) {
4444

4545
done := make(chan struct{})
4646

47+
// Setup ping handler
48+
conn.SetPingHandler(func(appData string) error {
49+
log.Println("server: ping")
50+
err := conn.WriteControl(websocket.PongMessage, []byte{}, time.Now().Add(10*time.Second))
51+
if err != nil {
52+
log.Printf("Error sending pong: %v", err)
53+
return err
54+
}
55+
return nil
56+
})
57+
58+
// Setup pong handler to reset the read deadline
59+
conn.SetPongHandler(func(string) error {
60+
log.Println("server: pong")
61+
err := conn.SetReadDeadline(time.Now().Add(60 * time.Second))
62+
if err != nil {
63+
log.Printf("Error setting read deadline: %v", err)
64+
return err
65+
}
66+
return nil
67+
})
68+
69+
// Initial read deadline
70+
err = conn.SetReadDeadline(time.Now().Add(60 * time.Second))
71+
if err != nil {
72+
log.Printf("Error setting initial read deadline: %v", err)
73+
return
74+
}
75+
76+
// this Keepalive ping will avoid the 1006 abnormal connection closure: EOF
77+
go func() {
78+
ticker := time.NewTicker(30 * time.Second)
79+
defer ticker.Stop()
80+
81+
for {
82+
select {
83+
case <-done:
84+
return
85+
case <-ticker.C:
86+
log.Println("client: ping")
87+
err := conn.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(10*time.Second))
88+
if err != nil {
89+
log.Printf("Error sending ping: %v", err)
90+
return
91+
}
92+
}
93+
}
94+
}()
95+
4796
go func() {
4897
defer close(done)
4998

@@ -67,6 +116,13 @@ func HandleClient(port string) {
67116
return
68117
}
69118

119+
// Reset read deadline after successful read
120+
err = conn.SetReadDeadline(time.Now().Add(60 * time.Second))
121+
if err != nil {
122+
log.Printf("Error resetting read deadline: %v", err)
123+
return
124+
}
125+
70126
var message Message
71127
if err := json.Unmarshal(messageBytes, &message); err != nil {
72128
log.Printf("Received invaid response from server: %s", string(messageBytes))

0 commit comments

Comments
 (0)