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 :

IO serveur et client ! erreur


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut IO serveur et client ! erreur
    Bonjour voilà j'ai un problème avec la tentative de création d'un client / serveur.

    voilà mes deux sources

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    import java.io.*;
    import java.net.*;
    import java.util.*;
     
    public class main {
    	public static void main(String args[]) {
    		System.out.print("Bienvenue sur le chat client...");
     
    		try {
    			socket = new Socket("127.0.0.1",8080);
    		}
    		catch(Exception e) {
    			System.out.print("Erreur ouverture du socket");
    		}
     
    		scanIn = new Scanner(System.in);
     
    		try {
    			out = new PrintWriter(socket.getOutputStream(),true);
    		} catch (Exception e) {
    			System.out.print("Erreur création flux sortant");
    		}
     
    		System.out.print("Variable initialisée : attente de la saisie...");
     
    		String str;
    		while(true) {
    			str = scanIn.nextLine();
    			out.println(str);
    		}
     
    	}
     
    	private static Socket socket;
     
    	private static Scanner scanIn ;
     
    	private static PrintWriter out ;
     
    }
    SERVEUR:
    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
    import java.io.*;
    import java.net.*;
    import java.util.*;
     
    public class main {
    	public static void main(String args[]) {
     
    		try {
    			socket = new ServerSocket(8080);
    		} catch (Exception e) {
    			System.out.println("Erreur création du ServeurSocket");
    		}
     
    		try {
    			s = socket.accept();
    			in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    		} catch (Exception e) {
    			System.out.println("Erreur : " + e);
    		}
     
    		String str = "";
    		try {
    			while ((str = in.readLine()) != null) {
    				System.out.println(str);
    			}
    		} catch (Exception e) {
    			System.out.println("Erreur IO " + e);
    			System.out.println("str : " + str);
    		}
     
    	}
     
    	private static ServerSocket socket;
     
    	private static BufferedReader in;
     
    	private static Socket s;
     
    }
    Voilà si je ferme le server brutalement ( avec la croix du haut par exemple ), le client ne s'en apperçois pas... comment faire donc pour éviter ce genre d'erreur ?
    Et si jamais je coupe le client brutalement, alors une exception du type java.net.SocketException: Connection reset se lance...

    aidez moi à modifier le code pour ne plus avoir ce genre de problème.

    PS: je sais qu'il existe sur le site un tutos qui propose un serveur multi-thread, je l'ai lu mais maintenant j'aimerais essayer d'en faire un moi même.
    Je tente déjà de le faire comme ceci et si il marche je passerais en Thread...

  2. #2
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Lorsque tu coupes le client, cela coupe la liaison socket. Le serveur, qui est en écoute de la liaison socket, se rend compte de la coupure de cette liaison, et tu reçois une exception. C'est un mode de fonctionnement pratiquement normal : tu es en attente, et tu detectes par cette attente que la liaison est coupée. Il y a d'autres façons de procéder, mais celui-ci est parfaitement correct.

    Lorsque tu coupes le serveur, le client, qui n'est pas en écoute de la liaison socket, (puisqu'il écoute la liaison System.in), ne reçoit bien évidemment aucune exception dûe à la coupure de socket. À lire ton code, cela devrait se produire lorsqu'il tentera d'écrire le contenu reçu de System.in vers le serveur.

    Est-ce que tu comprends mieux ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Donc si je veux voir pour le serveur si il est coupé ou non, je doit ouvrir une entrée ( client ) qui écoute les messages en provenance du serveur.
    Si je reçois une exception, alors le serveur est coupé... ?

    Si je suis en multi-thread et qu'une exception est levé, est que l'application va s'arrêter ? par ce que pour le moment, dès que je capte une exception, tout est coupé

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Tu peux attraper les IOExceptions levées lors de l'écriture par le client (cf ce que t'as dit spekal). Sinon tu peux tester l'état de la connection au serveur avec la méthode isConnected() de la classe Socket.

    Une remarque, pense à fermer tes fluxs (dans un bloc finally de préference) .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Points : 19
    Points
    19
    Par défaut
    Ce que tu me conseil de faire par fermer les flux c'est :

    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
     
    import java.io.*;
    import java.net.*;
    import java.util.*;
     
    public class main {
    	public static void main(String args[]) {
    		System.out.print("Bienvenue sur le chat client...");
     
    		try {
    			socket = new Socket("127.0.0.1",8080);
    			scanIn = new Scanner(System.in);
     
    			System.out.println(socket.getInetAddress().toString());
     
    			try {
    				out = new PrintWriter(socket.getOutputStream(),true);
    			} catch (Exception e) {
    				System.out.println("Erreur création flux sortant");
    			}
     
    			System.out.print("Variable initialisée : attente de la saisie...");
     
    			String str;
    			while(socket.isConnected()) {
    				str = scanIn.nextLine();
    				out.println(str);
    			}
    		}
    		catch(Exception e) {
    			System.out.println("Erreur ouverture du socket");
    		}
    		finally {
    			out.close();
    			scanIn.close();
    			try {
    			socket.close();
    			}
    			catch(Exception e) {
     
    			}
    		}
     
     
    	}
     
    	private static Socket socket;
     
    	private static Scanner scanIn ;
     
    	private static PrintWriter out ;
     
    }
    ?

    faut-il détruire les thread aussi ou est que ceci est automatique N

  6. #6
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Moi je trouve ça bien Il y aurait encore plein de choses, mais ce sera pour une autre fois.

    Un thread se termine simplement à la fin de la méthode run. (quel thread ? ).

    Prochain exercice, pour compliquer : que le serveur soit capable de communiquer avec plusieurs clients. Bon week-end.

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Pour fermer les fluxs, il est préférable d'utiliser des blocs try/finally différents .
    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
     
    public class Main {
        public static void main(String[] args) {
            Socket socket = null;
            Scanner scanIn = null;
            PrintWriter out = null;
            System.out.print("Bienvenue sur le chat client...");
            try {
                socket = new Socket("127.0.0.1", 8080);
                System.out.println(socket.getInetAddress().toString());
                scanIn = new Scanner(System.in);
                out = new PrintWriter(socket.getOutputStream(),true);
     
                System.out.print("Variable initialisée : attente de la saisie...");
                try {
                    while(socket.isConnected()) {
                        String str = scanIn.nextLine();
                        out.println(str);
                    }
                } finally {
                    try {
                        out.close();
                    } finally {
                        try {
                            scanIn.close();
                        } finally {
                            if(!socket.isClosed()) {
                                socket.close();
                            }
                        }
                    }
                }
            } catch (UnknownHostException ex) {
                System.out.println("Serveur inconnu");
                ex.printStackTrace();
            } catch (IOException ex) {
                System.out.println("Erreur de flux");
                ex.printStackTrace();
            }
        }
    }
    Attention, car avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(socket.isConnected())
    ton client tournera tant que le serveur ne mets pas fin à la connexion.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. serveur multi client : erreur inconnue
    Par selon dans le forum Réseau
    Réponses: 0
    Dernier message: 29/03/2010, 18h37
  2. remonter erreur du serveur au client
    Par robert_trudel dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 05/09/2008, 12h44
  3. Transfert de fichier Client vers Serveur via INDY erreur ?
    Par bzh56 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 20/03/2006, 10h34
  4. Serveur Multi-clients
    Par darsky dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/04/2004, 09h53
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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