feat: implement WebSocket client reconnection logic and enhance client structure

This commit is contained in:
lixiangwuxian
2024-12-26 10:41:46 +08:00
parent d2fc755df5
commit 52c33ec48a
2 changed files with 28 additions and 12 deletions

View File

@@ -13,8 +13,9 @@ import (
)
type WebSocketClient struct {
conn *websocket.Conn
done chan struct{}
conn *websocket.Conn
closed bool
Done chan struct{}
}
func NewWebSocketClient(scheme, host, path string) (*WebSocketClient, error) {
@@ -27,8 +28,9 @@ func NewWebSocketClient(scheme, host, path string) (*WebSocketClient, error) {
}
client := &WebSocketClient{
conn: conn,
done: make(chan struct{}),
conn: conn,
closed: false,
Done: make(chan struct{}),
}
defer func() {
if r := recover(); r != nil {
@@ -45,8 +47,8 @@ func NewWebSocketClient(scheme, host, path string) (*WebSocketClient, error) {
}
func (c *WebSocketClient) receiveMessages() {
defer close(c.done)
for {
defer close(c.Done)
for !c.closed {
_, message, err := c.conn.ReadMessage()
if err != nil {
log.Println("Error reading message:", err)
@@ -90,10 +92,11 @@ func (c *WebSocketClient) SendMessage(messageType int, message []byte) error {
}
func (c *WebSocketClient) Close() error {
c.closed = true
err := c.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
if err != nil {
return err
}
<-c.done
<-c.Done
return c.conn.Close()
}