From f942bbbc92ea051a3e5caaeb05e50be7a729f52e Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 15:02:45 +0200 Subject: [PATCH 1/6] 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/6] 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/6] 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/6] 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 From 272a3c69667faaa01986b39eb157200f32f77be1 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Sat, 6 Jun 2020 22:48:45 +0200 Subject: [PATCH 5/6] temp --- core/src/netwerkprog/game/client/MainGame.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/netwerkprog/game/client/MainGame.java b/core/src/netwerkprog/game/client/MainGame.java index 63e3bbf..4f5b1da 100644 --- a/core/src/netwerkprog/game/client/MainGame.java +++ b/core/src/netwerkprog/game/client/MainGame.java @@ -117,7 +117,6 @@ public class MainGame extends ApplicationAdapter { this.team = new Team(); this.enemyTeam = new Team(); - System.out.println(this.chosenFaction); for (int i = 1; i <= 5; i++) { GameCharacter temp = new Hacker("hacker" + i, characters[5][0], new BodySwap("test")); -- 2.47.2 From 8d99753f7c7f3a69a7e1718bd63891e076e27743 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Sat, 6 Jun 2020 22:50:47 +0200 Subject: [PATCH 6/6] merge with master Squashed commit of the following: commit ec0d0c3531d316bbd5a2430f055a61b7b332c96d Merge: cb2ef90 15492cb Author: SemvdH <45453592+SemvdH@users.noreply.github.com> Date: Sat Jun 6 22:43:28 2020 +0200 Merge pull request #10 from SemvdH/Connections Connections commit 15492cb91d7f5cdf4906f3ca6ba3d25ec5a86b37 Author: MickWerf Date: Sat Jun 6 16:50:32 2020 +0200 Fixed test build issue commit 4b7eaaa6411b85a1677c27971522df95f28b18b6 Merge: 9349e6c c07c860 Author: MickWerf Date: Sat Jun 6 16:47:59 2020 +0200 Merge branch 'master' into Connections * master: optimize imports fixed memory leaks made only possible to select own factions characters made character only able to move in some position added character squares he can move added stuff add square to selected character # Conflicts: # core/src/netwerkprog/game/client/MainGame.java # core/src/netwerkprog/game/util/game/GameCharacter.java commit 9349e6ce488040ee750c2da412b054ae4cdb538e Author: MickWerf Date: Sat Jun 6 16:42:44 2020 +0200 Finished Server/Client registration and communications commit 3dbffa4ffb7c5d23ebcc9a272de74c4f8f5339dc Author: MickWerf Date: Sat Jun 6 15:44:53 2020 +0200 Finished server side registration. commit f942bbbc92ea051a3e5caaeb05e50be7a729f52e Author: MickWerf Date: Sat Jun 6 15:02:45 2020 +0200 Connections, Applied Data objects, removed parsers and Made genereric data handling --- core/src/netwerkprog/game/client/Client.java | 104 -------------- .../src/netwerkprog/game/client/MainGame.java | 13 +- core/src/netwerkprog/game/client/Parser.java | 15 --- .../game/client/game/connections/Client.java | 127 ++++++++++++++++++ core/src/netwerkprog/game/server/Parser.java | 43 ------ core/src/netwerkprog/game/server/Server.java | 9 +- .../netwerkprog/game/server/ServerClient.java | 60 +++++---- .../server/controllers/DataController.java | 16 ++- .../server/controllers/SessionController.java | 55 ++++++-- .../game/util/data/CharacterData.java | 17 +++ .../game/util/data/ConnectionData.java | 23 ++++ core/src/netwerkprog/game/util/data/Data.java | 27 +++- .../game/util/data/DataCallback.java | 5 + .../game/util/game/GameCharacter.java | 3 +- .../java/RestartSessionControllerTest.java | 2 +- 15 files changed, 307 insertions(+), 212 deletions(-) delete mode 100644 core/src/netwerkprog/game/client/Client.java delete mode 100644 core/src/netwerkprog/game/client/Parser.java create mode 100644 core/src/netwerkprog/game/client/game/connections/Client.java 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/ConnectionData.java create mode 100644 core/src/netwerkprog/game/util/data/DataCallback.java diff --git a/core/src/netwerkprog/game/client/Client.java b/core/src/netwerkprog/game/client/Client.java deleted file mode 100644 index 93d6d2a..0000000 --- a/core/src/netwerkprog/game/client/Client.java +++ /dev/null @@ -1,104 +0,0 @@ -package netwerkprog.game.client; - -import netwerkprog.game.util.application.Controller; -import netwerkprog.game.util.data.Data; -import netwerkprog.game.util.data.ParserCallback; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Arrays; - -public class Client extends Controller implements ParserCallback { - 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; - - public Client(String hostname) { - this.port = Data.port(); - this.hostname = hostname; - this.parser = new Parser(this); - } - - /** - * Starts the client process. - */ - @Override - public void run() { - this.connect(); - this.receiveThread.start(); - } - - /** - * Connects the client to the server. - */ - public void connect() { - 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()); - - this.receiveThread = new Thread( () -> receive(in)); - - } catch (IOException e) { - 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")); - System.out.println(sb.toString()); - } - } - - /** - * Sends a message to the server. - * @param message The message to send. - */ - public void send(String message) { - try { - this.outputStream.writeUTF(message); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Receives a message from the server. - * @param in The inputStream - */ - public void receive(DataInputStream in) { - while (isConnected) { - try { - this.parser.parse(in.readUTF()); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public void disconnect() { - this.isConnected = false; - try { - this.receiveThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - send("Disconnect"); - - try { - this.socket.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void onDataReceived(String data) { - System.out.println(data); - } -} diff --git a/core/src/netwerkprog/game/client/MainGame.java b/core/src/netwerkprog/game/client/MainGame.java index 4f5b1da..8f1cea3 100644 --- a/core/src/netwerkprog/game/client/MainGame.java +++ b/core/src/netwerkprog/game/client/MainGame.java @@ -18,10 +18,13 @@ import netwerkprog.game.client.game.characters.Agent; 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.GameInputProcessor; import netwerkprog.game.client.game.map.GameTile; import netwerkprog.game.client.game.map.Map; import netwerkprog.game.client.game.map.MapRenderer; +import netwerkprog.game.util.data.Data; +import netwerkprog.game.util.data.DataCallback; import netwerkprog.game.util.game.Faction; import netwerkprog.game.util.game.GameCharacter; import netwerkprog.game.util.graphics.FrameRate; @@ -29,7 +32,7 @@ import netwerkprog.game.util.graphics.TextRenderer; import java.awt.*; -public class MainGame extends ApplicationAdapter { +public class MainGame extends ApplicationAdapter implements DataCallback { SpriteBatch batch; float screenWidth; float screenHeight; @@ -106,7 +109,7 @@ public class MainGame extends ApplicationAdapter { // playSong(); -// connectToServer(); + connectToServer(); } public void initCharacters() { @@ -155,7 +158,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) { @@ -285,4 +288,8 @@ public class MainGame extends ApplicationAdapter { 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/game/connections/Client.java b/core/src/netwerkprog/game/client/game/connections/Client.java new file mode 100644 index 0000000..16167cd --- /dev/null +++ b/core/src/netwerkprog/game/client/game/connections/Client.java @@ -0,0 +1,127 @@ +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.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; + 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(); + this.hostname = hostname; + this.callback = callback; + } + + /** + * Starts the client process. + */ + @Override + public void run() { + this.connect(); + this.receiveThread.start(); + } + + /** + * Connects the client to the server. + */ + 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")); + System.out.println(sb.toString()); + } + } + + 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. + */ + public void send(Data data) { + try { + this.outputStream.writeObject(data); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Receives a message from the server. + * @param in The inputStream + */ + public void receive(ObjectInputStream in) { + while (isConnected) { + try { + Object object = in.readObject(); + if (object instanceof Data) { + callback.onDataReceived((Data) object); + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + + public void disconnect() { + this.isConnected = false; + try { + this.receiveThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + send(new ConnectionData("Disconnect", "DEV")); + + try { + this.socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} 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..3326979 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); @@ -32,4 +35,8 @@ public class Server { // gameThreads.get(game).start(); // } } + + public DataController getDataController() { + return dataController; + } } diff --git a/core/src/netwerkprog/game/server/ServerClient.java b/core/src/netwerkprog/game/server/ServerClient.java index f937bf4..804594e 100644 --- a/core/src/netwerkprog/game/server/ServerClient.java +++ b/core/src/netwerkprog/game/server/ServerClient.java @@ -1,38 +1,35 @@ 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.ConnectionData; +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.net.Socket; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; -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, ObjectInputStream in, ObjectOutputStream out, SessionController server, DataController dataController) { this.name = name; this.server = server; - this.parser = new Parser(this); - try { - this.in = new DataInputStream(socket.getInputStream()); - this.out = new DataOutputStream(socket.getOutputStream()); - this.isConnected = true; - } catch (IOException e) { - this.isConnected = false; - e.printStackTrace(); - } + this.callback = dataController; + this.in = in; + this.out = out; + this.isConnected = true; } - 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 +39,26 @@ public class ServerClient implements Runnable, ParserCallback { public void run() { while (this.isConnected) { try { - String received = this.in.readUTF(); - this.parser.parse(received); - + 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..."); this.isConnected = false; System.out.println("[SERVERCLIENT] done!"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); } } } @@ -57,9 +66,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..4014704 100644 --- a/core/src/netwerkprog/game/server/controllers/SessionController.java +++ b/core/src/netwerkprog/game/server/controllers/SessionController.java @@ -1,11 +1,13 @@ 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.DataInputStream; import java.io.IOException; +import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; @@ -17,12 +19,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; } @@ -59,43 +63,66 @@ public class SessionController extends Controller { try { System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); - DataInputStream inputStream = new DataInputStream(socket.getInputStream()); + ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); - outputStream.writeUTF("Enter username: "); - String username = inputStream.readUTF(); + String username = ""; + boolean registering = true; + + 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. + } + } else { + //todo error messaging. + } + } System.out.println("[SERVER] got username " + username); - ServerClient serverClient = new ServerClient(username, socket, this); + ServerClient serverClient = new ServerClient(username, inputStream, outputStream, this, server.getDataController()); Thread t = new Thread(serverClient); t.start(); this.clientThreads.put(username,t); this.clients.add(serverClient); - } catch (IOException ex) { + } catch (IOException | ClassNotFoundException 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 +140,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..b89862a --- /dev/null +++ b/core/src/netwerkprog/game/util/data/CharacterData.java @@ -0,0 +1,17 @@ +package netwerkprog.game.util.data; + +import netwerkprog.game.util.game.GameCharacter; + +import java.io.Serializable; + +public class CharacterData extends Data implements Serializable { + 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/ConnectionData.java b/core/src/netwerkprog/game/util/data/ConnectionData.java new file mode 100644 index 0000000..911181f --- /dev/null +++ b/core/src/netwerkprog/game/util/data/ConnectionData.java @@ -0,0 +1,23 @@ +package netwerkprog.game.util.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 message) { + super("Connection"); + super.setPayload(this); + this.action = action; + this.message = message; + } + + public String getAction() { + return action; + } + + public String getMessage() { + return message; + } +} diff --git a/core/src/netwerkprog/game/util/data/Data.java b/core/src/netwerkprog/game/util/data/Data.java index 2bdcce4..24ed738 100644 --- a/core/src/netwerkprog/game/util/data/Data.java +++ b/core/src/netwerkprog/game/util/data/Data.java @@ -1,7 +1,32 @@ package netwerkprog.game.util.data; -public class Data { +import java.io.Serializable; + +public class Data implements Serializable { 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); +} diff --git a/core/src/netwerkprog/game/util/game/GameCharacter.java b/core/src/netwerkprog/game/util/game/GameCharacter.java index 34fbd67..f26cfb0 100644 --- a/core/src/netwerkprog/game/util/game/GameCharacter.java +++ b/core/src/netwerkprog/game/util/game/GameCharacter.java @@ -6,13 +6,14 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import netwerkprog.game.client.game.map.GameTile; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; 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; 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