commit 35f382698c0c787bcf23f09ea4fe07642c1c0661 Author: Laureηt Date: Sat Apr 22 17:35:59 2023 +0200 ajout TP1 diff --git a/TP1/Comanche.class b/TP1/Comanche.class new file mode 100644 index 0000000..014ae2b Binary files /dev/null and b/TP1/Comanche.class differ diff --git a/TP1/Comanche.java b/TP1/Comanche.java new file mode 100644 index 0000000..cd8f377 --- /dev/null +++ b/TP1/Comanche.java @@ -0,0 +1,44 @@ +import java.net.*; +import java.io.*; + +public class Comanche implements Runnable { + private Socket s; + + public Comanche(Socket s) { + this.s = s; + } + + public static void main(String[] args) throws IOException { + ServerSocket s = new ServerSocket(Integer.parseInt(args[0])); + while (true) { + new Thread(new Comanche(s.accept())).start(); + } + } + + public void run() { + System.out.println("new connection : " + this.s); + try { + InputStreamReader in = new InputStreamReader(s.getInputStream()); + PrintStream out = new PrintStream(s.getOutputStream()); + String rq = new LineNumberReader(in).readLine(); + System.out.println(rq); + if (rq.startsWith("GET ")) { + File f = new File(rq.substring(5, rq.indexOf(' ', 4))); + if (f.exists() && !f.isDirectory()) { + InputStream is = new FileInputStream(f); + byte[] data = new byte[is.available()]; + is.read(data); + is.close(); + String s = new String(data); + out.print("HTTP/1.0 200 OK\n\n" + s); + } else { + out.print("HTTP/1.0 404 Not Found\n\n Document not found."); + } + } + out.close(); + s.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } +} diff --git a/TP1/LoadBalancer.class b/TP1/LoadBalancer.class new file mode 100644 index 0000000..66bf3e6 Binary files /dev/null and b/TP1/LoadBalancer.class differ diff --git a/TP1/LoadBalancer.java b/TP1/LoadBalancer.java new file mode 100644 index 0000000..507d47c --- /dev/null +++ b/TP1/LoadBalancer.java @@ -0,0 +1,85 @@ +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Random; + +public class LoadBalancer extends Thread { + static String hosts[] = { "localhost", "localhost" }; + static int ports[] = { 8081, 8082 }; + static int nbHosts = 2; + static Random rand = new Random(); + static ServerSocket ss; + + Socket client_socket; + + public LoadBalancer(Socket socket) { + this.client_socket = socket; + } + + @Override + public void run() { + try { + InputStream client_is = this.client_socket.getInputStream(); + OutputStream client_os = this.client_socket.getOutputStream(); + + // on selectionne un serveur au pif + int id = rand.nextInt(nbHosts); + Socket server_socket = new Socket(hosts[id], ports[id]); + System.out.println("Established connection with server " + id + " : " + server_socket); + + InputStream server_is = server_socket.getInputStream(); + OutputStream server_os = server_socket.getOutputStream(); + + // création du buffer de transfert + byte[] buffer = new byte[1024]; + int buffer_length; + + // transfère de la requête du client vers le server + buffer_length = client_is.read(buffer); + System.out.println("Received " + buffer + " from client"); + server_os.write(buffer, 0, buffer_length); + System.out.println("Sent the buffer to server " + id); + + // transfère de la requête du server vers le client + buffer_length = server_is.read(buffer); + System.out.println("Received " + buffer + " from server"); + client_os.write(buffer, 0, buffer_length); + System.out.println("Sent the buffer to client"); + + // fermeture des streams server + server_os.close(); + server_is.close(); + + // fermeture des streams client + client_os.close(); + client_is.close(); + + // fermeture des sockets client et serer + this.client_socket.close(); + server_socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { + System.out.println("Début du load balancer"); + try { + ss = new ServerSocket(8080); + System.out.println("ServerSocket créé"); + while (true) { + Socket new_client = ss.accept(); + System.out.println("Nouvelle connection: " + new_client); + LoadBalancer ld = new LoadBalancer(new_client); + ld.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + ss.close(); + } + } + +} diff --git a/TP1/LoadBalancer.java.bak b/TP1/LoadBalancer.java.bak new file mode 100644 index 0000000..694bc0a --- /dev/null +++ b/TP1/LoadBalancer.java.bak @@ -0,0 +1,88 @@ +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.Random; + +public class LoadBalancer extends Thread { + static String hosts[] = { "localhost", "localhost" }; + static int ports[] = { 8081, 8082 }; + static int nbHosts = 2; + static Random rand = new Random(); + + Socket client_socket; + InputStream client_is; + OutputStream client_os; + InputStream server_is; + OutputStream server_os; + Socket server_socket; + + public LoadBalancer(Socket socket) { + this.client_socket = socket; + } + + @Override + public void run() { + try { + client_is = this.client_socket.getInputStream(); + client_os = this.client_socket.getOutputStream(); + + // on selectionne un serveur au pif + int id = rand.nextInt(nbHosts); + server_socket = new Socket(hosts[id], ports[id]); + System.out.println("Established connection with server " + id + " : " + server_socket); + + server_is = server_socket.getInputStream(); + server_os = server_socket.getOutputStream(); + + // création du buffer de transfert + byte[] buffer = new byte[1024]; + int buffer_length; + + // transfère de la requête du client vers le server + buffer_length = client_is.read(buffer); + System.out.println("Received " + buffer + " from client"); + server_os.write(buffer, 0, buffer_length); + System.out.println("Sent the buffer to server " + id); + + // transfère de la requête du server vers le client + buffer_length = server_is.read(buffer); + System.out.println("Received " + buffer + " from server"); + server_os.write(buffer, 0, buffer_length); + System.out.println("Sent the buffer to client"); + + } catch (Exception e) { + e.printStackTrace(); + } finally { + // fermeture des streams server + server_os.close(); + server_is.close(); + + // fermeture des streams client + client_os.close(); + client_is.close(); + + // fermeture des sockets client et serer + this.client_socket.close(); + server_socket.close(); + } + } + + public static void main(String[] args) { + System.out.println("Début du load balancer"); + try { + ServerSocket ss = new ServerSocket(8080); + System.out.println("ServerSocket créé"); + while (true) { + Socket new_client = ss.accept(); + System.out.println("Nouvelle connection: " + new_client); + LoadBalancer ld = new LoadBalancer(new_client); + ld.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/TP1/TP-socket.html b/TP1/TP-socket.html new file mode 100644 index 0000000..4f1038c --- /dev/null +++ b/TP1/TP-socket.html @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + +


+ Cours Intergiciels
+

+

ENSEEIHT + + + + – Département Informatique – 2ième année

+

TP + sockets

+

Daniel + Hagimont

+

Daniel.Hagimont@enseeiht.fr

+


+
+

+

Objectif

+

L'objectif de ce TP est l'initiation + à la programmation répartie. Il consiste à programmer une + application typique comportant de la répartition à l'aide de + Socket. Vous devez implanter un répartiteur de charge (Load + Balancer) qui reçoit des requêtes HTTP et les redirige de + façon aléatoire vers un ensemble de serveurs Web.
+

+

Le début de cette classe est le + suivant :
+

+
+
+

public class + LoadBalancer {

+ static + + + String hosts[] = {"localhost", "localhost"};
+ static + + + int ports[] = {8081,8082};
+ static + + + int nbHosts = 2;
+ static + + + Random rand = new Random();
+
+ } +
+
+
+

A chaque réception d'une requête HTTP (une + connexion TCP), LoadBalancer transfère la requête à un + des serveurs web (les adresses de ces serveurs sont données par + les tables hosts et ports) et LoadBalancer + transfère le résultat de la requête à l'émetteur. Le choix du + serveur Web est aléatoire (rand.nextInt(nbHosts) retourne + un entier entre 0 et nbHosts-1). Pour être efficace, LoadBalancer + est évidemment multi-threadé.

+


+

+

Pour la programmation des entrées/sorties, on + utilisera :

+
+ + +
+

+

Tests

+


+ Pour tester, vous disposez d'un petit serveur Web (Comanche.java).
+ Vous pouvez en lancer 2 depuis 2 terminaux avec :
+             java + Comanche 8081
+             java + Comanche 8082
+

+

Lancez votre LoadBalancer sur la + même machine (il accepte les connexions sur le port 8080).
+

+

Entrez dans un navigateur (sur la + même machine) l'URL : localhost:8080/page.html
+ (la page page.html est sensée est présente dans le répertoire où + vous avez lancé Comanche)
+
+

+ + diff --git a/TP1/page.html b/TP1/page.html new file mode 100644 index 0000000..73a5243 --- /dev/null +++ b/TP1/page.html @@ -0,0 +1,8 @@ + +

+ Welcome in Comanche! +

+
+This is a test page to test the Comanche server. + + \ No newline at end of file