diff --git a/agent/ws/client.go b/agent/ws/client.go index f1ab8c5..2a564ee 100644 --- a/agent/ws/client.go +++ b/agent/ws/client.go @@ -21,6 +21,7 @@ type Client struct { conn *websocket.Conn connMux sync.RWMutex + writeMux sync.Mutex reconnectInterval time.Duration pingInterval time.Duration @@ -215,15 +216,18 @@ func (c *Client) runConnection() { return case <-pingTicker.C: + c.writeMux.Lock() c.connMux.RLock() - if c.conn != nil { - if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { - c.connMux.RUnlock() + conn := c.conn + c.connMux.RUnlock() + if conn != nil { + if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil { + c.writeMux.Unlock() log.Printf("Ping senden fehlgeschlagen: %v", err) return } } - c.connMux.RUnlock() + c.writeMux.Unlock() case msg := <-msgChan: go c.handleMessage(msg) @@ -289,7 +293,10 @@ func (c *Client) SendMessage(msg Message) error { return fmt.Errorf("keine WebSocket-Verbindung") } - return conn.WriteJSON(msg) + c.writeMux.Lock() + err := conn.WriteJSON(msg) + c.writeMux.Unlock() + return err } func (c *Client) SendBinaryData(data []byte) error { @@ -301,7 +308,10 @@ func (c *Client) SendBinaryData(data []byte) error { return fmt.Errorf("keine WebSocket-Verbindung") } - return conn.WriteMessage(websocket.BinaryMessage, data) + c.writeMux.Lock() + err := conn.WriteMessage(websocket.BinaryMessage, data) + c.writeMux.Unlock() + return err } func (c *Client) IsConnected() bool {