package Ex4; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.time.Instant; import java.time.LocalDate; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class Server { private final ServerSocket serverSocket; public Server(int port) throws IOException { this.serverSocket = new ServerSocket(port); new Thread(this::listen).start(); System.out.println("Server running on port " + getPort()); } public void close() { try { this.serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } public int getPort() { return this.serverSocket.getLocalPort(); } private void processConnexion(Socket socket) throws IOException { new Thread(new Runnable() { @Override public void run() { try { readMessages(socket); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void listen() { try { while (true) { Socket connexion = this.serverSocket.accept(); processConnexion(connexion); } } catch (IOException e) { e.printStackTrace(); } } private void readMessages(Socket socket) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); boolean done = false; while (!done) { String message = reader.readLine(); Date date = Date.from(Instant.now()); Calendar now = GregorianCalendar.getInstance(); now.setTime(date); System.out.println("[Server] Received " + message); switch (message) { case "DATE": writer.println(LocalDate.now()); break; case "HOUR": writer.println(now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE)); break; case "FULL": writer.println(Instant.now().toString()); break; case "CLOSE": System.out.println("[Server] Closing socket..."); socket.close(); done = true; break; default: break; } } } }