From f942bbbc92ea051a3e5caaeb05e50be7a729f52e Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 15:02:45 +0200 Subject: [PATCH 1/4] Connections, Applied Data objects, removed parsers and Made genereric data handling --- .../src/netwerkprog/game/client/MainGame.java | 12 +++- core/src/netwerkprog/game/client/Parser.java | 15 ----- .../client/{ => game/connections}/Client.java | 44 +++++++------- core/src/netwerkprog/game/server/Parser.java | 43 -------------- core/src/netwerkprog/game/server/Server.java | 5 +- .../netwerkprog/game/server/ServerClient.java | 39 ++++++------ .../server/controllers/DataController.java | 16 ++++- .../server/controllers/SessionController.java | 59 ++++++++++--------- .../game/util/data/CharacterData.java | 15 +++++ core/src/netwerkprog/game/util/data/Data.java | 23 ++++++++ .../game/util/data/DataCallback.java | 5 ++ 11 files changed, 140 insertions(+), 136 deletions(-) delete mode 100644 core/src/netwerkprog/game/client/Parser.java rename core/src/netwerkprog/game/client/{ => game/connections}/Client.java (66%) delete mode 100644 core/src/netwerkprog/game/server/Parser.java create mode 100644 core/src/netwerkprog/game/util/data/CharacterData.java create mode 100644 core/src/netwerkprog/game/util/data/DataCallback.java diff --git a/core/src/netwerkprog/game/client/MainGame.java b/core/src/netwerkprog/game/client/MainGame.java index 65e9ced..e95f20d 100644 --- a/core/src/netwerkprog/game/client/MainGame.java +++ b/core/src/netwerkprog/game/client/MainGame.java @@ -13,13 +13,16 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import netwerkprog.game.client.game.characters.Hacker; import netwerkprog.game.client.game.characters.Team; import netwerkprog.game.client.game.characters.abilities.BodySwap; +import netwerkprog.game.client.game.connections.Client; import netwerkprog.game.client.game.map.Map; import netwerkprog.game.client.game.map.MapRenderer; import netwerkprog.game.client.game.map.GameInputProcessor; +import netwerkprog.game.util.data.Data; +import netwerkprog.game.util.data.DataCallback; import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.graphics.FrameRate; -public class MainGame extends ApplicationAdapter { +public class MainGame extends ApplicationAdapter implements DataCallback { SpriteBatch batch; float screenWidth; float screenHeight; @@ -116,7 +119,7 @@ public class MainGame extends ApplicationAdapter { private void connectToServer() { - client = new Thread(new Client("localhost")); + client = new Thread(new Client("localhost", this)); try { client.start(); } catch (Exception e) { @@ -197,4 +200,9 @@ public class MainGame extends ApplicationAdapter { public Team getTeam() { return team; } + + @Override + public void onDataReceived(Data data) { + + } } diff --git a/core/src/netwerkprog/game/client/Parser.java b/core/src/netwerkprog/game/client/Parser.java deleted file mode 100644 index 79849cb..0000000 --- a/core/src/netwerkprog/game/client/Parser.java +++ /dev/null @@ -1,15 +0,0 @@ -package netwerkprog.game.client; - -import netwerkprog.game.util.data.ParserCallback; - -public class Parser { - private final ParserCallback callback; - - public Parser(ParserCallback callback) { - this.callback = callback; - } - - public void parse(String data) { - callback.onDataReceived(data); - } -} diff --git a/core/src/netwerkprog/game/client/Client.java b/core/src/netwerkprog/game/client/game/connections/Client.java similarity index 66% rename from core/src/netwerkprog/game/client/Client.java rename to core/src/netwerkprog/game/client/game/connections/Client.java index 93d6d2a..b0f8623 100644 --- a/core/src/netwerkprog/game/client/Client.java +++ b/core/src/netwerkprog/game/client/game/connections/Client.java @@ -1,28 +1,26 @@ -package netwerkprog.game.client; +package netwerkprog.game.client.game.connections; import netwerkprog.game.util.application.Controller; import netwerkprog.game.util.data.Data; -import netwerkprog.game.util.data.ParserCallback; +import netwerkprog.game.util.data.DataCallback; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; import java.net.Socket; import java.util.Arrays; -public class Client extends Controller implements ParserCallback { +public class Client extends Controller { private final int port; private final String hostname; - private final Parser parser; private boolean isConnected = true; private Socket socket; private Thread receiveThread; - private DataOutputStream outputStream; + private DataCallback callback; + private ObjectOutputStream outputStream; - public Client(String hostname) { + public Client(String hostname, DataCallback callback) { this.port = Data.port(); this.hostname = hostname; - this.parser = new Parser(this); + this.callback = callback; } /** @@ -41,8 +39,8 @@ public class Client extends Controller implements ParserCallback { System.out.println("[CLIENT] connecting to server on port " + this.port); try { this.socket = new Socket(this.hostname, this.port); - DataInputStream in = new DataInputStream(socket.getInputStream()); - this.outputStream = new DataOutputStream(socket.getOutputStream()); + ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); + this.outputStream = new ObjectOutputStream(socket.getOutputStream()); this.receiveThread = new Thread( () -> receive(in)); @@ -56,11 +54,11 @@ public class Client extends Controller implements ParserCallback { /** * Sends a message to the server. - * @param message The message to send. + * @param data The message to send. */ - public void send(String message) { + public void send(Data data) { try { - this.outputStream.writeUTF(message); + this.outputStream.writeObject(data); } catch (IOException e) { e.printStackTrace(); } @@ -70,11 +68,14 @@ public class Client extends Controller implements ParserCallback { * Receives a message from the server. * @param in The inputStream */ - public void receive(DataInputStream in) { + public void receive(ObjectInputStream in) { while (isConnected) { try { - this.parser.parse(in.readUTF()); - } catch (IOException e) { + Object object = in.readObject(); + if (object instanceof Data) { + callback.onDataReceived((Data) object); + } + } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } @@ -88,7 +89,7 @@ public class Client extends Controller implements ParserCallback { e.printStackTrace(); } - send("Disconnect"); + //send("Disconnect"); try { this.socket.close(); @@ -96,9 +97,4 @@ public class Client extends Controller implements ParserCallback { e.printStackTrace(); } } - - @Override - public void onDataReceived(String data) { - System.out.println(data); - } } diff --git a/core/src/netwerkprog/game/server/Parser.java b/core/src/netwerkprog/game/server/Parser.java deleted file mode 100644 index c4dcb44..0000000 --- a/core/src/netwerkprog/game/server/Parser.java +++ /dev/null @@ -1,43 +0,0 @@ -package netwerkprog.game.server; - -import netwerkprog.game.client.game.characters.DevTest1; -import netwerkprog.game.client.game.characters.DevTest2; -import netwerkprog.game.client.game.characters.DevTest3; -import netwerkprog.game.server.controllers.DataController; -import netwerkprog.game.util.data.ParserCallback; - -import java.util.Scanner; - -public class Parser { - private final ParserCallback callback; - private Scanner scanner; - - private final DataController dataController; - - public Parser(ParserCallback callback) { - this.callback = callback; - this.dataController = new DataController(); - - this.dataController.addAllCharacters(new DevTest1(), new DevTest2(), new DevTest3()); - } - - public void parse(String request) { - String data = ""; - this.scanner = new Scanner(request); - scanner.useDelimiter("~"); - String type = scanner.next(); - String name = scanner.next(); - - if (type.equals("character")) { - try { - data = dataController.getCharacter(name).toString(); - } catch (IllegalArgumentException ex) { - data = ex.getMessage(); - } - } - - - - callback.onDataReceived(data); - } -} diff --git a/core/src/netwerkprog/game/server/Server.java b/core/src/netwerkprog/game/server/Server.java index 1e48ddb..61ea202 100644 --- a/core/src/netwerkprog/game/server/Server.java +++ b/core/src/netwerkprog/game/server/Server.java @@ -1,16 +1,19 @@ package netwerkprog.game.server; +import netwerkprog.game.server.controllers.DataController; import netwerkprog.game.server.controllers.SessionController; import java.util.HashMap; public class Server { private SessionController sessionController; + private DataController dataController; private Thread sessionThread; private HashMap gameThreads; public void start() { - this.sessionController = new SessionController(); + this.sessionController = new SessionController(this); + this.dataController = new DataController(); this.gameThreads = new HashMap<>(); this.sessionThread = new Thread(sessionController); diff --git a/core/src/netwerkprog/game/server/ServerClient.java b/core/src/netwerkprog/game/server/ServerClient.java index f937bf4..1bed958 100644 --- a/core/src/netwerkprog/game/server/ServerClient.java +++ b/core/src/netwerkprog/game/server/ServerClient.java @@ -1,28 +1,30 @@ package netwerkprog.game.server; +import netwerkprog.game.server.controllers.DataController; import netwerkprog.game.server.controllers.SessionController; -import netwerkprog.game.util.data.ParserCallback; +import netwerkprog.game.util.data.Data; +import netwerkprog.game.util.data.DataCallback; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.net.Socket; -public class ServerClient implements Runnable, ParserCallback { - private DataInputStream in; - private DataOutputStream out; +public class ServerClient implements Runnable { + private ObjectInputStream in; + private ObjectOutputStream out; private final String name; private final SessionController server; - private final Parser parser; + private final DataCallback callback; private boolean isConnected; - public ServerClient(String name, Socket socket, SessionController server) { + public ServerClient(String name, Socket socket, SessionController server, DataController dataController) { this.name = name; this.server = server; - this.parser = new Parser(this); + this.callback = dataController; try { - this.in = new DataInputStream(socket.getInputStream()); - this.out = new DataOutputStream(socket.getOutputStream()); + this.in = new ObjectInputStream(socket.getInputStream()); + this.out = new ObjectOutputStream(socket.getOutputStream()); this.isConnected = true; } catch (IOException e) { this.isConnected = false; @@ -30,9 +32,9 @@ public class ServerClient implements Runnable, ParserCallback { } } - public void writeUTF(String text) { + public void writeData(Data data) { try { - this.out.writeUTF(text); + this.out.writeObject(data); } catch (IOException e) { e.printStackTrace(); } @@ -42,14 +44,14 @@ public class ServerClient implements Runnable, ParserCallback { public void run() { while (this.isConnected) { try { - String received = this.in.readUTF(); - this.parser.parse(received); - + callback.onDataReceived((Data) this.in.readObject()); } catch (IOException e) { System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage()); System.out.println("[SERVERCLIENT] terminating failing connection..."); this.isConnected = false; System.out.println("[SERVERCLIENT] done!"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); } } } @@ -57,9 +59,4 @@ public class ServerClient implements Runnable, ParserCallback { public String getName() { return this.name; } - - @Override - public void onDataReceived(String data) { - writeUTF(data); - } } diff --git a/core/src/netwerkprog/game/server/controllers/DataController.java b/core/src/netwerkprog/game/server/controllers/DataController.java index f1de4bc..ab097a5 100644 --- a/core/src/netwerkprog/game/server/controllers/DataController.java +++ b/core/src/netwerkprog/game/server/controllers/DataController.java @@ -1,11 +1,14 @@ package netwerkprog.game.server.controllers; +import netwerkprog.game.util.data.CharacterData; +import netwerkprog.game.util.data.Data; +import netwerkprog.game.util.data.DataCallback; import netwerkprog.game.util.game.GameCharacter; import java.util.Arrays; import java.util.HashSet; -public class DataController { +public class DataController implements DataCallback { private final HashSet gameCharacters; public DataController() { @@ -44,4 +47,15 @@ public class DataController { } throw new IllegalArgumentException("The character does not exist."); } + + @Override + public void onDataReceived(Data data) { + switch (data.getType()) { + case "Character" : + if (data.getPayload() instanceof CharacterData) { + + } + break; + } + } } diff --git a/core/src/netwerkprog/game/server/controllers/SessionController.java b/core/src/netwerkprog/game/server/controllers/SessionController.java index 94a7c0b..2b64825 100644 --- a/core/src/netwerkprog/game/server/controllers/SessionController.java +++ b/core/src/netwerkprog/game/server/controllers/SessionController.java @@ -1,12 +1,11 @@ package netwerkprog.game.server.controllers; +import netwerkprog.game.server.Server; import netwerkprog.game.server.ServerClient; import netwerkprog.game.util.application.Controller; import netwerkprog.game.util.data.Data; -import java.io.DataInputStream; import java.io.IOException; -import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; @@ -17,12 +16,14 @@ import java.util.Set; * The sessionController manages any connections from new clients and assigns individual threads to said clients. */ public class SessionController extends Controller { + private Server server; private ServerSocket serverSocket; private final ArrayList clients = new ArrayList<>(); private final HashMap clientThreads = new HashMap<>(); private boolean listening; - public SessionController() { + public SessionController(Server server) { + this.server = server; this.listening = true; } @@ -56,46 +57,46 @@ public class SessionController extends Controller { * @param socket The socket used for the client connections. */ public void registerClient(Socket socket) { - try { - System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); - ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); - DataInputStream inputStream = new DataInputStream(socket.getInputStream()); - - outputStream.writeUTF("Enter username: "); - String username = inputStream.readUTF(); - - System.out.println("[SERVER] got username " + username); - ServerClient serverClient = new ServerClient(username, socket, this); - - Thread t = new Thread(serverClient); - t.start(); - - this.clientThreads.put(username,t); - this.clients.add(serverClient); - } catch (IOException ex) { - ex.printStackTrace(); - } +// try { +// System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); +// ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); +// DataInputStream inputStream = new DataInputStream(socket.getInputStream()); +// +// outputStream.writeUTF("Enter username: "); +// String username = inputStream.readUTF(); +// +// System.out.println("[SERVER] got username " + username); +// ServerClient serverClient = new ServerClient(username, socket, this); +// +// Thread t = new Thread(serverClient); +// t.start(); +// +// this.clientThreads.put(username,t); +// this.clients.add(serverClient); +// } catch (IOException ex) { +// ex.printStackTrace(); +// } } /** * Sends a server message to all connected clients. - * @param text message. + * @param data message. */ - public void serverMessage(String text) { + public void serverMessage(Data data) { for (ServerClient serverClient : clients) { - serverClient.writeUTF(text); + serverClient.writeData(data); } } /** * Sends a message to a specific user. * @param name user. - * @param text message. + * @param data message. */ - public void personalMessage(String name, String text) { + public void personalMessage(String name, Data data) { for (ServerClient serverClient : clients) { if (serverClient.getName().equals(name)) { - serverClient.writeUTF(text); + serverClient.writeData(data); break; } } @@ -113,7 +114,7 @@ public class SessionController extends Controller { e.printStackTrace(); } this.clientThreads.remove(serverClient.getName()); - this.serverMessage(serverClient.getName() + " left!"); + //this.serverMessage(serverClient.getName() + " left!"); } /** diff --git a/core/src/netwerkprog/game/util/data/CharacterData.java b/core/src/netwerkprog/game/util/data/CharacterData.java new file mode 100644 index 0000000..b034d63 --- /dev/null +++ b/core/src/netwerkprog/game/util/data/CharacterData.java @@ -0,0 +1,15 @@ +package netwerkprog.game.util.data; + +import netwerkprog.game.util.game.GameCharacter; + +public class CharacterData extends Data { + private final String name; + private final GameCharacter character; + + public CharacterData(String name, GameCharacter character) { + super("Character"); + super.setPayload(this); + this.name = name; + this.character = character; + } +} diff --git a/core/src/netwerkprog/game/util/data/Data.java b/core/src/netwerkprog/game/util/data/Data.java index 2bdcce4..9d42c1f 100644 --- a/core/src/netwerkprog/game/util/data/Data.java +++ b/core/src/netwerkprog/game/util/data/Data.java @@ -4,4 +4,27 @@ public class Data { public static int port() { return 8000; } + + private String objectType; + private Data payload; + + public Data(String type) { + this.objectType = type; + } + + public void setObjectType(String objectType) { + this.objectType = objectType; + } + + public void setPayload(Data payload) { + this.payload = payload; + } + + public String getType() { + return objectType; + } + + public Data getPayload() { + return payload; + } } diff --git a/core/src/netwerkprog/game/util/data/DataCallback.java b/core/src/netwerkprog/game/util/data/DataCallback.java new file mode 100644 index 0000000..95b2d88 --- /dev/null +++ b/core/src/netwerkprog/game/util/data/DataCallback.java @@ -0,0 +1,5 @@ +package netwerkprog.game.util.data; + +public interface DataCallback { + void onDataReceived(Data data); +} -- 2.47.2 From 3dbffa4ffb7c5d23ebcc9a272de74c4f8f5339dc Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 15:44:53 +0200 Subject: [PATCH 2/4] Finished server side registration. --- core/src/netwerkprog/game/server/Server.java | 4 ++ .../server/controllers/SessionController.java | 64 +++++++++++++------ .../game/util/data/ConnectionData.java | 21 ++++++ 3 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 core/src/netwerkprog/game/util/data/ConnectionData.java diff --git a/core/src/netwerkprog/game/server/Server.java b/core/src/netwerkprog/game/server/Server.java index 61ea202..3326979 100644 --- a/core/src/netwerkprog/game/server/Server.java +++ b/core/src/netwerkprog/game/server/Server.java @@ -35,4 +35,8 @@ public class Server { // gameThreads.get(game).start(); // } } + + public DataController getDataController() { + return dataController; + } } diff --git a/core/src/netwerkprog/game/server/controllers/SessionController.java b/core/src/netwerkprog/game/server/controllers/SessionController.java index 2b64825..f81ac5c 100644 --- a/core/src/netwerkprog/game/server/controllers/SessionController.java +++ b/core/src/netwerkprog/game/server/controllers/SessionController.java @@ -3,9 +3,12 @@ package netwerkprog.game.server.controllers; import netwerkprog.game.server.Server; import netwerkprog.game.server.ServerClient; import netwerkprog.game.util.application.Controller; +import netwerkprog.game.util.data.ConnectionData; import netwerkprog.game.util.data.Data; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; @@ -57,25 +60,48 @@ public class SessionController extends Controller { * @param socket The socket used for the client connections. */ public void registerClient(Socket socket) { -// try { -// System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); -// ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); -// DataInputStream inputStream = new DataInputStream(socket.getInputStream()); -// -// outputStream.writeUTF("Enter username: "); -// String username = inputStream.readUTF(); -// -// System.out.println("[SERVER] got username " + username); -// ServerClient serverClient = new ServerClient(username, socket, this); -// -// Thread t = new Thread(serverClient); -// t.start(); -// -// this.clientThreads.put(username,t); -// this.clients.add(serverClient); -// } catch (IOException ex) { -// ex.printStackTrace(); -// } + try { + System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); + ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); + ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); + + String username; + + outputStream.writeObject(new ConnectionData("Connect", "Please give a username")); + Object object = inputStream.readObject(); + if (object instanceof Data) { + Data data = (Data) object; + if (data instanceof ConnectionData) { + ConnectionData connectionData = (ConnectionData) data.getPayload(); + if (connectionData.getAction().equals("Connect")) { + username = connectionData.getMessage(); + } else { + //todo error messaging. + registerClient(socket); + return; + } + } else { + //todo error messaging. + registerClient(socket); + return; + } + } else { + //todo error messaging. + registerClient(socket); + return; + } + + System.out.println("[SERVER] got username " + username); + ServerClient serverClient = new ServerClient(username, socket, this, server.getDataController()); + + Thread t = new Thread(serverClient); + t.start(); + + this.clientThreads.put(username,t); + this.clients.add(serverClient); + } catch (IOException | ClassNotFoundException ex) { + ex.printStackTrace(); + } } /** diff --git a/core/src/netwerkprog/game/util/data/ConnectionData.java b/core/src/netwerkprog/game/util/data/ConnectionData.java new file mode 100644 index 0000000..9d3aefe --- /dev/null +++ b/core/src/netwerkprog/game/util/data/ConnectionData.java @@ -0,0 +1,21 @@ +package netwerkprog.game.util.data; + +public class ConnectionData extends Data { + private final String action; + private final String message; + + public ConnectionData(String action, String username) { + super("Connection"); + super.setPayload(this); + this.action = action; + this.message = username; + } + + public String getAction() { + return action; + } + + public String getMessage() { + return message; + } +} -- 2.47.2 From 9349e6ce488040ee750c2da412b054ae4cdb538e Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 16:42:44 +0200 Subject: [PATCH 3/4] Finished Server/Client registration and communications --- .../src/netwerkprog/game/client/MainGame.java | 2 +- .../game/client/game/connections/Client.java | 37 ++++++++++++++++--- .../netwerkprog/game/server/ServerClient.java | 29 +++++++++------ .../server/controllers/SessionController.java | 36 +++++++++--------- .../game/util/data/CharacterData.java | 4 +- .../game/util/data/ConnectionData.java | 8 ++-- core/src/netwerkprog/game/util/data/Data.java | 4 +- .../game/util/game/GameCharacter.java | 6 +-- 8 files changed, 82 insertions(+), 44 deletions(-) diff --git a/core/src/netwerkprog/game/client/MainGame.java b/core/src/netwerkprog/game/client/MainGame.java index e95f20d..a6e1753 100644 --- a/core/src/netwerkprog/game/client/MainGame.java +++ b/core/src/netwerkprog/game/client/MainGame.java @@ -90,7 +90,7 @@ public class MainGame extends ApplicationAdapter implements DataCallback { // playSong(); -// connectToServer(); + connectToServer(); } private void initCharacters() { diff --git a/core/src/netwerkprog/game/client/game/connections/Client.java b/core/src/netwerkprog/game/client/game/connections/Client.java index b0f8623..16167cd 100644 --- a/core/src/netwerkprog/game/client/game/connections/Client.java +++ b/core/src/netwerkprog/game/client/game/connections/Client.java @@ -1,21 +1,25 @@ package netwerkprog.game.client.game.connections; import netwerkprog.game.util.application.Controller; +import netwerkprog.game.util.data.ConnectionData; import netwerkprog.game.util.data.Data; import netwerkprog.game.util.data.DataCallback; -import java.io.*; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Arrays; public class Client extends Controller { private final int port; private final String hostname; - private boolean isConnected = true; + private boolean isConnected; private Socket socket; private Thread receiveThread; private DataCallback callback; private ObjectOutputStream outputStream; + private boolean connecting; public Client(String hostname, DataCallback callback) { this.port = Data.port(); @@ -37,14 +41,15 @@ public class Client extends Controller { */ public void connect() { System.out.println("[CLIENT] connecting to server on port " + this.port); + this.connecting = true; try { this.socket = new Socket(this.hostname, this.port); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); this.outputStream = new ObjectOutputStream(socket.getOutputStream()); - + register(in); this.receiveThread = new Thread( () -> receive(in)); - } catch (IOException e) { + this.connecting = false; System.out.println("[CLIENT] there was an error connecting : " + e.getMessage()); StringBuilder sb = new StringBuilder(" Stacktrace : "); Arrays.stream(e.getStackTrace()).forEach(n -> sb.append("\t\t").append(n).append("\n")); @@ -52,6 +57,28 @@ public class Client extends Controller { } } + public void register(ObjectInputStream in) { + while (connecting) { + String username = "DEV"; + send(new ConnectionData("Connect", username)); + try { + Object object = in.readObject(); + if (object instanceof Data) { + Data data = (Data) object; + if (data.getPayload() instanceof ConnectionData) { + ConnectionData connectionData = (ConnectionData) data.getPayload(); + if (connectionData.getAction().equals("Connect") && connectionData.getMessage().equals("Confirm")){ + this.connecting = false; + this.isConnected = true; + } + } + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + /** * Sends a message to the server. * @param data The message to send. @@ -89,7 +116,7 @@ public class Client extends Controller { e.printStackTrace(); } - //send("Disconnect"); + send(new ConnectionData("Disconnect", "DEV")); try { this.socket.close(); diff --git a/core/src/netwerkprog/game/server/ServerClient.java b/core/src/netwerkprog/game/server/ServerClient.java index 1bed958..804594e 100644 --- a/core/src/netwerkprog/game/server/ServerClient.java +++ b/core/src/netwerkprog/game/server/ServerClient.java @@ -2,13 +2,13 @@ package netwerkprog.game.server; import netwerkprog.game.server.controllers.DataController; import netwerkprog.game.server.controllers.SessionController; +import netwerkprog.game.util.data.ConnectionData; import netwerkprog.game.util.data.Data; import netwerkprog.game.util.data.DataCallback; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.net.Socket; public class ServerClient implements Runnable { private ObjectInputStream in; @@ -18,18 +18,13 @@ public class ServerClient implements Runnable { private final DataCallback callback; private boolean isConnected; - public ServerClient(String name, Socket socket, SessionController server, DataController dataController) { + public ServerClient(String name, ObjectInputStream in, ObjectOutputStream out, SessionController server, DataController dataController) { this.name = name; this.server = server; this.callback = dataController; - try { - this.in = new ObjectInputStream(socket.getInputStream()); - this.out = new ObjectOutputStream(socket.getOutputStream()); - this.isConnected = true; - } catch (IOException e) { - this.isConnected = false; - e.printStackTrace(); - } + this.in = in; + this.out = out; + this.isConnected = true; } public void writeData(Data data) { @@ -44,7 +39,19 @@ public class ServerClient implements Runnable { public void run() { while (this.isConnected) { try { - callback.onDataReceived((Data) this.in.readObject()); + Object object = this.in.readObject(); + if (object instanceof Data) { + Data data = (Data) object; + if (data.getPayload() instanceof ConnectionData) { + ConnectionData connectionData = (ConnectionData) data.getPayload(); + if (connectionData.getAction().equals("Disconnect")) { + this.isConnected = false; + //todo properly remove thread. + } + } else { + callback.onDataReceived((Data) this.in.readObject()); + } + } } catch (IOException e) { System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage()); System.out.println("[SERVERCLIENT] terminating failing connection..."); diff --git a/core/src/netwerkprog/game/server/controllers/SessionController.java b/core/src/netwerkprog/game/server/controllers/SessionController.java index f81ac5c..4014704 100644 --- a/core/src/netwerkprog/game/server/controllers/SessionController.java +++ b/core/src/netwerkprog/game/server/controllers/SessionController.java @@ -65,34 +65,34 @@ public class SessionController extends Controller { ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); - String username; + String username = ""; + boolean registering = true; - outputStream.writeObject(new ConnectionData("Connect", "Please give a username")); - Object object = inputStream.readObject(); - if (object instanceof Data) { - Data data = (Data) object; - if (data instanceof ConnectionData) { - ConnectionData connectionData = (ConnectionData) data.getPayload(); - if (connectionData.getAction().equals("Connect")) { - username = connectionData.getMessage(); + while (registering) { + outputStream.writeObject(new ConnectionData("Connect", "Please give a username")); + Object object = inputStream.readObject(); + + if (object instanceof Data) { + Data data = (Data) object; + if (data instanceof ConnectionData) { + ConnectionData connectionData = (ConnectionData) data.getPayload(); + if (connectionData.getAction().equals("Connect")) { + username = connectionData.getMessage(); + outputStream.writeObject(new ConnectionData("Connect", "Confirm")); + registering = false; + } else { + //todo error messaging. + } } else { //todo error messaging. - registerClient(socket); - return; } } else { //todo error messaging. - registerClient(socket); - return; } - } else { - //todo error messaging. - registerClient(socket); - return; } System.out.println("[SERVER] got username " + username); - ServerClient serverClient = new ServerClient(username, socket, this, server.getDataController()); + ServerClient serverClient = new ServerClient(username, inputStream, outputStream, this, server.getDataController()); Thread t = new Thread(serverClient); t.start(); diff --git a/core/src/netwerkprog/game/util/data/CharacterData.java b/core/src/netwerkprog/game/util/data/CharacterData.java index b034d63..b89862a 100644 --- a/core/src/netwerkprog/game/util/data/CharacterData.java +++ b/core/src/netwerkprog/game/util/data/CharacterData.java @@ -2,7 +2,9 @@ package netwerkprog.game.util.data; import netwerkprog.game.util.game.GameCharacter; -public class CharacterData extends Data { +import java.io.Serializable; + +public class CharacterData extends Data implements Serializable { private final String name; private final GameCharacter character; diff --git a/core/src/netwerkprog/game/util/data/ConnectionData.java b/core/src/netwerkprog/game/util/data/ConnectionData.java index 9d3aefe..911181f 100644 --- a/core/src/netwerkprog/game/util/data/ConnectionData.java +++ b/core/src/netwerkprog/game/util/data/ConnectionData.java @@ -1,14 +1,16 @@ package netwerkprog.game.util.data; -public class ConnectionData extends Data { +import java.io.Serializable; + +public class ConnectionData extends Data implements Serializable { private final String action; private final String message; - public ConnectionData(String action, String username) { + public ConnectionData(String action, String message) { super("Connection"); super.setPayload(this); this.action = action; - this.message = username; + this.message = message; } public String getAction() { diff --git a/core/src/netwerkprog/game/util/data/Data.java b/core/src/netwerkprog/game/util/data/Data.java index 9d42c1f..24ed738 100644 --- a/core/src/netwerkprog/game/util/data/Data.java +++ b/core/src/netwerkprog/game/util/data/Data.java @@ -1,6 +1,8 @@ package netwerkprog.game.util.data; -public class Data { +import java.io.Serializable; + +public class Data implements Serializable { public static int port() { return 8000; } diff --git a/core/src/netwerkprog/game/util/game/GameCharacter.java b/core/src/netwerkprog/game/util/game/GameCharacter.java index db91787..a648998 100644 --- a/core/src/netwerkprog/game/util/game/GameCharacter.java +++ b/core/src/netwerkprog/game/util/game/GameCharacter.java @@ -1,17 +1,15 @@ package netwerkprog.game.util.game; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; +import java.io.Serializable; import java.util.Arrays; import java.util.HashSet; - import java.util.Objects; -public abstract class GameCharacter extends Actor implements Comparable { +public abstract class GameCharacter extends Actor implements Comparable, Serializable { protected String name; protected Faction faction; protected HashSet abilities; -- 2.47.2 From 15492cb91d7f5cdf4906f3ca6ba3d25ec5a86b37 Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 16:50:32 +0200 Subject: [PATCH 4/4] Fixed test build issue --- core/src/test/java/RestartSessionControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/RestartSessionControllerTest.java b/core/src/test/java/RestartSessionControllerTest.java index efd4ede..9d5f5b2 100644 --- a/core/src/test/java/RestartSessionControllerTest.java +++ b/core/src/test/java/RestartSessionControllerTest.java @@ -8,7 +8,7 @@ public class RestartSessionControllerTest { SessionController sessionController; Thread sessionThread; - sessionController = new SessionController(); + sessionController = new SessionController(null); sessionThread = new Thread(sessionController); sessionThread.start(); -- 2.47.2