From bdf215d0f192544722ac366f463ee1c089a59fb4 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Sat, 6 May 2017 16:55:12 +1200 Subject: [PATCH] TCP connection at the front menu will no longer bug out if the socket is bugged. - Timeout set on connection socket so that the socket will return false after 5 seconds. #story[782] --- .../seng302/Controllers/RaceController.java | 1 + .../src/main/java/seng302/RaceConnection.java | 5 ++++- .../main/java/seng302/VisualiserInput.java | 22 +++++++++++-------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index f8ae9a1f..1e62b9c1 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -85,6 +85,7 @@ public class RaceController extends Controller { raceMap.setBoats(boats); raceMap.update(); raceBoundaries.draw(); + //stop if the visualiser is no longer running } /** diff --git a/visualiser/src/main/java/seng302/RaceConnection.java b/visualiser/src/main/java/seng302/RaceConnection.java index e78362e6..773fc367 100644 --- a/visualiser/src/main/java/seng302/RaceConnection.java +++ b/visualiser/src/main/java/seng302/RaceConnection.java @@ -4,6 +4,7 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.Socket; /** @@ -27,7 +28,9 @@ public class RaceConnection { */ @SuppressWarnings("unused") public boolean check() { - try(Socket s = new Socket(hostname.get(), port)) { + InetSocketAddress i = new InetSocketAddress(hostname.get(), port); + try (Socket s = new Socket();){ + s.connect(i, 5000); status.set("Ready"); return true; } catch (IOException e) {} diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index 8f2551ed..536db5c6 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -53,6 +53,8 @@ public class VisualiserInput implements Runnable private BufferedInputStream inStream; + private boolean receiverLoop = true; + public VisualiserInput(Socket socket, StreamedCourse course) throws IOException{ this.connectionSocket = socket; @@ -63,7 +65,6 @@ public class VisualiserInput implements Runnable this.boatStatus = new HashMap<>(); this.markRounding = new HashMap<>(); - //start Time this.lastHeartbeatTime = System.currentTimeMillis(); } @@ -169,10 +170,16 @@ public class VisualiserInput implements Runnable } public void run(){ + this.receiverLoop = true; try{ //receiver loop that gets the input - boolean receiverLoop = true; while(receiverLoop) { + //if no heartbeat has been received in more than 6 seconds + //the connection will need to be restarted + if (timeSinceHeartbeat() > 6){ + System.out.println("Connection has stopped, trying to reconnect"); + receiverLoop = false; + } //converts the input into a byte array that can be read by the decoder byte[] binaryMessage = getBytes(); //if there is no bytes read. @@ -279,19 +286,16 @@ public class VisualiserInput implements Runnable System.out.println("Broken Message!"); break; } - - //if no heartbeat has been received in more than 6 seconds - //the connection will need to be restarted - if (timeSinceHeartbeat() > 6){ - System.out.println("Connection has stopped, trying to reconnect"); - receiverLoop = false; - } } }catch(IOException e){ e.printStackTrace(); } } + public boolean isReceiverLoop() { + return receiverLoop; + } + public static void main(String argv[]) throws Exception { Socket socket = new Socket("livedata.americascup.com", 4941);