From 6b73ca4b216060cb1ee47a6beebbaed3a7a2f07f Mon Sep 17 00:00:00 2001 From: Space-Banane <64922620+Space-Banane@users.noreply.github.com> Date: Sat, 17 Jan 2026 15:39:33 +0100 Subject: [PATCH] Implement reconnection logic and improve server connection handling --- client/sync.go | 62 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/client/sync.go b/client/sync.go index 3417ec9..37b42b9 100644 --- a/client/sync.go +++ b/client/sync.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "log" + "time" "github.com/getlantern/systray" "github.com/gorilla/websocket" @@ -15,6 +16,7 @@ var ( lastClipboard []byte identification string isConnected bool + serverURL string ) func onReady() { @@ -58,7 +60,7 @@ func startClient(statusItem *systray.MenuItem) { identification = EmbeddedIdentification server_ip := EmbeddedServerIP server_port := EmbeddedServerPort - server_connection := "ws://" + server_ip + ":" + server_port + "/ws" + serverURL = "ws://" + server_ip + ":" + server_port + "/ws" if identification == "" || server_ip == "" || server_port == "" { log.Println("Missing configuration") @@ -66,29 +68,70 @@ func startClient(statusItem *systray.MenuItem) { return } - // Connect to the server - var connectErr error - conn, _, connectErr = websocket.DefaultDialer.Dial(server_connection, nil) - if connectErr != nil { - log.Println("Error connecting to server:", connectErr) + // Reconnection loop with exponential backoff + backoff := 1 * time.Second + maxBackoff := 60 * time.Second + + for { + if connectToServer(statusItem) { + // Successfully connected, reset backoff + backoff = 1 * time.Second + + // Listen for messages until connection drops + listenForMessages(statusItem) + } + + // Connection failed or dropped, wait before retry + isConnected = false + statusItem.SetTitle(fmt.Sprintf("Status: Reconnecting in %ds...", int(backoff.Seconds()))) + log.Printf("Reconnecting in %s...", backoff) + time.Sleep(backoff) + + // Increase backoff exponentially + backoff *= 2 + if backoff > maxBackoff { + backoff = maxBackoff + } + } +} + +func connectToServer(statusItem *systray.MenuItem) bool { + statusItem.SetTitle("Status: Connecting...") + + var err error + conn, _, err = websocket.DefaultDialer.Dial(serverURL, nil) + if err != nil { + log.Println("Error connecting to server:", err) statusItem.SetTitle("Status: Connection failed") - return + return false } // Send identification to the server - sendMessage(conn, websocket.TextMessage, []byte(identification)) + err = conn.WriteMessage(websocket.TextMessage, []byte(identification)) + if err != nil { + log.Println("Error sending identification:", err) + conn.Close() + conn = nil + return false + } isConnected = true statusItem.SetTitle(fmt.Sprintf("Status: Connected (%s)", identification)) log.Println("Connected to server") + return true +} - // Listen for messages from the server +func listenForMessages(statusItem *systray.MenuItem) { for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("Error reading message:", err) isConnected = false statusItem.SetTitle("Status: Disconnected") + if conn != nil { + conn.Close() + conn = nil + } return } handleMessage(messageType, message) @@ -109,6 +152,7 @@ func sendMessage(conn *websocket.Conn, messageType int, message []byte) { err := conn.WriteMessage(messageType, message) if err != nil { log.Println("Error sending message:", err) + isConnected = false } }