From 35f382698c0c787bcf23f09ea4fe07642c1c0661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sat, 22 Apr 2023 17:35:59 +0200 Subject: [PATCH] ajout TP1 --- TP1/Comanche.class | Bin 0 -> 2639 bytes TP1/Comanche.java | 44 ++++++++ TP1/LoadBalancer.class | Bin 0 -> 2746 bytes TP1/LoadBalancer.java | 85 +++++++++++++++ TP1/LoadBalancer.java.bak | 88 ++++++++++++++++ TP1/TP-socket.html | 210 ++++++++++++++++++++++++++++++++++++++ TP1/page.html | 8 ++ 7 files changed, 435 insertions(+) create mode 100644 TP1/Comanche.class create mode 100644 TP1/Comanche.java create mode 100644 TP1/LoadBalancer.class create mode 100644 TP1/LoadBalancer.java create mode 100644 TP1/LoadBalancer.java.bak create mode 100644 TP1/TP-socket.html create mode 100644 TP1/page.html diff --git a/TP1/Comanche.class b/TP1/Comanche.class new file mode 100644 index 0000000000000000000000000000000000000000..014ae2b27310c43893f37c8975788d61cb231816 GIT binary patch literal 2639 zcmaJ@`F9gl6#k}7GU+fhkWy$^N?2Ocy&x_$1(DK1q?+(K5t7yqI>*S%z*p8@-Zfp}! zUx}R=Q_OHO5Mj!&kms6H0#?{cb|~?*!IYE$|C~n|r!dX+Zso&_j7Jd_@tBOq@dR1! z)pg6X3?(jZfJAgL5+8#W?|M+Q3;>p3(7=e zr@~2H(lJ)6YQn8MxR+`>u56z;2Xj-EB7T1*kF~=E|q2gIGZOS)b zqgAPK0ksp%a&dv@Tt;Fcm5B}wRb&q7 zZM6MVOetOtyc3oEx=)n)gnb?+2kt+zKT7zhT8d4NoDkrR#9}Q(gBmkGPIXOfi8m`+ zTMAYmn^sMJ4%Cv!%QDs6ry6u}x-mm-vl1{bKRev{3SR(h4fQNF(I1 zt(1 zI)>53u)0v9(s5|Sji#{cj8B;Art@}GFn??C86`O#@|JTDNy39N2 zBJHAo6~AxjBCn=*x-4kiL9h5hchagK z!r!PBX{Vhu^U%)i^zT8`iBDj(zn>((UxD2EBdV@pIZ!}t34sKk7qFs89{?o;%hS3d zRt=Rx_9&gB7z~<}z9$&~C@)fY<2w&J*LQ^8-E26naY!8Xoa0`zrGK-q_U<dbnKBCCDy~z84i-nTnlh`S)p|72dk5AK3JutU5MuO+bR6rTVLfKB zfiCJsoWVw%rB9}dbgq}M8DC)wen2y>(C%01B(EcaU(kZz&}L)X0?!Rn@`?~e1VjWy wG>POFf5Cf$a1=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 0000000000000000000000000000000000000000..66bf3e632e809c5ae8ad98191ab59209494942e9 GIT binary patch literal 2746 zcmaJ@S$7mg6#jZLlkPMPAtMPHV_=YNvPcv+Ob{_4n1M-xOpK0*+UXR@kV*I0(-Xjb z-#2i>U5^jIgAW8vJOMq&gFfib@K5;SQNQY*kjBjM3)cvKWa&!KjY= z@jx6AJQzm}Mm0PnHHW1Eg@(f_9@f!}M>IUD!qhPaOGgXFH3&H#i6e?h6?vU!9hG8A zMM1-~3R_~?t-?_dn{-NENx?OTGDpoBv#Vg*6J1%)&D#?_TrE1TT#Xz`D^TsRfxuYd zEb5x}xPo}Ft?cCsT?eUgrnzmURmcn5d!*!8Q^Hfw5E$9Q>&p5n+SKmM+j(!7f;FjS zt8Jt7-{*`A1@)P{Er!a|W5OLV#|qTcxMiC%C5={QJ=2;RG>etB=(L&VVpFP0G;O0Q z+7)O!2`)HU&pKt-5_|K~Z9~Q}$9ql2ZwYss$-XCg-nfctb%VOKy|iq)3jHj~o$h(sPml;RfEs z4(4(xll{jnQS|bTZQw1rw06(sb7N&MIbKc{7;kc{60m~Cr9gx`BitZSD&98m4&If) zoTTS$Xf0{Em(N{3XW$gx)9}6o_<;f=%%j|Pi-8a2(W{qG1@)z%uHaZ^K~~`6a;T0L zRenW|OuE8kxviQIUfM2}J-QI)Gy_Vt1?7`>xh+m9C@hhmVH`^Gi0e#OYR|uQy_IBK4QGv? zdAbdg&gOE=&3n9gDjlbNZd#6uyUa8L&Y+6E_w`ZIwQEAXYk?b`s&v8$v_>#ynjx$v*@)o99Vs2l-ER_T+ z=X5yX6(2zx8eq>Zh|;EDW6yFpAU83EEKX#evgW; z6l`7=Uo~tB*8RU7U$_l?fq@ubM|NR;X|fUfBRjS~vVC)e?CO+JKD6vml(%x$&c`;w zQE#7z(%$hsBIh|%a2w?+zQMq1?r1b_DyB!#uH$tG~B@hsYdiGQk)foJDLF zwR2E+U4)jKMP2LmS?I0X=CPtXIt!yU5naGaU=FJiQEu#x$syWZ+YrSity}F#sB@^l zO`~Z-UEt}yWo<&OY1HP>AU!M)i?5AcZF|jf+xQxJ4&gK=VsmKfh#&t^TuaSbGTKZWEu3A)SFja5SdU&Lk;XExtjRqY%WT10d=uUdakBn{mJ26v|;_J;S11X z7f^cI5NzXkvt^VAz-U M`7-CrL%y8&7u$xRz5oCK literal 0 HcmV?d00001 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 :

+
+
    +
      +

      - + InputStream
      +         
      - public int read(byte[] b); // bloquante, + retourne le nombre de bytes lus

      +
    +
+
    +
      +
    +
      +

      - + OutputStream
      +         - public void + write(byte[] b, int off, int len); // écrit les len bytes + à la position off

      +
    +
      +

      et on + suppose que les requêtes et réponses sont lues ou écrites en + un seul appel de méthode avec un buffer de 1024 bytes. Notez + que cette hypothèse n'est pas vérifieée dans la vrai vie.
      +

      +
    +
+
+

+

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