Bonjour à tous,
Je rencontre un problème assez curieux : je suis entrain d'écrire une petite librairie réseau pour jeux type jeux de société. Celle-ci est basé sur l'échange de messages sous forme d'objets sérialisés.
Afin d'être le plus clair possible, je vais vous décrire l'enchaînement complet :
- un client A demande la création d'une partie
- le serveur instancie la partie, et envoie à tous ses clients la liste des parties ouvertes, mise à jour avec la partie nouvellement créée par A. A chaque partie correspond un objet "NetGame", contenant notamment un tableau d'emplacements dans lesquels d'autres clients pourront s'inscrire. Le premier emplacement est occupé par le client qui a créé (ici A).
- Chaque client va placer les objets "NetGame" issus de la liste envoyée dans des variables d'instances
- un client B va alors demander au serveur son inscription à la partie. il envoie l'identifiant de celle-ci (un entier unique généré par le serveur à la création)
- le serveur va alors placer le client B dans la partie (c'est à dire dans le deuxième emplacement), en modifiant l'objet correspondant, puis va renvoyer une nouvelle liste contenant les parties ouvertes
- A la désérialisation sur les clients, l'objet "NetGame" est inchangé. En particulier, on s'aperçoit dans le débugger d'eclipse que l'id de l'objet "NetGame" désérialisé est le même que celui préalablement placé dans les variables d'instance du client. Du coup le deuxième emplacement de la partie est vide.
Ce qui est assez étonnant, c'est qu'en plaçant un point d'arrêt sur le serveur à la ligne "out.writeObject(message)", et un point d'arrêt sur la ligne suivant "Object message = in.readObject()" sur le client, le contenu de message n'est pas le même à l'émission et à la réception: les données du message reçu sont indentiques à celles des variables d'instance du client.
J'ai recherché un peu sur le net, mais je n'ai pas trouvé grand-chose ; à priori c'est un problème d'écrasement mais je ne vois pas la raison. Le problème étant assez difficile à expliquer, n'hésitez pas à demander des précisions.
Merci d'avance de vos réponses !
Partager