java.io.EOFException

java.io.EOFException - Java - Programmation

Marsh Posté le 07-06-2004 à 10:05:45    

Bonjour,
J'ai un prob avec une appli java,
Dans le bout de code suivant:
 

Code :
  1. while(!stop)
  2. {
  3. try
  4. {
  5.  incx_out = new ObjectInputStream(socket_out.getInputStream());
  6.  Message dog =(Message) incx_out.readObject();
  7.  messageQueue.insert(dog);
  8.  System.out.println("message recu" );
  9. }catch(EOFException e)
  10. {
  11.  System.err.println("error 19 :" + e);
  12.  try{
  13.   sleep(20);
  14.  }catch(Exception x)
  15.  {
  16.   //...
  17.  }
  18. }catch(...)
  19. {
  20.  //...
  21. }
  22. }


 
Ce bout de code attend systématiquement de lire un objet sur socket_out, dans la plupart des cas, ca marche sans problème, or lors de certain test, assez fréquement (ou je fais rien de particulier) j'obtiens une java.io.EOFException, et le programme boucle indéfiniment et affiche :
error 19 :java.io.EOFException
Et rien de ce que j'ai essayer n'as fonctionner pour gerer cette exception.(j'ai supprimer mes essais dans le codes ci dessus)
Autres constatation, ce problème ne survient qu'avec l'objet "socket_out", (plus haut dans le code, je fais la meme opération avec un autre socket, et le problème n'est jamais apparu)
Et le problème n'apparait jamais , si il n'est pas appararut lors de la première itération de la boucle.
Donc , comment faire pour gèrer ce problème (autrement qu'en coupant le thread en en demandant a l'utilisateur de se reconnecter, solution actuel)?
D'après vous, c'est bien un problème du au système? ou pensez vous plutot que c'est une faute dans mon code (éventuellement ailleurs)?
Voila j'espere que j'ai été assez clair, en attendant merci d'avance pour vos réponses  :jap:


Message édité par Nico5779 le 07-06-2004 à 10:06:31
Reply

Marsh Posté le 07-06-2004 à 10:05:45   

Reply

Marsh Posté le 07-06-2004 à 11:04:32    

T'es sur qu'il faudrait pas sortir cette ligne de la boucle ?
 
incx_out = new ObjectInputStream(socket_out.getInputStream());
 
Sinon, je pense que ton exception vient du fait que socket_out
n'a pas été correctement initialisé : debug : affiche socket_out et/ou affiche le avec toString pour voir.
 
Si socket_out est mal initialisé, à chaque itération,
socket_out.getInputStream() te donne soit une exception, soit unb mauvais stream.
 
Je pense qu'il y a une grande chance que ton socket_out soit mal initialisé quand ça plante.

Reply

Marsh Posté le 07-06-2004 à 11:14:33    

si je la sors de la boucle ca a pas l'aire de changer quoi que ce soit (l'erreur finit qd meme par arrivé)
Sinon je teste, ce que t as dit, on verra bien si je découvre quoi que soit, mais si socket_out est mal initilialisé, j'aurais du obtenir une exception avant non?
lors du connect ou koi non?
Pourtant ni le client ni le serveur ne remarque quoi que ce soit avant d'entré dans la boucle.

Reply

Marsh Posté le 07-06-2004 à 11:26:13    

en affichant socket_out j'obtiens toujours la meme chose, qd ca marche ou pas.

Reply

Marsh Posté le 07-06-2004 à 14:24:58    

Ba déjà laisse la premiere ligne en dehors du code. Parce qu'à chaque itération tu créé un nouvel objet pour rien.
Pour l'exception avec connect. Je sais pas comment t'as géré ça.
Donne quand meme le e.printStackTrace(), et socket_out et incx_out.
Tu ne fais pas de MultiThread la dessus ? si ?
 
Je sais pas si je pourrai t'aider...

Reply

Marsh Posté le 07-06-2004 à 19:52:25    

re, desolé si j'ai trainé, j'avais exam de Gui justement :)
voila pour le stacktrace:

Code :
  1. java.io.EOFException
  2. at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2165)
  3. at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2634)
  4. at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:734)
  5. at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
  6. at Client$Receive.run(Client.java:256)


 
(j'aurais du y penser avant d'ailleurs)
Et oui, le client utilise plusieur thread, en fait celui ci démarre après un processus de connection (qui n'emploie que socket_in), ecoute tout ce qui arrive et le fous dans une file, un autre thread s'oqp du traitement des Message recus.
As tu/avez vous une idée??


Message édité par Nico5779 le 07-06-2004 à 19:53:01
Reply

Marsh Posté le 07-06-2004 à 21:30:55    

Nico5779 a écrit :

re, desolé si j'ai trainé, j'avais exam de Gui justement :)
voila pour le stacktrace:

Code :
  1. java.io.EOFException
  2. at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2165)
  3. at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2634)
  4. at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:734)
  5. at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
  6. at Client$Receive.run(Client.java:256)


 
(j'aurais du y penser avant d'ailleurs)
Et oui, le client utilise plusieur thread, en fait celui ci démarre après un processus de connection (qui n'emploie que socket_in), ecoute tout ce qui arrive et le fous dans une file, un autre thread s'oqp du traitement des Message recus.
As tu/avez vous une idée??


 
Je pense avoir une idée du problème : un des thread doit utiliser ton Stream ou ta/tes sockets avant que celui/celle(s)-ci aie été complètement initialisé. Il faut que tu t'arranges pour que  
les thread ne commencent qu'à recevoir/envoyer qu'apres que la socket et le stream dessus soit initialisé. Sinon apparemment ca risque de merder parfois. => synchronized ta socket et ton stream.
Voilà j'espère que ça pourra t'aider ...  :sol:
 
 
 
 

Reply

Marsh Posté le 08-06-2004 à 00:05:27    

bien vu  ;)  
J'ai modifié mon processus de connection, de sorte que le server envoie un message bidon sur socket_out avant de lancer les threads, et après un premier test (une 50aine de connect/deconnect) , et on dirait que ca le fait le plus  :)  
un grand merci  :jap:
 
edit: j'y avait penser mais pas comme ca, j'avais tenter un bourrinnage avec un gros sleep avant la boucle, et curieusement, plus long etait le sleep, plus fréquentes etait l'erreur.


Message édité par Nico5779 le 08-06-2004 à 00:08:41
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed