Bonjour,
Dans le cadre d'un cours sur les sytèmes réparties on m'a demandé de faire un code client serveur avec un client qui envoie une classe au serveur avec des variables et nom de la méthode qu'il veut utiliser et le serveur fait le calcul. J'ai réussi à faire fonctionner mon code mais je ne comprends pas vraiment comment il réussit à fonctionner (par magie :/ ). Ce que je ne comprends pas réellement c'est comment le serveur est il capable de comprendre qu'une classe existe alors qu'il ne la lit pas et ne la compile pas lui même.
Code client
Code coté serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 package client; import java.awt.DisplayMode; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.util.Scanner; import commun.ByteStream; public class MainClient { static ByteStream convertisseur = new ByteStream(); static Socket ClientSoc; // méthode permettant d'envoyer au serveur un message public static int sendToServer(String a, String b, File fichier, String nomClasse, String nomMethode) throws IOException { InetAddress ip = InetAddress.getLocalHost(); int port = 2555; try { // on paramètre la connexion tcp ClientSoc = new Socket(ip, port); InputStream din = ClientSoc.getInputStream(); OutputStream dout = ClientSoc.getOutputStream(); // convertion des variables et envoie dans le stream convertisseur.toStream(dout, a); convertisseur.toStream(dout, b); convertisseur.toStream(dout, nomClasse); convertisseur.toStream(dout, nomMethode); convertisseur.toStream(dout, fichier); // récupération du résultat return convertisseur.toInt(din); // ClientSoc.close(); // ne pas fermer la socket sinon le message de retour ne parviens // pas au client. } catch (Exception ex) { } // si on a eu une erreur il faut quand même retourné une string donc on // envoie le message error return (-1); } private static void lectureUtilisateur() throws IOException, ClassNotFoundException { String a, b; Scanner sc = new Scanner(System.in); int retour; String nomClasse, nomMethode; // fichier contenant la classe à envoyer File fichier = new File("Calc.class"); System.out.println("chemin du fichier :" + fichier.getAbsolutePath()); System.out.println("Entrez la valeur de a :"); // on lit la valeur de a et on le transforme en string pas de // vérification utilisateur a = sc.nextLine(); System.out.println("Entrez la valeur de b :"); // on lit la valeur de b et on le transforme en string pas de // vérification utilisateur b = sc.nextLine(); System.out.println("la valeur de a est : " + a + "; la valeur de b est " + b + ""); System.out.println("envoie du calcul au serveur"); // on lit le fichier comme ça si on décide de changer la classe il // suffira seulement de changer le répertoire d'accès // au fichier que l'on pourrait placer dans les arguments //pas le choix utiliser la chaine de caractère nomClasse = "Calc"; // obliger de donner le nom de la méthode car je n'ai pas trouver // d'autres moyens nomMethode = "calc"; // System.out.println(nomClasse); retour = sendToServer(a, b, fichier, nomClasse, nomMethode); if(retour== (-1)){ System.out.println("Erreur!"); }else{ System.out.println("votre réponse est : " + retour + ""); } } private static void display() throws Exception { String strMsg; String msgFromServer; int choice; while (true) { System.out.println("\n[ DISPLAY ]"); System.out.println("1. faire une addition"); System.out.println("2. Exit"); System.out.print("\nEnter Choice :"); BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); choice = Integer.parseInt(br.readLine()); if (choice == 1) { lectureUtilisateur(); } else if (choice == 2) { ClientSoc.close(); System.exit(1); } else { } } } public static void main(String[] args) throws Exception { // TODO Auto-generated method stub display(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainServer { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Socket clientSoc; ServerSocket serverSoc; int portNumber = 2555; serverSoc = new ServerSocket(portNumber); System.out.println("Serveur allumé"); while (true) { // on accepte tous les socket entrant clientSoc = serverSoc.accept(); TCPServerThread serverThread = new TCPServerThread(clientSoc); } } } //utilisation d'un threads afin de gérer plusieurs clients class TCPServerThread extends Thread { Socket ClientSoc; InputStream din; OutputStream dout; static ByteStream convertisseur= new ByteStream(); TCPServerThread(Socket soc) { try { ClientSoc = soc; din=ClientSoc.getInputStream(); dout=ClientSoc.getOutputStream(); System.out.println("TPC Client Connected ..."); start(); } catch (Exception ex) { } } @Override public void run() { String a,b,nomClasse,nomMethode; int retour; //on rajoute la date pour les doublons si plusieurs clients demande le calcul // DateFormat df = new SimpleDateFormat("MM-dd-yyyy HH-mm-ss"); // Date today = Calendar.getInstance().getTime(); //double \ pour l'escape choisir le répertoire bin du projet java pour mettre le .class String nomFichier = "D:\\Documents\\Workspace_eclipse\\tp1-server\\bin\\Calc.class"; // nomFichier.replaceAll("[\\W]|_",""); System.out.println(nomFichier); File fichier=new File(nomFichier); while (true) { try { // In... // msg = din.readUTF(); //réception du stream par le serveur. l'ordre est important pour savoir que a est a et b est b a = convertisseur.toString(din); b = convertisseur.toString(din); nomClasse=convertisseur.toString(din); nomMethode=convertisseur.toString(din); // System.out.println(a+b); convertisseur.toFile(din, fichier); System.out.println("réception du fichier en cours"); //on regarde s'il y a une classe dans le stream FileInputStream lecture = new FileInputStream(fichier); // InputStream interm = lecture; // System.out.println("succes 11"); // ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(lecture)); // System.out.println("succes 2"); // Object objet = ois.readObject(); // System.out.println("succes 3"); // Class classe = objet.getClass(); Class classe = Class.forName(nomClasse); Object cls = classe.newInstance(); Class[] types = { String.class, String.class }; Method m = classe.getMethod("add", types); Object retourPartiel = m.invoke(cls, a,b); // System.out.println(retourPartiel); retour = (int) retourPartiel; convertisseur.toStream(dout,retour); } catch (Exception ex) { } } } }
Partager