From 928f5e31f0a417be2742655c75d542bce2052ddd Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Tue, 19 Sep 2017 02:15:34 +1200 Subject: [PATCH] Hopefully final version of Hosting #story[1188] --- racevisionGame/pom.xml | 12 +++ .../main/java/shared/utils/JsonReader.java | 50 +++++++++++++ .../Controllers/HostGameController.java | 6 +- .../Controllers/InGameLobbyController.java | 1 + .../Controllers/LobbyController.java | 34 ++++++--- .../visualiser/model/VisualiserRaceEvent.java | 2 + .../network/HttpMatchBrowserClient.java | 38 ++++++++++ .../network/HttpMatchBrowserHost.java | 75 +++++++++++++++++++ 8 files changed, 207 insertions(+), 11 deletions(-) create mode 100644 racevisionGame/src/main/java/shared/utils/JsonReader.java create mode 100644 racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserClient.java create mode 100644 racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserHost.java diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml index 98ccaf82..20a732be 100644 --- a/racevisionGame/pom.xml +++ b/racevisionGame/pom.xml @@ -78,6 +78,18 @@ 0.7 + + org.apache.httpcomponents + httpclient + 4.5.3 + + + + org.json + json + 20160810 + + diff --git a/racevisionGame/src/main/java/shared/utils/JsonReader.java b/racevisionGame/src/main/java/shared/utils/JsonReader.java new file mode 100644 index 00000000..476c3fed --- /dev/null +++ b/racevisionGame/src/main/java/shared/utils/JsonReader.java @@ -0,0 +1,50 @@ +package shared.utils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.*; +import java.net.URL; +import java.nio.charset.Charset; + +/** + * Created by Gondr on 23/05/2017. + */ +public class JsonReader { + + private static String readAll(Reader rd) throws IOException { + StringBuilder sb = new StringBuilder(); + int cp; + while ((cp = rd.read()) != -1) { + sb.append((char) cp); + } + return sb.toString(); + } + + public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { + InputStream is = new URL(url).openStream(); + try { + BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); + String jsonText = readAll(rd); + JSONObject json = new JSONObject(jsonText); + return json; + } catch (JSONException e) { + return null; + } finally { + is.close(); + } + } + + public static JSONArray readJsonFromUrlArray(String url) throws IOException, JSONException { + InputStream is = new URL(url).openStream(); + try { + BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); + String jsonText = readAll(rd); + JSONArray json = new JSONArray(jsonText); + return json; + } finally { + is.close(); + } + } +} diff --git a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java index abd681f5..232e3361 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/HostGameController.java @@ -10,6 +10,7 @@ import mock.app.Event; import mock.exceptions.EventConstructionException; import visualiser.app.App; import visualiser.app.MatchBrowserSingleton; +import visualiser.network.HttpMatchBrowserHost; import visualiser.network.MatchBrowserInterface; import java.io.IOException; @@ -64,8 +65,11 @@ public class HostGameController extends Controller { try { App.game = new Event(false, currentMapIndex); App.gameType = currentMapIndex; + + HttpMatchBrowserHost matchBrowserHost = new HttpMatchBrowserHost(); + new Thread(matchBrowserHost).start(); connectSocket("localhost", 4942); - alertMatchBrowser(); + //alertMatchBrowser(); } catch (EventConstructionException e) { Logger.getGlobal().log(Level.SEVERE, "Could not create Event.", e); diff --git a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java index 733d20e0..3fd5a377 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/InGameLobbyController.java @@ -28,6 +28,7 @@ import visualiser.layout.View3D; import visualiser.model.VisualiserBoat; import visualiser.model.VisualiserRaceEvent; import visualiser.model.VisualiserRaceState; +import visualiser.network.HttpMatchBrowserHost; import java.io.IOException; import java.net.Socket; diff --git a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java index ef8a5350..8657152a 100644 --- a/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java +++ b/racevisionGame/src/main/java/visualiser/Controllers/LobbyController.java @@ -1,6 +1,7 @@ package visualiser.Controllers; import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.Button; @@ -10,8 +11,12 @@ import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import javafx.scene.media.AudioClip; import network.Messages.HostGame; +import org.json.JSONArray; +import org.json.JSONObject; +import shared.utils.JsonReader; import visualiser.app.MatchBrowserSingleton; import visualiser.model.RaceConnection; +import visualiser.network.HttpMatchBrowserClient; import visualiser.network.MatchBrowserLobbyInterface; import java.io.IOException; @@ -39,17 +44,17 @@ public class LobbyController extends Controller { private AudioClip sound; //the socket for match browser - private DatagramSocket udpSocket; - private MatchBrowserLobbyInterface matchBrowserLobbyInterface; + private HttpMatchBrowserClient httpMatchBrowserClient; public void initialize() { + httpMatchBrowserClient = new HttpMatchBrowserClient(); + new Thread(httpMatchBrowserClient, "Match Client").start(); // set up the connection table - connections = FXCollections.observableArrayList(); customConnections = FXCollections.observableArrayList(); //connections.add(new RaceConnection("localhost", 4942, "Local Game")); - lobbyTable.setItems(connections); + lobbyTable.setItems(httpMatchBrowserClient.connections); gameNameColumn.setCellValueFactory(cellData -> cellData.getValue().gamenameProperty()); hostNameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); @@ -63,7 +68,6 @@ public class LobbyController extends Controller { }); joinGameBtn.setDisable(true); - this.udpSocket = MatchBrowserSingleton.getInstance().getUdpSocket(); receiveMatchData(); } @@ -91,6 +95,7 @@ public class LobbyController extends Controller { * @throws IOException socket error */ public void connectSocket() throws IOException { + httpMatchBrowserClient.interrupt(); RaceConnection connection = lobbyTable.getSelectionModel().getSelectedItem(); Socket socket = new Socket(connection.getHostname(), connection.getPort()); InGameLobbyController iglc = (InGameLobbyController)loadScene("gameLobby.fxml"); @@ -100,7 +105,7 @@ public class LobbyController extends Controller { public void menuBtnPressed() throws IOException { sound = new AudioClip(this.getClass().getResource("/visualiser/sounds/buttonpress.wav").toExternalForm()); sound.play(); - matchBrowserLobbyInterface.closeSocket(); + httpMatchBrowserClient.interrupt(); loadScene("title.fxml"); } @@ -124,6 +129,7 @@ public class LobbyController extends Controller { } public void receiveMatchData(){ + /* matchBrowserLobbyInterface = new MatchBrowserLobbyInterface(); try { matchBrowserLobbyInterface.startReceivingHostData(new DatagramSocket(4941)); @@ -136,17 +142,25 @@ public class LobbyController extends Controller { matchBrowserLobbyInterface.addObserver(o); } catch (SocketException e) { System.err.println("Socket 4941 in use"); - } + }*/ } /** * Adds the games received from the server */ private void addServerGames() { - connections.clear(); - connections.addAll(customConnections); + httpMatchBrowserClient.connections.clear(); + httpMatchBrowserClient.connections.addAll(customConnections); + httpMatchBrowserClient.connections.addListener(new ListChangeListener() { + @Override + public void onChanged(Change c) { + refreshBtnPressed(); + } + }); + + /* for (HostGame game : matchBrowserLobbyInterface.getGames()) { connections.add(new RaceConnection(game.getIp(), 4942, "Boat Game")); - } + }*/ } } diff --git a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java index f546ec79..5d786d90 100644 --- a/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java +++ b/racevisionGame/src/main/java/visualiser/model/VisualiserRaceEvent.java @@ -8,6 +8,7 @@ import shared.dataInput.EmptyBoatDataSource; import shared.dataInput.EmptyRaceDataSource; import shared.dataInput.EmptyRegattaDataSource; import visualiser.gameController.ControllerClient; +import visualiser.network.HttpMatchBrowserHost; import visualiser.network.ServerConnection; import java.io.IOException; @@ -115,5 +116,6 @@ public class VisualiserRaceEvent { this.visualiserRaceServiceThread.interrupt(); this.serverConnectionThread.interrupt(); serverConnection.terminate(); + HttpMatchBrowserHost.httpMatchBrowserHost.interrupt(); } } diff --git a/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserClient.java b/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserClient.java new file mode 100644 index 00000000..d6e41530 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserClient.java @@ -0,0 +1,38 @@ +package visualiser.network; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import org.json.JSONArray; +import org.json.JSONObject; +import shared.utils.JsonReader; +import visualiser.model.RaceConnection; + +import java.io.IOException; + +/** + * Created by Gondr on 19/09/2017. + */ +public class HttpMatchBrowserClient extends Thread { + public ObservableList connections = FXCollections.observableArrayList(); + + @Override + public void run() { + while(!Thread.interrupted()) { + try { + JSONArray cons = JsonReader.readJsonFromUrlArray("http://api.umbrasheep.com/seng/get_matches/"); + System.out.println("Got stuff"); + System.out.println(cons.toString()); + for (int i = 0; i < cons.length(); i++) { + JSONObject con = (JSONObject) cons.get(i); + connections.add(new RaceConnection((String) con.get("ip_address"), con.getInt("port"), "Boat Game")); + } + + Thread.sleep(5000); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserHost.java b/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserHost.java new file mode 100644 index 00000000..c0ad21d1 --- /dev/null +++ b/racevisionGame/src/main/java/visualiser/network/HttpMatchBrowserHost.java @@ -0,0 +1,75 @@ +package visualiser.network; + + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Gondr on 19/09/2017. + */ +public class HttpMatchBrowserHost extends Thread { + private HttpClient httpClient; + private List params; + + public static HttpMatchBrowserHost httpMatchBrowserHost = null; + + public HttpMatchBrowserHost() throws IOException { + httpMatchBrowserHost = this; + httpClient = HttpClients.createDefault(); + + // Request parameters and other properties. + params = new ArrayList<>(2); + params.add(new BasicNameValuePair("port", "4942")); + params.add(new BasicNameValuePair("magic", "Thomas and Seng")); + + sendHttp("http://api.umbrasheep.com/seng/registermatch/"); + System.out.println("Register Match"); + } + + public void sendHttp(String domain) throws IOException { + HttpPost httppost = new HttpPost(domain); + httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + + //Execute and get the response. + HttpResponse response = httpClient.execute(httppost); + HttpEntity entity = response.getEntity(); + + if (entity != null) { + InputStream instream = entity.getContent(); + try { + // do something useful + } finally { + instream.close(); + } + } else { + throw new IOException("No Response from Host"); + } + } + + @Override + public void run() { + while(!Thread.interrupted()){ + try { + sendHttp("http://api.umbrasheep.com/seng/keep_match_alive/"); + System.out.println("Keep match ALive"); + Thread.sleep(2000); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +}