@@ -12,6 +12,8 @@ import (
12
12
)
13
13
14
14
type WsConn struct {
15
+ Connecting bool
16
+ Connected bool // 连接状态
15
17
MsgSendCh chan string // 消息发送通道
16
18
MsgReceiveCh chan string // 消息接收通道
17
19
Done chan struct {} // 发送结束通道
@@ -23,15 +25,28 @@ type WsConn struct {
23
25
24
26
var wsconn * WsConn
25
27
28
+ func (c * WsConn ) keepAlive () {
29
+ for {
30
+ if ! c .Connected && ! c .Connecting {
31
+ c .Connecting = true
32
+ New ()
33
+ }
34
+ }
35
+ }
36
+
26
37
func (c * WsConn ) messageReceiveHandler () {
38
+ go c .keepAlive ()
27
39
defer close (c .Done )
28
40
for {
29
- _ , msg , err := c .Conn .ReadMessage ()
30
- if err != nil {
31
- // log.Println("read:", err)
32
- return
41
+ if c .Connected {
42
+ _ , msg , err := c .Conn .ReadMessage ()
43
+ if err != nil {
44
+ // 读取信息出错,连接已经意外断开
45
+ log .Println (err )
46
+ c .Connected = false
47
+ }
48
+ c .MsgReceiveCh <- string (msg )
33
49
}
34
- c .MsgReceiveCh <- string (msg )
35
50
}
36
51
}
37
52
@@ -53,7 +68,7 @@ func (c *WsConn) messageSendHandler() {
53
68
err := c .Conn .WriteMessage (websocket .CloseMessage , websocket .FormatCloseMessage (websocket .CloseNormalClosure , "" ))
54
69
if err != nil {
55
70
log .Println ("write close:" , err )
56
- return
71
+ os . Exit ( 1 )
57
72
}
58
73
select {
59
74
// 等到了结果,直接退出
@@ -76,16 +91,22 @@ func createWsConn() *WsConn {
76
91
// log.Printf("connecting to %s", u.String())
77
92
78
93
c , _ , err := websocket .DefaultDialer .Dial (u .String (), nil )
79
- if err != nil {
80
- log .Fatal ("dial:" , err )
81
- }
82
- // defer c.Close()
83
- // 将连接写入WsConn,方便随时可取
94
+
84
95
wsconn = & WsConn {
85
96
Conn : c ,
97
+ Connected : true ,
98
+ Connecting : false ,
86
99
MsgSendCh : make (chan string ),
87
100
MsgReceiveCh : make (chan string ),
88
101
}
102
+ log .Println ("WebSocket 连接意外断开,正在尝试重连..." )
103
+
104
+ if err != nil {
105
+ log .Println ("dial:" , err )
106
+ return wsconn
107
+ }
108
+ // defer c.Close()
109
+ // 将连接写入WsConn,方便随时可取
89
110
wsconn .Done = make (chan struct {})
90
111
go wsconn .messageReceiveHandler ()
91
112
go wsconn .messageSendHandler ()
0 commit comments