arret impossible d'un serveur java la 2 eme fois

abousaadprogrammer
arret impossible d'un serveur java la 2 eme fois

salut
j'ai un soucis avec un serveur utilisant ServerSocket sur le port 9632 en attente
je démarre et j’arrête le serveur à partir d'une barre de tache système.
je démarre le serveur et je l’arrête successivement
la 2 ème fois il ne s’arrête pas alors que la méthode ServerSocket.isclosed() renvoi true et je vois que le serveur est toujours en ecoute sur le port 9632 en tapant la commande netstat -a
Voila ce qu’il donne lors de l"exécution.
----------------------------
Lancement du serveur
server is stopped ? : false
arret du serveur
server is stopped ? : true
Lancement du serveur
server is stopped ? : false
arret du serveur
server is stopped ? : true
le serveur n'a pas pu etre demarré : Address already in use: JVM_Bind
-----------------------------------------------------------------------------------
quelq'un peut me donner une solution pour qu'il s’arrête correctement
voila mon programme composé de 2 classe
classe serveurB : la classe principale
classe methode ou j'ai reuni tous les methodes utilisés
pour le tester il vous faut mettre une icone (image ) que vous devriez la mettre dans le répertoire du programme
ici j'ai la nommé icon.jpg
/************classe serveurB******************/
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
public class serveurB extends Thread{
methode mt=new methode();
ServerSocket socketServeur;
final static int port = 9632;
public static void main(String[] args) {
new serveurB();
}

public serveurB(){
mt.barretache();
//demarrage serveur pour la 1 ere fois
try {
socketServeur = new ServerSocket(port);
mt.iconeisdemar();
System.out.println("Lancement du serveur");
System.out.println("server is stopped ? : "+socketServeur.isClosed());
} catch (IOException e) {
System.out.println(e.getMessage());
}
mt.quit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
System.exit(0);
}});
//fin evenement quit

mt.arret.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
mt.stop(socketServeur);
mt.iconeisarret();
}});

mt.demar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

mt.demarrage(socketServeur);
mt.iconeisdemar();
}});

}

//fin classe
}
/****************Fin classe serveurB*****************/
/****************classe methode********************/
import java.awt.AWTException;
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.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;

public class methode {
//declaration des variable
//serveurB sb=new serveurB();
TrayIcon trayIcon;
MenuItem arret,aide,quit,demar;
PopupMenu popup;
boolean actif ;
InetAddress ab;
final int port = 9632;

//cette methode permet de creer une barre de tache avec menue demarrer,arreter et quitter
void barretache(){

SystemTray tray = SystemTray.getSystemTray();

Image image = Toolkit.getDefaultToolkit().getImage("icon.jpg");

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 omar Bienvenue","Le System Tray en action !",TrayIcon.MessageType.INFO);
}
};
trayIcon.setImageAutoSize(true);
trayIcon.addActionListener(actionListener);
try {
tray.add(trayIcon);
} catch (AWTException e) {

System.out.println(e.getMessage());
}
}
//cette methode permet de demarrer le serveur
void demarrage(ServerSocket skv){
try {

skv = new ServerSocket(port);
System.out.println("Lancement du serveur");
System.out.println("server is stopped ? : "+skv.isClosed());

} catch (Exception e) {
System.out.println("le serveur n'a pas pu etre demarré : "+e.getMessage());
}
}
//cette methode permet d'arrete le serveur
void stop(ServerSocket skv){
try {
skv.close();

} catch (IOException e) {

System.out.println(e.getMessage());
}

System.out.println("arret du serveur");
System.out.println("server is stopped ? : "+skv.isClosed());
}
//cette methode permet de desactiver le lmenu arret quand le serveur est arreté
void iconeisarret(){
arret.disable(); demar.enable();
}
//cette methode permet de desactiver le lmenu arret quand le serveur est arreté
void iconeisdemar(){
demar.disable(); arret.enable();
}

}

/***************fin classe methode****************/

fredericmazue
Re: arret impossible d'un serveur java la 2 eme fois

Bonjour,

J'avoue avoir du mal à comprendre ton code. Le besoin de vacances sans doute. Mais plusieurs choses m'étonnent.

par exemple, je ne vous nulle part d'appel à la méthode accept de ServerSocket.

Mais surtout là :

void demarrage(ServerSocket skv){
try {

skv = new ServerSocket(port);
System.out.println("Lancement du serveur");
System.out.println("server is stopped ? : "+skv.isClosed());

}

A mon humble avis skv passe dans le ramasse-miettes dès qu'on sort de la portée. ServerSocket skv est une copie de la référence d'objet. Quand tu écris
skv = new ServerSocket(port); le ServerSocket du reste du programme et passé en argument ici, n'est pas affecté. Je ne sais pas si je suis clair ? (toujours le besoin de vacances :) )

abousaadprogrammer
Re: arret impossible d'un serveur java la 2 eme fois

merci fredericmazue ça marche maintenatant tu m'a envoyé dans le bon chemin il faut renvoyer la valeur à la classe qui a appelé la methode demarrer() et stop()
voila les modification que j'ai efefctué
/******classe serveurB***********/
mt.arret.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
socketServeur=mt.stop(socketServeur);
mt.iconeisarret();
}});

mt.demar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){

socketServeur=mt.demarrage(socketServeur);
mt.iconeisdemar();
}});
/******classe methode***********/
//cette methode permet de demarrer le serveur
ServerSocket demarrage(ServerSocket skv){
try {
skv = new ServerSocket(port);
System.out.println("Lancement du serveur");
System.out.println("server is stopped ? : "+skv.isClosed());

} catch (Exception e) {
System.out.println("le serveur n'a pas pu etre demarré : "+e.getMessage());
}
return skv;
}
//cette methode permet d'arrete le serveur
ServerSocket stop(ServerSocket skv){
try {
skv.close();
System.out.println("arret du serveur");
System.out.println("server is stopped ? : "+skv.isClosed());

} catch (IOException e) {

System.out.println(e.getMessage());
}
return skv;
}
ce qui m'est arrivé c'est que je ne suis pas habitué à travailler de cette façon en mettant les méthodes dans une classe à part je mets tous dans une seules classe.
maintenant je peut continuer mon serveur multithread ou plusieurs client se connecte sur le serveur pour avoir des info personnel stoqué dans une base de donné et qui sont affiché sous forme d'une table chez les client
la table est à jours chaque fois qu'il y a une modification.
merci de nouveau.
je pourrais avoir besoin pour les thread
s'il y a qque chose tu me trouve au forum.
tchao