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

Entrée/Sortie Java Discussion :

Arrêt d'un serveur multithread


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut Arrêt d'un serveur multithread
    bonjour,
    je suis en train de tester un programme qui lance un thread serveur, qui ecoute sur un port et lance des thread de services pour les clients.
    j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (!fin) {
    				clientSocket = serverSocket.accept();
    				Thread clientThread = new Thread(new ServiceBiblio(
    						serverAddress, clientSocket, gdd));
    				clientThread.start();
    				fin = stopThread;
    			}
    basé sur le code trouvé dans la FAQ et j'ai une fonction stop() comme décrit dans la faq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public synchronized void stop() {
            this.stopThread = true;
    }
    mon probleme est si je souhaite arreter le serveur pendant qu'il est en train d'écouter...bah ça marche pas, normal il n'est pas en train de parcourir la boucle...il écoute..
    je ne vois pas trop comment arreter ce serveur proprement, j'ai essayé un violent serverSocket.close(), mais ça arrete carrement le programme principale...trop violent

    pouvez vous m'aider s'il vous plait?

  2. #2
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    il fait autre chose après l'exécution du serveur ton programme principal ? sinon c'est normal que ton programme s'arrête après un close() ?
    Qu'est ce que tu voudrais faire après l'extinction du serveur ?

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Pour stopper les connections réseaux il faut utiliser des InterruptibleChannel qui permettent d'intérrompre les méthodes bloquantes comme "accept()"...


    Pour les sockets tu dois donc utiliser la classe ServerSocketChannel, par exemple :

    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
     
    		ServerSocketChannel serverSocketChannel = null;
    		ServerSocket serverSocket = null;
    		Socket clientSocket = null;
    		boolean fin = false;
     
    		try {
    			SocketAddress address = new InetSocketAddress(9999);
    			serverSocketChannel = ServerSocketChannel.open();
    			serverSocket = serverSocketChannel.socket();
    			serverSocket.bind(address);
     
    			while (!fin) {
    				try {
    					clientSocket = serverSocket.accept();
     
    					// Traitement sur le clientSocket
     
    				} catch (ClosedByInterruptException lException) {
    					fin = true;
    				}
    			}
    		} catch (IOException lException) {
    			// TODO Auto-generated catch block
    			lException.printStackTrace();
    		} finally {
    			try {
    				if (serverSocket!=null) {
    					serverSocket.close();
    				} 
    			} catch (Exception lException) {}
     
    			try {
    				if (serverSocketChannel!=null) {
    					serverSocketChannel.close();
    				} 
    			} catch (Exception lException) {}
    		}
    Ensuite il te suffit d'utiliser la méthode interrupt() sur le thread de ton serveur, cela générera une exception du type ClosedByInterruptException lorsque tu es dans accept()...

    a++

  4. #4
    Membre du Club Avatar de bambou
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2004
    Messages : 192
    Points : 69
    Points
    69
    Par défaut
    yes c'est nikel merci (encore) adiGuba

    et, FFF, aprés l'arret du serveur, le programme principal sauvegarde les données, la configuration...etc, et indépendament de l'arret du serveur, le programme doit permet de faire de l'administration sur certaines données.

    encore merci à vous et bonne journée

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par adiGuba

    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
            ServerSocketChannel serverSocketChannel = null;
            ServerSocket serverSocket = null;
            SocketChannel clientSocket = null;
            boolean fin = false;
    
            try {
                SocketAddress address = new InetSocketAddress(9999);
                serverSocketChannel = ServerSocketChannel.open();
                serverSocket = serverSocketChannel.socket();
                serverSocket.bind(address);
                
                while (!fin) {
                    try {
                        clientSocket = serverSocketChannel.accept();
                        
                        // Traitement sur le clientSocket
                        
                    } catch (ClosedByInterruptException lException) {
                        fin = true;
                    }
                }
            } catch ...
    Bonjour,
    Je remonte un vieux thread mais ce ne serait pas plutôt comme ca ?

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Socket ou SocketChannel, même combat, armes différentes...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Probleme serveur
    Bonjour

    je remonte ce thread

    j'ai utilisé vos implémentations utilisant les channels pour pouvoir stopper mon thread bloqué en accept(), et cela fonctionne parfaitement, ou presque.
    En effet, maintenant mon programme se ferme proprement, mais plus aucun client ne peut se connecter au serveur...

    depuis que j'utilise les channels mon serveur ne peut plus rien recevoir !

    avez vous une idée d'où cela pourrait venir ?

    Merci de votre aide

    ( j'utilise Java 1.5.0 )

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 33
    Points : 37
    Points
    37
    Par défaut
    J'essaie de faire la même avec DatagramChannel.

    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
    try {
    			datagramChannel = DatagramChannel.open();
    			socket = datagramChannel.socket();
    			SocketAddress address = new InetSocketAddress(udpPort);
    			socket.bind(address);
    			DatagramPacket datagramPack = new DatagramPacket(buffer,
    					buffer.length);
     
    			while (live) {
     
    				try {
    					socket.receive(datagramPack);
    					ACLMessage aclMessage = getACLMessageFromByte(datagramPack
    							.getData());
    					notifyTCPPMessageListener(aclMessage);
    				} catch (ClosedByInterruptException e) {
    					live = false;					
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
     
    			}
    		} catch (SocketException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (socket != null) {					
    					socket.close();
    				}
    			} catch (Exception lException) {
    			}
     
    			try {
    				if (datagramChannel != null) {					
    					datagramChannel.close();
    				}
    			} catch (Exception lException) {
    			}
    		}
    	}
    Mais quand j'utilise interrupt() le thread ne s'arrête pas. Si quelqu'un a un exemple de code similaire je suis preneur.

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

Discussions similaires

  1. architecture serveur multithread
    Par hisoka dans le forum Développement
    Réponses: 2
    Dernier message: 25/11/2006, 21h05
  2. conception serveur multithread
    Par nivose110 dans le forum Réseau
    Réponses: 12
    Dernier message: 17/07/2006, 16h43
  3. Question Serveur Multithread
    Par Mr_Chut dans le forum Réseau
    Réponses: 10
    Dernier message: 09/06/2006, 17h27
  4. Réponses: 5
    Dernier message: 11/01/2006, 07h58

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