From f942bbbc92ea051a3e5caaeb05e50be7a729f52e Mon Sep 17 00:00:00 2001 From: MickWerf Date: Sat, 6 Jun 2020 15:02:45 +0200 Subject: [PATCH] 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); +}