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 :

EOFException et socket.


Sujet :

Entrée/Sortie Java

  1. #1
    Invité
    Invité(e)
    Par défaut EOFException et socket.
    Je me retrouve souvant avec cette exception, a force de changer mon code je me suis dit que je vais demander au forum. Je suis debutant avec les socket d'ou ma p-e mauvaise gestion de ceux-ci j'ai bô regarder sur google j'arrive pas a corriger mon code. merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    java.io.EOFException
    	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325)
    	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794)
    	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
    	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    	at Connexion.<init>(Connexion.java:23)
    	at Serveur.run(Serveur.java:21)
    	at java.lang.Thread.run(Thread.java:744)
    Exception in thread "Thread-1" java.lang.NullPointerException
    	at Connexion.run(Connexion.java:33)
    	at java.lang.Thread.run(Thread.java:744)

    code coté 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
     
    public class Serveur implements Runnable {
     
    	public static void main(String[] args) throws IOException {
    		new Thread(new Serveur()).start();
    	}
     
    	public void run() {
    		try {
    			ServerSocket serverSocket = new ServerSocket(5555);
    			Socket socket;
    			ArrayList<Joueur> listJoueurs = new ArrayList<Joueur>();
     
    			while (true) {
    				socket = serverSocket.accept();
    				new Connexion(socket, listJoueurs);
     
    			}
    		} catch (IOException e) {e.printStackTrace();}
    	}
     
    }
    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
    public class Connexion implements Runnable {
     
    	public Connexion (Socket socket, ArrayList<Joueur> listJoueurs) {
    		this.listeJoueur = listJoueurs;
    		try {
    			this.in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
    			this.out = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
    		} catch (IOException e) {e.printStackTrace();}
    		this.joueur = new Joueur();
    		this.start();
    	}
     
    	@Override
    	public void run() {
    		try {
    			joueur.setNom((String) in.readObject());
    			System.out.print(joueur.getNom());
    			new Reception(joueur, in);
    			joueur.startEmission(out);
    			listeJoueur.add(joueur);
    		} catch (IOException | ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void start () {
    		new Thread(this).start();
    	}
     
    	private Joueur joueur;
    	private ObjectInputStream in;
    	private ObjectOutputStream out;
    	private ArrayList<Joueur> listeJoueur;
     
    }
    coté client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Client {
     
    	public static void main(String[] args) throws IOException {
    		Joueur joueur = new Joueur("douney");
    		Connexion connexion =  new Connexion(joueur);
    		connexion.start();
    	}
     
    }
    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
    public class Connexion implements Runnable {
     
    	public Connexion (Joueur joueur) {
    		this.joueur = joueur;
    		if (joueur.getNom().equals(""))
    			joueur.setNom();
    		try {
    			this.socket = new Socket(InetAddress.getLocalHost(), 5555);
    			this.in = new ObjectInputStream(new BufferedInputStream(this.socket.getInputStream()));
    			this.out = new ObjectOutputStream(new BufferedOutputStream(this.socket.getOutputStream()));	
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void run () {
    		try {
    			this.out.writeObject(this.joueur.getNom());
    			this.out.flush();
    			new Reception(joueur, in);
    			joueur.startEmission(out);			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void start() {
    		new Thread(this).start();
    	}
     
     
    	private Joueur joueur;
    	private Socket socket;
    	private ObjectOutputStream out;
    	private ObjectInputStream in;
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je n'ai pas tout regardé en détail, mais il semble (tout ton code n'est pas posté) que tu ne fermes aucun de tes flux (indispensable), et, comme, en plus, tu ne flushes pas tes output streams, je suppose que qu'il reste des données dans les buffers qui ne sont pas transmises, ce qui expliquerait à priori les EOFException.

    Pour fermer tes flux, regardes :

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ben en faite je garde mes flux pour apres avec deux classe emission/reception pour pouvoir continuer la communication. Je ne les ferme que quand le client se deconnecte, quant au flush(), il est ligne 21 du code client.
    Apres je ne sait pas ce qui est le mieux garder mes flux pour apres ou toujours en recreer puis les refermer.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pour information, entre deux Socket qui se parlent, il faut toujours préparer l'output avant l'input. Bon, pas toujours, mais c'est un principe simple qui évite les ennuis.

    Ici le constructeur de ObjectInputStream commence par lire les en-têtes de la sérialisation. De même, le constructeur de ObjectOutputStream commence par écrire ces en-têtes.
    Donc si les deux côtés commencent par créer l'ObjectInputStream, ils commencent tous les deux par essayer de lire les en-têtes que l'autre doit lui envoyer... Et ne les reçoit pas puisque l'autre, comme lui, ne les enverra pas tant qu'il n'aura pas reçu les siens. Ils restent donc chacun bloqués en l'attente de l'autre pour toujours.

    L'erreur que l'on voit ici provient sans doute d'un timeout quelque part dans le réseau. La socket du client finit par casser et, par chance, cela finit par provoquer sa fermeture. Le serveur, de son côté, voit la socket se fermer avant d'avoir envoyé les en-têtes de sérialisation, ce qui provoque un EOFException.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci thelvin ton explication ma permi de régler mon probleme

Discussions similaires

  1. Erreur de lecture Socket EOFException
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 15/05/2009, 11h51
  2. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  3. socket
    Par ben91 dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2002, 11h04
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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