@@ -14,13 +14,54 @@ import (
1414 log "github.com/sirupsen/logrus"
1515)
1616
17+ type WsSendingMessage struct {
18+ MessageType int
19+ Data []byte
20+ }
21+
1722var Conn * websocket.Conn
23+ var WsSendChannel = make (chan * WsSendingMessage , 500 )
1824
1925var WsUrl = "ws://localhost:8081/ws/cq/"
2026
2127var connecting = false
2228var connectLock sync.Mutex
2329
30+ func init () {
31+ go func () {
32+ for {
33+ errCount := 0
34+ for errCount < 5 {
35+ for msg := range WsSendChannel {
36+ if Conn == nil {
37+ log .Warnf ("websocket conn is nil" )
38+ continue
39+ }
40+
41+ _ = Conn .SetWriteDeadline (time .Now ().Add (15 * time .Second ))
42+ if err := Conn .WriteMessage (msg .MessageType , msg .Data ); err != nil {
43+ log .Errorf ("failed to write message messageType: %+v, err: %+v" , msg .MessageType , err .Error ())
44+ errCount ++
45+ } else {
46+ errCount = 0
47+ }
48+ }
49+ }
50+ log .Errorf ("websocket 连续发送失败5次,开始重连,5秒后继续" )
51+ ConnectUniversal (Cli )
52+ time .Sleep (5 * time .Second )
53+ }
54+ }()
55+ }
56+
57+ func SendWsMsg (messageType int , data []byte ) {
58+ msg := & WsSendingMessage {
59+ MessageType : messageType ,
60+ Data : data ,
61+ }
62+ WsSendChannel <- msg
63+ }
64+
2465func ConnectUniversal (cli * client.QQClient ) {
2566 connectLock .Lock ()
2667 if connecting {
@@ -53,27 +94,14 @@ func ConnectUniversal(cli *client.QQClient) {
5394 }
5495}
5596
56- func Ping (cli * client. QQClient ) {
97+ func Ping () {
5798 for {
5899 if Conn == nil {
59100 time .Sleep (5 * time .Second )
60101 continue
61102 }
62- errCount := 0
63- for errCount < 5 {
64- _ = Conn .SetWriteDeadline (time .Now ().Add (time .Second * 5 ))
65- if err := Conn .WriteMessage (websocket .PingMessage , []byte ("ping" )); err != nil {
66- log .Warnf ("websocket ping失败 %+v" , err )
67- errCount ++
68- } else {
69- errCount = 0
70- }
71- time .Sleep (10 * time .Second )
72- }
73- log .Errorf ("websocket 连续ping失败5次,开始重连,60秒后重新开始ping" )
74- _ = Conn .Close ()
75- ConnectUniversal (cli )
76- time .Sleep (60 * time .Second )
103+ SendWsMsg (websocket .PingMessage , []byte ("ping" ))
104+ time .Sleep (5 * time .Second )
77105 }
78106}
79107
@@ -107,10 +135,7 @@ func ListenApi(cli *client.QQClient) {
107135 if err != nil {
108136 log .Errorf ("序列化ApiResp错误 %v" , err )
109137 }
110- err = Conn .WriteMessage (websocket .BinaryMessage , respBytes )
111- if err != nil {
112- log .Errorf ("发送ApiResp错误 %v" , err )
113- }
138+ SendWsMsg (websocket .BinaryMessage , respBytes )
114139 })
115140 }
116141}
@@ -247,12 +272,5 @@ func HandleEventFrame(cli *client.QQClient, eventFrame *onebot.Frame) {
247272 return
248273 }
249274
250- _ = Conn .SetWriteDeadline (time .Now ().Add (time .Second * 15 ))
251- err = Conn .WriteMessage (websocket .BinaryMessage , eventBytes )
252- if err != nil {
253- log .Errorf ("发送Event错误 %v" , err )
254- _ = Conn .Close ()
255- ConnectUniversal (cli )
256- return
257- }
275+ SendWsMsg (websocket .BinaryMessage , eventBytes )
258276}
0 commit comments