[Réseau]Problème pour faire une application clients/serveur en Java
Bonjour,
j'ai essayé de faire une application avec plusieurs clients, et un seul serveur en Java. Pour cela, j'utilise une classe Clients et une classe Serveur (je suppose ici que les clients et le serveur sont représentés par la même machine). Le serveur ne doit, en principe, pas savoir combien de clients il devra traiter, j'ai donc utilisé une boucle "while(true)" , avec un traitement de requête d'un client par tour de boucle. J'ai donc le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ServerSocket ss = new ServerSocket(1100);
while(true)
{
Socket s = ss.accept();
System.out.println("Connexion acceptee");
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
PrintStream pr = new PrintStream(os);
String str = dis.readLine();
System.out.println(str);
pr.println(str + "Reponse");
s.close();
}
ss.close(); |
Le problème vient de la dernière ligne de code : pour fermer le serveur, j'utilise la méthode "close" de la classe ServerSocket. Le problème est que, comme elle se situe après une boucle infinie, le problème ne peut théoriquement jamais y accéder, et cela génère une erreur à la compilation. Qqn pourrait-il me dire s'il existe un moyen de résoudre ce problème ??
Merci d'avance.
Re: Problème pour faire une application clients/seveur en Ja
Salut,
Citation:
Envoyé par Yakurena
Le problème vient de la dernière ligne de code : pour fermer le serveur, j'utilise la méthode "close" de la classe ServerSocket. Le problème est que, comme elle se situe après une boucle infinie, le problème ne peut théoriquement jamais y accéder, et cela génère une erreur à la compilation.
Le compilateur a tout à fait raison de bloquer ce code : même en pratique tu ne peux jamais accéder à la ligne ss.close() !
Ce "bloquage" du compilateur permet d'éviter certaines boucles infinis non-souhaité...
Citation:
Envoyé par Yakurena
Qqn pourrait-il me dire s'il existe un moyen de résoudre ce problème ??
Il faut tout simplement que tu détermines une condition de sortie... Cela dépend donc du moyen par lequel le serveur devra s'arrêter...
Par exemple si c'est un des clients qui doit lui envoyer un message de fermeture, il suffit de gérer la condition :
Code:
1 2 3 4 5 6 7 8 9 10 11
| ServerSocket ss = new ServerSocket(1100);
boolean running = true;
while(running)
{
// Traitement ...
if ("END_SERVER".equals(str)) {
running = false;
}
}
ss.close(); |
Sinon tu peux également tuer ton server par un Ctrl-C en utilisant un ShutdownHook comme dans l'exemple du de la FAQ :
Code:
1 2 3 4 5 6 7 8 9 10
| ServerSocket ss = new ServerSocket(1100);
Runtime.getRuntime ().addShutdownHook (new Thread() {
public void run() {
try {
ss.close();
} catch (IOException lException) {
lException.printStackTrace();
}
}
}); |
a++
PS : j'ai rajouté les balises [ code ] dans ton message, merci d'y penser la prochaine fois ;)