From f5a11fc2de3eb2051eb95538cabb350523fe7fea Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Wed, 4 Feb 2026 09:24:56 +0100 Subject: [PATCH] ex2 --- src/Ex1/Client.java | 2 -- src/Ex2/App.java | 10 ++++++ src/Ex2/Client.java | 77 +++++++++++++++++++++++++++++++++++++++++++++ src/Ex2/Server.java | 52 ++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/Ex2/App.java create mode 100644 src/Ex2/Client.java create mode 100644 src/Ex2/Server.java diff --git a/src/Ex1/Client.java b/src/Ex1/Client.java index 188b34c..626455f 100644 --- a/src/Ex1/Client.java +++ b/src/Ex1/Client.java @@ -4,8 +4,6 @@ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; -import java.util.Random; -import java.util.Scanner; public class Client { diff --git a/src/Ex2/App.java b/src/Ex2/App.java new file mode 100644 index 0000000..6e868ce --- /dev/null +++ b/src/Ex2/App.java @@ -0,0 +1,10 @@ +package Ex2; + +import java.net.InetSocketAddress; + +public class App { + public static void main(String[] args) throws Exception { + Server server = new Server(6666); + Client client = new Client(new InetSocketAddress("localhost", 6666)); + } +} diff --git a/src/Ex2/Client.java b/src/Ex2/Client.java new file mode 100644 index 0000000..dc56796 --- /dev/null +++ b/src/Ex2/Client.java @@ -0,0 +1,77 @@ +package Ex2; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.temporal.TemporalUnit; + +public class Client { + + private final DatagramSocket socket; + private final InetSocketAddress address; + + /** + * Create a new client + * + * @param address server adress (needed + * @throws IOException + */ + public Client(InetSocketAddress address) throws IOException { + this.address = address; + this.socket = new DatagramSocket(); + sendGreetings(); + readMessage(); + this.socket.close(); + } + + private void sendGreetings() throws IOException { + sendMessage(Instant.now().toString()); + } + + public void sendMessage(String message) throws IOException { + byte[] buffer = message.getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, this.address.getAddress(), + this.address.getPort()); + this.socket.send(packet); + } + + private void processMessage(DatagramPacket packet) { + String message = new String(packet.getData(), 0, packet.getLength()); + long t2 = Instant.now().toEpochMilli(); + System.out.println("[Client] Message recieved : " + message); + String[] times = message.split(" "); + long t1 = Instant.parse(times[0]).toEpochMilli(); + long tPrime1 = Instant.parse(times[1]).toEpochMilli(); + long tPrime2 = Instant.parse(times[2]).toEpochMilli(); + var delta = (t2 - t1) - (tPrime2 - tPrime1); + var theta = (tPrime1 + tPrime2) / 2 - (t1 + t2) / 2; + var now = System.currentTimeMillis(); + System.out.println("Delta : " + delta + "ms, Theta : " + theta + "ms"); + System.out.println("Temps actuel : " + new Timestamp(now)); + System.out.println("Temps corrigé: " + new Timestamp(now + theta)); + } + + private boolean readMessage() { + byte[] buffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + try { + this.socket.receive(packet); + processMessage(packet); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + private void readMessages() { + while (true) { + if(!readMessage()) + break; + } + } + +} diff --git a/src/Ex2/Server.java b/src/Ex2/Server.java new file mode 100644 index 0000000..5e38c3d --- /dev/null +++ b/src/Ex2/Server.java @@ -0,0 +1,52 @@ +package Ex2; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.time.Instant; + +public class Server { + + private final DatagramSocket socket; + + public Server(int port) throws SocketException { + this.socket = new DatagramSocket(port); + new Thread(this::readMessages).start(); + } + + public int getPort() { + return this.socket.getLocalPort(); + } + + private void sendMessage(String message, InetAddress address, int port) throws IOException { + byte[] buffer = message.getBytes(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port); + this.socket.send(packet); + } + + private void processMessage(DatagramPacket packet) throws IOException { + Instant tPrime1 = Instant.now(); + String message = new String(packet.getData(), 0, packet.getLength()); + System.out.println("[Server] Message recieved : " + message); + Instant t1 = Instant.parse(message); + Instant tPrime2 = Instant.now(); + sendMessage(t1.toString() + " " + tPrime1.toString() + " " + tPrime2.toString(), packet.getAddress(), packet.getPort()); + } + + private void readMessages() { + while (true) { + byte[] buffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + try { + this.socket.receive(packet); + processMessage(packet); + } catch (IOException e) { + e.printStackTrace(); + break; + } + } + } + +}