Skip to content
This repository was archived by the owner on Nov 22, 2023. It is now read-only.

Commit 2ec80bb

Browse files
committed
fix: #6 实验性添加断线重连模块
1 parent 3e96ab5 commit 2ec80bb

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

wshandle/client.go

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
)
1313

1414
type WsConn struct {
15+
Connecting bool
16+
Connected bool // 连接状态
1517
MsgSendCh chan string // 消息发送通道
1618
MsgReceiveCh chan string // 消息接收通道
1719
Done chan struct{} // 发送结束通道
@@ -23,15 +25,28 @@ type WsConn struct {
2325

2426
var wsconn *WsConn
2527

28+
func (c *WsConn) keepAlive() {
29+
for {
30+
if !c.Connected && !c.Connecting {
31+
c.Connecting = true
32+
New()
33+
}
34+
}
35+
}
36+
2637
func (c *WsConn) messageReceiveHandler() {
38+
go c.keepAlive()
2739
defer close(c.Done)
2840
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)
3349
}
34-
c.MsgReceiveCh <- string(msg)
3550
}
3651
}
3752

@@ -53,7 +68,7 @@ func (c *WsConn) messageSendHandler() {
5368
err := c.Conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
5469
if err != nil {
5570
log.Println("write close:", err)
56-
return
71+
os.Exit(1)
5772
}
5873
select {
5974
// 等到了结果,直接退出
@@ -76,16 +91,22 @@ func createWsConn() *WsConn {
7691
// log.Printf("connecting to %s", u.String())
7792

7893
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+
8495
wsconn = &WsConn{
8596
Conn: c,
97+
Connected: true,
98+
Connecting: false,
8699
MsgSendCh: make(chan string),
87100
MsgReceiveCh: make(chan string),
88101
}
102+
log.Println("WebSocket 连接意外断开,正在尝试重连...")
103+
104+
if err != nil {
105+
log.Println("dial:", err)
106+
return wsconn
107+
}
108+
// defer c.Close()
109+
// 将连接写入WsConn,方便随时可取
89110
wsconn.Done = make(chan struct{})
90111
go wsconn.messageReceiveHandler()
91112
go wsconn.messageSendHandler()

0 commit comments

Comments
 (0)