@@ -44,6 +44,55 @@ func HandleClient(port string) {
44
44
45
45
done := make (chan struct {})
46
46
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
+
47
96
go func () {
48
97
defer close (done )
49
98
@@ -67,6 +116,13 @@ func HandleClient(port string) {
67
116
return
68
117
}
69
118
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
+
70
126
var message Message
71
127
if err := json .Unmarshal (messageBytes , & message ); err != nil {
72
128
log .Printf ("Received invaid response from server: %s" , string (messageBytes ))
0 commit comments