j'ai un probleme avec mon serveur multithread quand je l'arrete pour la 2 eme fois à partir de la barre du tache system
celle-ci est plonté .mais le serveur continuer à servir ses client
j'ai mis un fichier journal coté client et serveur qui entregiste toutes les connexions effectuées
quelq'un peut me donner une solution
voici mon programme serveur
/*************classe serveurA *************/
import java.net.*;
import java.util.Date;
import java.awt.AWTException;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
public class serveurA extends Thread {
final static int port = 9632;
static Socket socket;
Date dt=new Date();
static String fmessage ;
static Socket socketClient;
static FileWriter fichserver;
static ServerSocket socketServeur;
static InetAddress adrLocale;
static MenuItem arret,aide,quit,demar;
static serveurA t ;
static Runnable runner;
static boolean actif =true;
static TrayIcon trayIcon;
static ThreadGroup tgp = new ThreadGroup("groupe");
static ThreadGroup[] GroupesThreads ;
String jours[] = {"Dimanche","Lundi","Mardi","Mercredi","Jeudi","Samedi","Dimache"};
static int i=0;
static String nomterad="";
static Console console;
public static void main(String[] args) {
if (SystemTray.isSupported()) {
SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("icon.jpg");
PopupMenu popup = new PopupMenu();
quit = new MenuItem("quitter");
arret = new MenuItem("Arreter");
demar = new MenuItem("Demarrer");
popup.add(arret);
popup.addSeparator();
popup.add(demar);
popup.addSeparator();
popup.add(quit);
//image, message dans une bulle d'aide, et menu pop-up
trayIcon = new TrayIcon(image, "Serveur de donnée", popup);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
trayIcon.displayMessage("serveur de fichier Bienvenue","Le System Tray en action !",TrayIcon.MessageType.INFO);
}
};
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(actionListener);
try {
tray.add(trayIcon);
} catch (AWTException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
arret.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
//System.exit(0);
arret();
}});
demar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
//System.exit(0);
demarrage();
}});
quit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
System.exit(0);
}});
} else System.err.println("Fontion non supportée");
demarrage();
}
static void arret(){
System.out.println("arret du serveur");
try {
//socketClient.close();
//socket.close();
actif=false;
//if(socket!=null) socket.close();
if(socketClient!=null)socketClient.close();
// t.stop();
socketServeur.close();
//System.out.println("Nombre total de threads dans le groupe apres : " + Thread.currentThread().getThreadGroup().activeCount());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
static void demarrage(){
actif=true;
try {
adrLocale=InetAddress.getLocalHost();
socketServeur = new ServerSocket(port);
System.out.println("Lancement du serveur");
while (true) {
socketClient = socketServeur.accept();
t = new serveurA(socketClient);
t.start();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void controle(String msg) {
if (msg.equals("demar")) demarrage();
else if (msg.equals("arret")) arret();
else if (msg.equals("exit")) System.exit(0);
}
public String getdate() {
int year=dt.getYear()+1900;
return jours[dt.getDay()]+" "+dt.getDate()+"/"+dt.getMonth()+"/"+year
+" à "+dt.getHours()+":"+dt.getMinutes()+":"+dt.getSeconds();
}
public serveurA(Socket socketA) {
this.socket = socketA;
}
public void run() {
try {
fichserver = new FileWriter ("journalserveur.txt",true);
String message = "";
System.out.println("Connexion avec le client : " + socket.getInetAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream());
message = getdate()+" "+in.readLine()+"utilsant le port : "+socket.getPort()+"\r\n";;
//System.out.println("serveur : "+message);
fmessage+=message;
out.println("bonjour c'est le serveur avec adresse : "+adrLocale.getHostAddress()+" et Nom : "+adrLocale.getHostName());
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
fichserver.write(fmessage);
fmessage="";
fichserver.close();
socketClient.close();
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
/************fin classe*********/
/************classe client*********/
import java.net.*;
import java.util.Date;
import java.io.*;
public class clientA {
final static int port = 9632;
static Date dt=new Date();
public static void main(String[] args) {
Socket socket;
DataInputStream userInput;
PrintStream theOutputStream;
try {
FileWriter fichclient = new FileWriter("journalclientB.txt",true);
InetAddress serveur = InetAddress.getByName("127.0.0.1");
socket = new Socket("localhost", port);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream());
out.println("connexion du client "+clientA.class.getName()+" ");
//System.out.println("client : "+in.readLine());
fichclient.write(dt.toLocaleString()+" "+in.readLine());
fichclient.write("\r\n");
fichclient.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
/***************classe clientA****************/
j'ai trouvé la solution
il faut mettre un thread dans le gestionnaire d'evenement des 2 bouton "demar" et "arret" .
j'ai modifié seulement le code suivant
arret.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
t1 = new Thread() {
public void run() {
arret();
}};
t1.start();
}});
demar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
//System.exit(0);
t1 = new Thread() {
public void run() {
demarrage();
}};
t1.start();
}});
quit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
System.exit(0);
}});