[Thread] Serveur qui ne veut pas écouter
Bonjour,
Je possède deux classes ( ClientIP et Serveur IP ) qui communiquent entre elles.
Dans ma classe ServeurIP j'ai une méthode recevoir() qui permet d'obtenir un String envoyé par le client.
J'ai donc deux problèmes.
Du point de vue de la conception, je ne vois pas comment transformé mon serveur, qui est actuellement mono-client, en multi-client ( je pense à un tableau de client, mais je ne sais pas quoi y mettre dedans) .
Et, je n'arrive pas à faire boucler le serveur sur la méthode recevoir() pour qu'il reste constemment en attente de reception de message mais que dès qu'il en recoit un, il puisse tout de même le traiter.
Pourriez-vous m'aider ?
Voici ma classe ClientIP :
Code:
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 129 130 131 132 133 134 135 136 137 138 139 140 141
|
import java.io.*;
import java.net.*;
public class ClientIP extends Thread {
private String host;
private int port;
private BufferedReader cin; // Buffer entree en mode caracteres
private PrintWriter cout; // Buffer sortie en mode caracteres
// ---------------------------------------- *** Premier constructeur normal
//
// Construction d'un client IP par defaut
//
public ClientIP (String nomThread) {
super(nomThread);
host= "localHost";
port=8080;
}
// ---------------------------------------- *** Second constructeur normal
//
// Construction d'un client IP
//
public ClientIP (String nomThread, String host, int port) {
super(nomThread);
this.host= host;
this.port= port;
}
// --------------------------------------------- *** Methode connecter
//
private boolean connecter() {
// Creer une connexion avec le serveur cible
//
Socket s= null;
try{s= new Socket(host, port);}
catch (Exception e){}
// Initialiser les flux entrant et sortant de la connexion
//
return initFlux(s);
}
// --------------------------------------------- *** Methode initFlux
//
private boolean initFlux(Socket s) {
InputStream streamIn= null;
InputStreamReader bufferIn;
OutputStream streamOut= null;
OutputStreamWriter bufferOut;
// Controler l'existence de la socket support
//
if (s==null) return false;
// Creer le flux d'entree
//
try{streamIn= s.getInputStream();}
catch (Exception e) {return false;}
bufferIn= new InputStreamReader(streamIn);
// Creer le buffer d'entree
//
cin= new BufferedReader(bufferIn);
// Creer le flux de sortie
//
try{streamOut= s.getOutputStream();}
catch(Exception e){return false;}
// Creer le flux de sortie
//
bufferOut= new OutputStreamWriter(streamOut);
cout= new PrintWriter(new BufferedWriter(bufferOut), true);
return true;
}
// --------------------------------------------- *** Methode envoyer
//
public boolean envoyer (String msg) {
// Controler la validite du flux de sortie
//
if (cout==null) return false;
// Transferer le message dans le flux de sortie
//
cout.println(msg);
return true;
}
// --------------------------------------------- *** Methode recevoir
//
public String recevoir () {
String msg="?";
try{
while (true) {
msg= cin.readLine();
if (!msg.equals("?")) break;
Thread.currentThread().sleep(50);
}
}
catch (Exception e){}
return msg;
}
// --------------------------------------------- *** Methode fermer
//
public void fermer () {
try{ cin.close();cout.close();}
catch(Exception e){}
}
// --------------------------------------------- *** Methode run
//
public void run() {
boolean flag= false;
// Etablir la connexion avec le serveur cible
//
connecter();
// Envoyer un message au serveur cible
//
String message= new String("DECLARER xxxx");
flag= envoyer(message);
// Visualiser le message envoye
//
if (flag) {
System.out.println("Client / Message envoye : " + message);
}
}
} |
Voici ma classe ServeurIP:
Code:
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 129 130 131 132 133 134 135 136 137 138
|
import java.io.*;
import java.net.*;
public class ServeurIP extends Thread {
private int port;
private BufferedReader cin; // Buffer entree en mode caracteres
private PrintWriter cout; // Buffer sortie en mode caracteres
// --------------------------------------- *** Premier constructeur normal
//
// Construction d'un serveur IP par defaut
//
public ServeurIP (String nomThread){
super(nomThread);
port= 8080;
}
// --------------------------------------- *** Second constructeur normal
//
// Construction d'un serveur IP
//
public ServeurIP (String nomThread, int port) {
super(nomThread);
this.port= port;
}
// --------------------------------------------- *** Methode accepter
//
private boolean accepter() {
// Creer la socket serveur
//
ServerSocket serveur;
try {serveur= new ServerSocket(port);}
catch (Exception e){return false;}
// Attendre la connexion du client
//
Socket s;
try{s= serveur.accept();}
catch (Exception e){return false;}
return initFlux(s);
}
// --------------------------------------------- *** Methode initFlux
//
private boolean initFlux(Socket s) {
InputStream streamIn= null;
InputStreamReader bufferIn;
OutputStream streamOut= null;
OutputStreamWriter bufferOut;
// Creer le flux d'entree
//
try{streamIn= s.getInputStream();}
catch (Exception e) {return false;}
bufferIn= new InputStreamReader(streamIn);
// Creer le buffer d'entree
//
cin= new BufferedReader(bufferIn);
// Creer le flux de sortie
//
try{streamOut= s.getOutputStream();}
catch(Exception e){return false;}
// Creer le flux de sortie
//
bufferOut= new OutputStreamWriter(streamOut);
cout= new PrintWriter(new BufferedWriter(bufferOut), true);
return true;
}
// --------------------------------------------- *** Methode envoyer
//
public void envoyer (String msg) {
// Controler la validite du flux de sortie
//
if (cout==null) return;
// Transferer le message dans le flux de sortie
//
cout.println(msg);
}
// --------------------------------------------- *** Methode recevoir
//
public String recevoir () {
String msg="?";
try {
while (true) {
msg= cin.readLine();
if (!msg.equals("?")) break;
Thread.currentThread().sleep(50);
}
}
catch (Exception e){}
return msg;
}
// --------------------------------------------- *** Methode fermer
//
public void fermer () {
try{cin.close();cout.close();}
catch(Exception e){}
}
// --------------------------------------------- *** Methode run
//
public void run() {
String message= null;
// Attendre la connexion du client unique
//
accepter();
// Recevoir un message depuis le client connecte
//
message= recevoir();
// Visualiser le message recu
//
if (message != null) {
System.out.println("Serveur / Message recu : " + message);
}
}
} |
Merci par avance
carnibal