diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java index 11a370e432391d9598d87499cb6349e0e131231c..b05b700bfa6354463857b213bd26ad77b9749bd1 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Communication/Client.java @@ -1,44 +1,80 @@ package com.galaxytrucker.galaxytruckerreloaded.Communication; +import com.galaxytrucker.galaxytruckerreloaded.Server.RequestObject; +import com.galaxytrucker.galaxytruckerreloaded.Server.ResponseObject; +import lombok.NonNull; + +import java.io.*; import java.net.Socket; public class Client { + /** + * Client socket for network communication + */ private Socket socket; - private ClientControllerCommunicator clientControllerCommunicator; + /** + * Used to send data + */ + private PrintWriter send; /** - * - Request and Response from and to the server. - * */ - public String sendAndReceive(){ - // View clicks something - // Controller issues a request - // Client ships request to server - // receive response - // give response to controller - // update views - // return server response as string - return null; - } + * Used to receive data + */ + private BufferedReader receive; - /** Constructor - * Loop for receiving Data - * */ - public Client(){ - clientControllerCommunicator = new ClientControllerCommunicator(); - // Connect to server + /** + * ObjectOutputStream for sending objects + */ + private ObjectOutputStream sendObject; + + /** + * ObjectInputStream for receiving objects + */ + private ObjectInputStream receiveObject; + + /** + * Send a request to the server + * @return the server's response + */ + public ResponseObject sendAndReceive(RequestObject requestObject) throws IllegalArgumentException { try { - // Send login request - // receive true/false - // send ship request - //clientControllerCommunicator.setClientShip(); + sendObject.writeObject(requestObject); + return (ResponseObject) receiveObject.readObject(); } catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); + } + } + /** + * Login + */ + public boolean login(String username) throws IllegalArgumentException { + try { + send.println("[LOGIN]:" + username); + return receive.readLine().equals("[ACCEPTED]"); + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException(e.getMessage()); } - while (true){ - sendAndReceive(); + } + + /** + * Constructor + */ + public Client(@NonNull String ipAddress, @NonNull int port) throws IllegalArgumentException { + try { + socket = new Socket(ipAddress, port); + send = new PrintWriter(socket.getOutputStream(), true); + receive = new BufferedReader(new InputStreamReader(socket.getInputStream())); + sendObject = new ObjectOutputStream(socket.getOutputStream()); + receiveObject = new ObjectInputStream(socket.getInputStream()); + } catch (Exception e) { + e.printStackTrace(); + throw new IllegalArgumentException("Couldn't initialize connection to server"); } } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..32c776cb91e787e81d33f34dc5e06c6fe01ff3e5 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ClientHandler.java @@ -0,0 +1,51 @@ +package com.galaxytrucker.galaxytruckerreloaded.Server; + +import java.io.*; +import java.net.Socket; + +public class ClientHandler implements Runnable { + + /** Client socket */ + private Socket clientSocket; + + /** The server */ + public Server server; + + /** ServerServiceCommunicator */ + private ServerServiceCommunicator serverServiceCommunicator; + + /** Used to send data */ + private PrintWriter send; + + /** Used to receive data */ + private BufferedReader receive; + + /** ObjectOutputStream for sending objects */ + private ObjectOutputStream sendObject; + + /** ObjectInputStream for receiving objects */ + private ObjectInputStream receiveObject; + + /** Constructor + * @param clientSocket - the client's socket + * @param server - the server */ + public ClientHandler(Socket clientSocket,Server server) throws IllegalArgumentException { + this.clientSocket = clientSocket; + this.server = server; + try { + sendObject = new ObjectOutputStream(clientSocket.getOutputStream()); + receiveObject = new ObjectInputStream(clientSocket.getInputStream()); + send = new PrintWriter(clientSocket.getOutputStream(),true); + receive = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + } + catch (Exception e){ + e.printStackTrace(); + throw new IllegalArgumentException(); + } + } + + /** Run */ + public void run(){ + + } +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java new file mode 100644 index 0000000000000000000000000000000000000000..8379a87b60a6b39c27ae7d608cec1cdb3949c3e0 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestObject.java @@ -0,0 +1,19 @@ +package com.galaxytrucker.galaxytruckerreloaded.Server; + +import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RequestObject { + + /** Type of Request */ + private RequestType requestType; + + /** Username */ + private String username; + + /** Ship */ + private Ship ship; +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java new file mode 100644 index 0000000000000000000000000000000000000000..8615f415376d09c38d244fd0d47c6b020a5fe848 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/RequestType.java @@ -0,0 +1,5 @@ +package com.galaxytrucker.galaxytruckerreloaded.Server; + +public enum RequestType { + LOGIN +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java new file mode 100644 index 0000000000000000000000000000000000000000..e4456aae02ee651e2198baedb375eb7c1971c196 --- /dev/null +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ResponseObject.java @@ -0,0 +1,4 @@ +package com.galaxytrucker.galaxytruckerreloaded.Server; + +public class ResponseObject { +} diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java index 3bcc4ce105e70d2f97b45a0c49ebe5819ccafa43..53554153ed9148388ba6d69b4df3fe53159bd34f 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/Server.java @@ -1,28 +1,104 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; +import com.galaxytrucker.galaxytruckerreloaded.Communication.Client; + +import java.net.ServerSocket; import java.net.Socket; /** * This class creates the game server and handles storing the data */ -public class Server { +public class Server implements Runnable{ + + /** Server socket for network communication */ + private ServerSocket serverSocket; + + /** Server thread */ + private Thread serverThread; - /** Server service communicator */ + /** ServerServiceCommunicator */ private ServerServiceCommunicator serverServiceCommunicator; + /** Server port */ + private int port; + + /** Is the server running? */ + private boolean running = true; + /** Main method */ - public static void main(String[] args){} + public static void main(String[] args){ + Server server = new Server(); + server.setPort(5050); + server.serverServiceCommunicator = new ServerServiceCommunicator(); + new Thread(server).start(); + try { + Thread.sleep(1000); + } + catch (Exception f){ + System.out.println(f); + } + Client client = new Client("localhost",5050); + } - /** Client handler - * @param socket - the client's socket */ - private void clientHandler(Socket socket){ + /** Start server on specified port + * @param port - the port to bind */ + private void bindPort(int port) { + try { + this.serverSocket = new ServerSocket(port); + } + catch (Exception e){ + e.printStackTrace(); + } + } + + /** Is the server running? */ + private synchronized boolean isRunning(){ + return this.running; + } + /** Kill server */ + public synchronized void killServer(){ + try { + this.serverSocket.close(); + this.running = false; + } + catch (Exception e){ + e.printStackTrace(); + } } - /** Receive some data from the client and return a response - * @param socket - the client socket */ - private void receiveAndSendData(Socket socket){ + /** Get the serverServiceCommunicator */ + public synchronized ServerServiceCommunicator getServerServiceCommunicator(){ + return this.serverServiceCommunicator; } + /** Run the server */ + public void run(){ + synchronized (this){ + this.serverThread = Thread.currentThread(); + } + bindPort(this.port); + System.out.println("Server initialized on " + serverSocket.getInetAddress().getHostAddress() + ":" + this.port + ", listening for connections..."); + while (isRunning()){ + Socket clientSocket = null; + try { + clientSocket = serverSocket.accept(); + System.out.println("Accepted new connection from "+ clientSocket.getInetAddress().getHostAddress()); + } + catch (Exception e){ + e.printStackTrace(); + } + Server server = this; + new Thread( + new ClientHandler(clientSocket,server) + ).start(); + } + } + + /** Set the server port + * @param port - the server port */ + public void setPort(int port){ + this.port = port; + } } diff --git a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java index 59ddc12cfbad4b698a080f3a44f1432c1d3f4e2e..709b20aded5250f06778d8b0a14af1555a1997ec 100644 --- a/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java +++ b/core/src/com/galaxytrucker/galaxytruckerreloaded/Server/ServerServiceCommunicator.java @@ -2,7 +2,6 @@ package com.galaxytrucker.galaxytruckerreloaded.Server; import com.galaxytrucker.galaxytruckerreloaded.Model.Ship; import lombok.AccessLevel; -import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor(access = AccessLevel.PUBLIC)