bonjour a tous,
donc voila pendant mes tp d'info sur une initiation au sockets on a du creer un serveur d'echo, je m'explique, le serveur capte le flux d'un client l'affiche a l'ecran et le renvoi au client afin qu'il l'affiche egalement avec le prefixe "echo: "
ce programme marche tres bien quand il est non "Threadé", ce qui est un peu débile car on ne peut conencter qu'un seul client...
alors j'ai voulu optimiser en creant un Thread qui me permettait de connecter plusieurs client, a ce moment la, les infos arrivent bien jusqu'au serveur mais les clients ne reçoivent jamais l'echo...
classe du serveur
classe du client
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 import java.io.*; import java.net.*; public class Serveur { static final int port = 8080; public static void main(String[] args) throws Exception { ServerSocket s = new ServerSocket(port); Serveur serveur = new Serveur(); while(true) { new ThreadClient(s.accept(),serveur); } } }
classe du Thread s'occupant des clients :
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 import java.io.*; import java.net.*; /** Le processus client se connecte au site fourni dans la commande * d'appel en premier argument et utilise le port distant 8080. */ public class Client { static final int port = 8080; public static void main(String[] args) throws Exception { Socket socket = new Socket(args[0], port); System.out.println("SOCKET = " + socket); BufferedReader plec = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); PrintWriter pred = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = in.readLine(); while(!str.equals("quit")) { pred.println(str); // envoi d'un message str = plec.readLine(); // lecture de l'écho System.out.println("Echo : "+str); str = in.readLine(); // saisie du mot } System.out.println("END"); // message de terminaison pred.println("END") ; plec.close(); pred.close(); in.close(); socket.close(); } }
dois je partager une chaine de caractere entre tous les Thread qui viendront la lire et la renvoyer? je suis un peu perdu avec ces histoires de flux moi...
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 import java.net.*; import java.io.*; class ThreadClient implements Runnable{ private Thread t; // contiendra le thread du client private Socket s; // recevra le socket liant au client private PrintWriter out; // pour gestion du flux de sortie private BufferedReader in; // pour gestion du flux d'entrée private Serveur serveur; // pour utilisation des méthodes de la classe principale ThreadClient(Socket soc, Serveur serv){ serveur = serv; s = soc; try { System.out.println("socket du client venant de s'être connecté : "+soc); out = new PrintWriter(s.getOutputStream()); // flux de sortie in = new BufferedReader(new InputStreamReader(s.getInputStream())); // flux d'entrée } catch (IOException e){ System.out.println("erreur lors de la creation des flux"); } t = new Thread(this); // instanciation du thread t.start(); // demarrage du thread, la fonction run() est ici lancée } public void run(){ String message = ""; // déclaration de la variable qui recevra les messages du client // on indique dans la console la connection d'un nouveau client try {while(true) { message = in.readLine(); if (message.equals("END")) break; System.out.println("message : "+message); out.println(message); } } catch (Exception e){ System.out.println("problème");} finally // finally se produira le plus souvent lors de la deconnexion du client { try { // on indique à la console la deconnexion du client System.out.println("Le client s'est deconnecte"); s.close(); // fermeture du socket si il ne l'a pas déjà été (à cause de l'exception levée plus haut) } catch (IOException e){ } } } }
Partager