[alg3ir] SocketException: Broken pipe

Voir le sujet précédent Voir le sujet suivant Aller en bas

[alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Jeu 17 Nov 2011, 15:34

Bonjour à tous,

Je rencontre un (voir deux) problème(s) dans le projet :

Dans ServerModel.java j'ai ceci :
Code:
public void setPLayer(int id, PlayerDTO p){
        players.get(id).setNick(p.getNick());
        System.out.println("j'appelle notifyObservers(arg)");
        notifyObservers(players.get(id));
    }
Si je commente le "sout", alors notifyObservers(...) n'est pas appelé. Pourquoi ?

Ensuite, si je ne commente pas cette ligne, j'invoque update(Object, Object) de ThreadClient.
Voici son code : http://paste.pocoo.org/show/3vraIPx1AQ0jWcUpSkXy/
J'ai en sortie de console cette erreur :
nibataillenimanille server: listen to port number 49718
nibataillenimanille server: connexion from /127.0.0.1 on 49721
nibataillenimanille server: manage connexion
Nouvelle connexion client
Etat du PlayerDTO reçu : YOU_JOIN
j'appelle notifyObservers(arg)
J'envoie qqch dans le ThreadClient
c'est un playerDTO que j'envoie
17 nov. 2011 15:27:05 pbt.nibataillenimanille.server.business.MainServer$ThreadListener update
GRAVE: null
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756)
at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1257)
at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1211)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1395)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:333)
at pbt.nibataillenimanille.server.business.MainServer$ThreadListener.update(MainServer.java:209)
at pbt.nibataillenimanille.server.business.ServerModelAbstract.notifyObservers(ServerModelAbstract.java:38)
at pbt.nibataillenimanille.server.business.ServerModel.setPLayer(ServerModel.java:140)
at pbt.nibataillenimanille.server.business.MainServer$ThreadClient.run(MainServer.java:143)

En cherchant sur le web, j'ai eu des indices que mon client aurait pu fermer la connexion de son côté, j'ai vérifié et il me semble que le problème ne vient pas de là. Y a-t-il une autre possibilité ?

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  iCart le Jeu 17 Nov 2011, 23:02

Code:
out.writeObject(StatusDTO.GIVE_UP);

Tu as juste mal lu l'énoncé (principalement la partie sur le protocole), tu n'es pas censé envoyer un StatusDTO, mais un StateDTO au client. (cf documentation)

iCart

Nombre de messages : 58
Age : 27
Prénom : Sylvain
Statut : Echappé 2013
Date d'inscription : 09/12/2009

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Ven 18 Nov 2011, 00:28

iCart a écrit:
Code:
out.writeObject(StatusDTO.GIVE_UP);

Tu as juste mal lu l'énoncé (principalement la partie sur le protocole), tu n'es pas censé envoyer un StatusDTO, mais un StateDTO au client. (cf documentation)
Cela ne changerait pas le comportement du code :/

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  pbt le Ven 18 Nov 2011, 00:59

Dj x-fuse a écrit:Si je commente le "sout", alors notifyObservers(...) n'est pas appelé. Pourquoi ?
Ça c'est assez étrange ^^

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Ven 18 Nov 2011, 09:04

pbt a écrit:
Dj x-fuse a écrit:Si je commente le "sout", alors notifyObservers(...) n'est pas appelé. Pourquoi ?
Ça c'est assez étrange ^^
Effectivement, je n'ai jamais rencontré ce type de bug :/

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Sam 19 Nov 2011, 09:22

Je pense avoir résolu mon problème.
Au lieux de lancer le Thread ThreadListenner via .start(), j'ai seulement utilisé .run();
Je ne sais pas encore les répercutions que cela aura sur mon code (si quelqu'un a une astuce pour voir les threads actifs d'un projet dans netbeans je suis preneur), mais pour l'instance, plus de broken pipe & co Smile

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  nvs le Sam 19 Nov 2011, 11:03

Dj x-fuse a écrit:Au lieux de lancer le Thread ThreadListenner via .start(), j'ai seulement utilisé .run();
Je ne sais pas encore les répercutions que cela aura sur mon code [...]
c'est bien simple : au lieu de placer une nouvelle thread dans le pool des thread de l'application (ce que fait start), tu as juste appelé une méthode d'un objet (run), qui s'est exécutée séquentiellement dans la thread courante...








Idea

_________________

nvs

Nombre de messages : 5238
Age : 43
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Sam 19 Nov 2011, 13:33

