Implement reconnection logic and improve server connection handling

This commit is contained in:
Space-Banane
2026-01-17 15:39:33 +01:00
parent 158c2a7ccf
commit 6b73ca4b21

View File

@@ -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
}
}