From 00ef19762890197e7aad65b694c0ad69ec001545 Mon Sep 17 00:00:00 2001 From: Xeon0X Date: Mon, 31 Mar 2025 15:57:06 +0200 Subject: [PATCH] Implement multi-threaded UDP server with port assignment --- app/src/main/java/clientserver/App.java | 4 +- .../main/java/clientserver/ClientHandler.java | 120 ++++++++++++++++++ .../java/clientserver/MistralDirectAPI.java | 4 +- app/src/main/java/clientserver/Server.java | 48 ------- 4 files changed, 124 insertions(+), 52 deletions(-) create mode 100644 app/src/main/java/clientserver/ClientHandler.java delete mode 100644 app/src/main/java/clientserver/Server.java diff --git a/app/src/main/java/clientserver/App.java b/app/src/main/java/clientserver/App.java index 755f153..94a7196 100644 --- a/app/src/main/java/clientserver/App.java +++ b/app/src/main/java/clientserver/App.java @@ -8,7 +8,7 @@ public class App { public static void main(String[] args) { System.out.println(new App().getGreeting()); - - MistralDirectAPI.main(new String[] {}); + ClientHandler.main(new String[] {}); + // MistralDirectAPI.main(new String[] {}); } } diff --git a/app/src/main/java/clientserver/ClientHandler.java b/app/src/main/java/clientserver/ClientHandler.java new file mode 100644 index 0000000..e586440 --- /dev/null +++ b/app/src/main/java/clientserver/ClientHandler.java @@ -0,0 +1,120 @@ +package clientserver; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; + +public class ClientHandler { + + static void main(String[] args) { + int port = 6666; + boolean running = true; + DatagramSocket socketServer = null; + + while (running) { + try { + // 1 - Création du canal + socketServer = new DatagramSocket(null); + // 2 - Réservation du port + InetSocketAddress address = new InetSocketAddress( + "localhost", + port + ); + socketServer.bind(address); + // 3 - Recevoir + byte[] recues = new byte[1024]; // tampon de réception + DatagramPacket receivedPacket = new DatagramPacket( + recues, + recues.length + ); + + socketServer.receive(receivedPacket); + + Thread thread = new Thread(() -> createThread(receivedPacket)); + thread.start(); + } catch (Exception e) { + System.err.println(e); + } + } + + socketServer.close(); + } + + public static void createThread(DatagramPacket packet) { + try { + InetAddress clientAddress = packet.getAddress(); + int clientPort = packet.getPort(); + System.out.println( + "Nouveau client : @" + clientAddress + ":" + clientPort + ); + DatagramSocket socket = new DatagramSocket(); // Reserve new port + + String response = "PORT:" + socket.getLocalPort(); + byte[] envoyees; // tampon d'émission + envoyees = response.getBytes(); + DatagramPacket packetToSend = new DatagramPacket( + envoyees, + envoyees.length, + clientAddress, + clientPort + ); + socket.send(packetToSend); + } catch (Exception e) { + System.err.println(e); + } + } + + static void scannerUDP(int startPort, int endPort) { + try { + for (int i = startPort; i < endPort; i++) { + try (DatagramSocket socket = new DatagramSocket(i)) {} catch ( + Exception e + ) { + System.out.println("Port n°" + i + " déjà occupé"); + } + } + } catch (Exception e) { + System.out.println(e); + } + } + // public static void main(String[] args) { + // try { + // // 1 - Création du canal + // DatagramSocket socketServeur = new DatagramSocket(null); + // // 2 - Réservation du port + // InetSocketAddress adresse = new InetSocketAddress( + // "localhost", + // 6666 + // ); + // socketServeur.bind(adresse); + // byte[] recues = new byte[1024]; // tampon d'émission + // byte[] envoyees; // tampon de réception + // // 3 - Recevoir + // DatagramPacket paquetRecu = new DatagramPacket( + // recues, + // recues.length + // ); + // socketServeur.receive(paquetRecu); + // InetAddress adrClient = paquetRecu.getAddress(); + // int prtClient = paquetRecu.getPort(); + // System.out.println( + // "Nouveau client : @" + adrClient + ":" + prtClient + // ); + // // 4 - Émettre + // String reponse = "Serveur RX302 ready"; + // envoyees = reponse.getBytes(); + // DatagramPacket paquetEnvoye = new DatagramPacket( + // envoyees, + // envoyees.length, + // adrClient, + // prtClient + // ); + // socketServeur.send(paquetEnvoye); + // // 5 - Libérer le canal + // socketServeur.close(); + // } catch (Exception e) { + // System.err.println(e); + // } + // } +} diff --git a/app/src/main/java/clientserver/MistralDirectAPI.java b/app/src/main/java/clientserver/MistralDirectAPI.java index c1615e6..25c1318 100644 --- a/app/src/main/java/clientserver/MistralDirectAPI.java +++ b/app/src/main/java/clientserver/MistralDirectAPI.java @@ -1,11 +1,11 @@ package clientserver; +import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.io.FileInputStream; import java.util.Properties; public class MistralDirectAPI { @@ -30,7 +30,7 @@ public class MistralDirectAPI { { "model": "mistral-medium", "messages": [ - { "role": "user", "content": "Explain recursion like I'm five." } + { "role": "user", "content": "Reverse turing test." } ] } """; diff --git a/app/src/main/java/clientserver/Server.java b/app/src/main/java/clientserver/Server.java deleted file mode 100644 index 71ca9db..0000000 --- a/app/src/main/java/clientserver/Server.java +++ /dev/null @@ -1,48 +0,0 @@ -package clientserver; - -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.InetSocketAddress; - -public class Server { - static void scannerUDP(int startPort, int endPort) { - try { - for (int i = startPort; i < endPort; i++) { - try (DatagramSocket socket = new DatagramSocket(i)) { - } catch (Exception e) { - System.out.println("Port n°" + i + " déjà occupé"); - } - } - } catch (Exception e) { - System.out.println(e); - } - } - - public static void main(String[] args) { - try { - // 1 - Création du canal - DatagramSocket socketServeur = new DatagramSocket(null); - // 2 - Réservation du port - InetSocketAddress adresse = new InetSocketAddress("localhost", 6666); - socketServeur.bind(adresse); - byte[] recues = new byte[1024]; // tampon d'émission - byte[] envoyees; // tampon de réception - // 3 - Recevoir - DatagramPacket paquetRecu = new DatagramPacket(recues, recues.length); - socketServeur.receive(paquetRecu); - InetAddress adrClient = paquetRecu.getAddress(); - int prtClient = paquetRecu.getPort(); - System.out.println("Nouveau client : @" + adrClient + ":" + prtClient); - // 4 - Émettre - String reponse = "Serveur RX302 ready"; - envoyees = reponse.getBytes(); - DatagramPacket paquetEnvoye = new DatagramPacket(envoyees, envoyees.length, adrClient, prtClient); - socketServeur.send(paquetEnvoye); - // 5 - Libérer le canal - socketServeur.close(); - } catch (Exception e) { - System.err.println(e); - } - } -}