IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres Java Discussion :

Arrêt impossible d'un serveur Java en utilisant ServerSocket lors du 2ème essai


Sujet :

Autres Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    téléconseiller informatique
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : téléconseiller informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Arrêt impossible d'un serveur Java en utilisant ServerSocket lors du 2ème essai
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ----------------------------
    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
    -----------------------------------------------------------------------------------
    quelqu'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******************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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********************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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****************/

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les paramètres des méthodes en java sont toujours passés par copie, autrement dit, quand tu fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void demarrage(ServerSocket skv){
    try {
     
    skv = new ServerSocket(port);
    tu nee change pas la socket du coté de l'appelant. Si l'appelant a besoin de récupérer la socket, il faut la lui retourner (valeur de retour)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ServerSocket demarrage(){
    try {
     
    ServerSocket skv = new ServerSocket(port);
    return skv;

  3. #3
    Futur Membre du Club
    Homme Profil pro
    téléconseiller informatique
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : téléconseiller informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut ça marche maintenatant
    merci tchize t'a raison il faut renvoyer la valeur à la classe qui a appelé la methode demarrer() et stop()
    voila les modification que j'ai efefctué
    /******classe serveurB***********/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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***********/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    téléconseiller informatique
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : téléconseiller informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut plontage de le barre de tache lors de l'arret du serveur
    j'ai un un autre 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
    il y a un seulement un echange de messages enttre client et serveur les message echangé son enregistrés dans un fichier journal coté client et serveur.
    quelq'un peut me donner une solution
    voici mon programme serveur
    /*************classe serveurA *************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    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 omar 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*********/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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****************/

    abousaadprogrammer
    Membre
    Membre

    Messages: 4
    Inscription: 27 Nov 2011 04:56

  5. #5
    Futur Membre du Club
    Homme Profil pro
    téléconseiller informatique
    Inscrit en
    Novembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : téléconseiller informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 5
    Points : 7
    Points
    7
    Par défaut j'ai trouvé la solution au problème de plontage
    il faut appeler la méthode dans un thread car il y a déjà un thread lancé entrain d'attendre les requete des clients
    j'ai modifié seulement le code suivant:

    demar.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
    //System.exit(0);

    t = new Thread() {
    public void run() {
    demarrage();
    }};
    t.start();
    }});
    arret.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
    t = new Thread() {
    public void run() {
    arret();
    }};
    t.start();
    }});

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/08/2013, 16h37
  2. Arrêt Impossible de Interbase
    Par the watcher dans le forum InterBase
    Réponses: 1
    Dernier message: 22/04/2005, 17h01
  3. [SOCKET] Client C connecté à un serveur Java
    Par missllyss dans le forum Développement
    Réponses: 2
    Dernier message: 07/06/2004, 13h14
  4. [Delphi5] TNMDayTime quel serveur de temps utiliser?
    Par lolo le belge dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/04/2004, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo