Thread et ThreadGroup comment les fermer ?

Omeda Messages postés 3 Date d'inscription dimanche 17 avril 2005 Statut Membre Dernière intervention 18 avril 2005 - 17 avril 2005 à 20:13
Omeda Messages postés 3 Date d'inscription dimanche 17 avril 2005 Statut Membre Dernière intervention 18 avril 2005 - 18 avril 2005 à 19:34
<!--StartFragment --> Bonjour tout le monde,
Je suis actuellement entrain de faire une application client/serveur cependant je rencontre quelques difficultés avec les threads, surtout pour leurs fermetures, j'ai bien regardé la faq et fais des recherches sur google mais il reste encore deux trois petits problèmes notement à l a fermeture d'un groude de thread. Je suis débutant et je travaille avec java 1.5.

Voici le code qui me prose problème au niveau du serveur.
J'aimerais que quand je clic sur le JButton de deconnexion du serveur il me ferme tous les threads du groupe client cependant il ne ferme rien du tout.


Code:,
----

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

//Serveur Pong
//Création le 06/02/2005
//Auteur Meda

//A voir
//Processus de watchdog
//Traitement des threads de groupe

//Serveur Pong.
//géré les connexion des clients Ping
public class Pong extends JFrame
{
//Composants de l'interface graphique
JPanel conteneur;//Contient l'interface graphique
JPanel controle;//contient les différents controles du serveur. Ex : connecter

//composant du conteneur controle.
JButton connecter;//Action permet de lancer le serveur.
JButton deconnecter;//Action permet de fermer le serveur.

//autres dans conteneur.
JScrollPane ascenseur;//contient le composant texte
JTabbedPane navigation;//permet la gestion des onglets.
JTextArea texte;//Affichage des actions.

//Parametres serveur
ServerSocket ecoute;
Socket connexion;

//Thread serveur
public ThreadGroup serveur=new ThreadGroup("serveur");
public ThreadGroup client=new ThreadGroup("client");
private Multi lance=new Multi(serveur,"serveur");

//Création de l'interface graphique.
public void init_inter()
{
conteneur=new JPanel();
conteneur.setLayout(null);
controle=new JPanel();
controle.setLayout(new GridLayout(4,1));
connecter=new JButton("Connecter");
connecter.addActionListener(new Lance_Conex());
deconnecter=new JButton("Deconnecter");
deconnecter.addActionListener(new Stop_Conex());
controle.add(connecter);
controle.add(deconnecter);
navigation = new JTabbedPane();
texte=new JTextArea();
texte.setEditable(false);
ascenseur= new JScrollPane(texte,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
navigation.addTab("log",ascenseur);
controle.setBounds(1,1,100,270);
navigation.setBounds(110,1,180,265);
conteneur.add(controle);
conteneur.add(navigation);
getContentPane().add(conteneur);
}

//permet de lancer le serveur.
public class Lance_Conex implements ActionListener
{
public void actionPerformed(ActionEvent lc)
{
lance.setDaemon(true);
lance.start();
}
}

//Permet d'arrter le serveur.
public class Stop_Conex implements ActionListener
{
public void actionPerformed(ActionEvent sc)
{
lance.ferme_multi();
}
}

//Thread permettant le multi-threading.
public class Multi extends Thread
{
private String name;
private boolean serv_connect=true;
private Client_Ping thread_client;
private int numero;
Multi(ThreadGroup serveur,String name)
{
this.name=name;
}
public void run()
{
numero=1;
try
{
ecoute =new ServerSocket(1234);
texte.append("Pong est lancé\n");
while(!this.interrupted())
{
connexion = ecoute.accept();
thread_client=new Client_Ping(client,connexion, numero++);
thread_client.start();
}
}
catch (IOException ioe)
{
texte.append("erreur du thread multi\n");
}
}
public synchronized void ferme_multi()
{
client.interrupt();
serv_connect=false;
texte.append("Fin de la connexion serveur\n");
}
}

//Thread pour chaque client Ping, il permet de faire la connexion entre le client et le serveur.
public class Client_Ping extends Thread
{
private Socket connexion;//socket de connexion au serveur
private boolean connecter=true;//le client Ping est-il encore connecté ?
private int numero;//numéro du thread.
public Client_Ping(ThreadGroup client,Socket connexion, int numero)
{
this.connexion = connexion;
this.numero = numero;
}
public void run()
{
texte.append("Un Ping est connecté\n");
while(connecter)
{
try
{
BufferedReader entree = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
PrintWriter sortie = new PrintWriter(connexion.getOutputStream(),true);
sleep(18000);
sortie.println("pong");
sleep(2000);
String ligne = entree.readLine();
if(ligne.equals("ping"))
{
texte.append("ping\n");
}
else
{
ferme_client();
}
}
catch(NullPointerException npe)
{
texte.append("Ping est déconnecté\n");
connecter=false;
}
catch(Exception e)
{
texte.append("Erreur : "+e+"\n");
connecter = false;
}
}
}
public synchronized void ferme_client()
{
texte.append("fermeture du client\n");
connecter=false;
}
}

//serveur Pong
Pong()
{
init_inter();// lancement de l'interface
setVisible(true);
setResizable(false);
setTitle("Pong");
setSize(300,300);
setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}
public static void main(String args[])
{
new Pong();
}
}

Si vous avez besoin de plus d'indication dites le moi.
Merci beaucoup pour votre aide.

4 réponses

safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
18 avril 2005 à 11:36
Je
voi m=pas l'interet à Multi, mai pour lancer un thread Thread_Client
par exemple dans le groupe client, faut que le constructeur de
ThreadClient contient l'appel super(client,"nouveauclient"+i); (là
"nouveauclient"+i c'est k'un exemple, tu pe appeler ton nouveau bébé
comme tu ve).
0
Omeda Messages postés 3 Date d'inscription dimanche 17 avril 2005 Statut Membre Dernière intervention 18 avril 2005
18 avril 2005 à 12:07
En fait le thread multi est un thread d'écoute de nouveau clients.
0
safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
18 avril 2005 à 13:23
dans ce cas t'aurras pas besoin de cette partie, car c'est de l'écoute ce qu'elle fait:

while(!this.interrupted())
{
connexion = ecoute.accept();
thread_client=new Client_Ping(client,connexion, numero++);
thread_client.start();
}
0
Omeda Messages postés 3 Date d'inscription dimanche 17 avril 2005 Statut Membre Dernière intervention 18 avril 2005
18 avril 2005 à 19:34
en fait se bout de code est une boucle infinie qui permet en cas d'une
connexion d'un nouveau client de fabriquer un thread client. Mais j'ai
du mal avec les thread donc je ne sais pas comment faire.
0
Rejoignez-nous