nvs a écrit:
Dj x-fuse a écrit:Au lieux de lancer le Thread ThreadListenner via .start(), j'ai seulement utilisé .run();
Je ne sais pas encore les répercutions que cela aura sur mon code [...]
c'est bien simple : au lieu de placer une nouvelle thread dans le pool des thread de l'application (ce que fait start), tu as juste appelé une méthode d'un objet (run), qui s'est exécutée séquentiellement dans la thread courante...
Oui non effectivement, start crée un nouveau thread et appel run() tandis que .run() appel... run() sans créer de nouveau thread, mais cela ne résout en fin de compte pas mon problème... Je continue donc à chercher Smile

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  justblaze le Sam 19 Nov 2011, 13:57

Regarde au niveau de ta méthode update(...) qui reçoit un objet 'observable' qui est de type ServerModel (un petit instanceof pour en être sûr) et un objet 'arg'. En fonction du type de l'objet arg qu'est-ce que tu fais ?

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Sam 19 Nov 2011, 19:07

justblaze a écrit:Regarde au niveau de ta méthode update(...) qui reçoit un objet 'observable' qui est de type ServerModel (un petit instanceof pour en être sûr) et un objet 'arg'. En fonction du type de l'objet arg qu'est-ce que tu fais ?
Salut, le code est fourni dans mon premier post (lien pocoo)

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  justblaze le Sam 19 Nov 2011, 19:19

Code:
ServerModel modele = (ServerModel) observable;
un petit instanceof ServerModel avant pour être sûr (mais ce n'est pas obligatoire).

Code:
try
peut être faire un 'try' uniquement après les tests (souci : on réécrit plusieurs fois la même chose).

Code:
if(id != -1)
test pas utile ici car le ThreadListener doit être créé uniquement lorsqu'un client (donc un joueur) est réellement connecté à la partie (en tout cas c'est ce que je pense).

Code:
if(arg instanceof PlayerDTO){
                        System.out.println("c'est un playerDTO que j'envoie");
                        out.writeObject(arg);
                    }
arg peut être de type String aussi, ce n'est pas géré. Le serveur n'envoie que 2 types String ou StateDTO.

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Dj x-fuse le Dim 20 Nov 2011, 02:23

He he he, je suis doué !

Alors le problème, c'est que dans la fonction connect() j'ai ajouté au try / catch un finally que si le socket est différent de null, je le close (qui pose donc le problème du broken pipe) Very Happy

NON ! Pas taper ! Je sors Smile

Maintenant sa fonctionne Smile

@Ismael, oui oui, c'est du code écrit à l'arrache juste pour tester les appels et la transmission, ce n'est en rien un code propre et définitif Smile

Dj x-fuse

Nombre de messages : 658
Age : 27
Prénom : Jonathan
Statut : 4ième sécu
Localisation : IRL
Date d'inscription : 18/10/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Nicky le Dim 20 Nov 2011, 21:57

pbt a écrit:
Dj x-fuse a écrit:Si je commente le "sout", alors notifyObservers(...) n'est pas appelé. Pourquoi ?
Ça c'est assez étrange ^^

J'ai le même problème.

J'ai l'impression que c'est pas la 1er fois...
Code:
    public void setPLayer(int id, PlayerDTO p) {
        p.setId(id);
        players.add(p);
        System.out.println("notifie");
        this.notifyObservers(p);
    }

Sans "sout" , le notify ne se fait pas.

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Nicky le Mer 23 Nov 2011, 16:49

Nicky a écrit:
pbt a écrit:
Dj x-fuse a écrit:Si je commente le "sout", alors notifyObservers(...) n'est pas appelé. Pourquoi ?
Ça c'est assez étrange ^^

J'ai le même problème.

J'ai l'impression que c'est pas la 1er fois...
Code:
    public void setPLayer(int id, PlayerDTO p) {
        p.setId(id);
        players.add(p);
        System.out.println("notifie");
        this.notifyObservers(p);
    }

Sans "sout" , le notify ne se fait pas.

J'avais oublier ce post.

Le problème venait d'une mauvaise synchronisation des threads...

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  pbt le Mer 23 Nov 2011, 18:42

Nicky a écrit:Le problème venait d'une mauvaise synchronisation des threads...
Devait-on redire qu'il existe le mot clé synchronized ?

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Nicky le Jeu 24 Nov 2011, 20:49

Non synchronized est utiliser ici.

juste que si c'est le bloc synchronized qui contient la méthode setPlayer qui est executer en 1er et non le bloc contenant addObserver, et bien le notify contenu dans setPlayer se fait dans le vent.

j'ai juste ajouter un model.notifyObservers() dans le run de la thread

Nicky

Nombre de messages : 300
Age : 29
Prénom : Pierre
Statut : Tout fini ! 2012
Localisation : Bruxelles / Chimay
Date d'inscription : 18/03/2008

Revenir en haut Aller en bas

Re: [alg3ir] SocketException: Broken pipe

Message  Contenu sponsorisé Aujourd'hui à 21:03


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum