Bonjour à tous !
Je développe actuellement une application sous Android, il s'agit d'une application de type Client-Serveur (multi-client).
C'est la première fois que je développe du multi-client.
Pour mettre les choses dans le contexte :
1/ On créé un socket serveur
2/ Lorsqu'un client s'y connecte, on lance un thread pour ce client
3/ La communication se fait non-stop : le serveur répond au client, plus le client lui renvoi des données, etc...
Ce qui est envoyé à travers le socket est un objet de type Communication (qui implémente l'interface serializable bien entendu).
Il est traité de chaque côté et renvoyé, en gros ça fait du ping-pong :p
Dans la classe Communication il y a notamment une ArrayList d'ArrayList d'un objet Point. Je précise, même si ça n'est pas très utile.
Lorsque je fais le test avec deux mobiles, l'un en serveur et l'autre au client, la connexion se fait sans problèmes. La transmission de l'objet
fonctionne également très bien un certains nombre de fois (cela peut varier), mais cela fonctionne et pas qu'une fois.
C'est d'ailleurs pour cela que je ne comprends absolument pas le problème... Cela fonctionne, et puis plus rien... D'autant plus qu'entre deux
émulateurs, il semble n'y avoir aucun problème.
Et voilà les problèmes que j'ai rencontré :
Et même parfois à la place :java.io.InvalidClassException: Read null attempting to read class descriptor for an object
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2069)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
at java.util.ArrayList.readObject(ArrayList.java:662)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1537)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2139)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
at java.util.ArrayList.readObject(ArrayList.java:662)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1537)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2139)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:530)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1552)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2139)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:929)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2285)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2240)
at com.drawid.communication.Client$SocketClient.run(Client.java:153)
Ces deux messages renvoient à cette ligne :java.io.StreamCorruptedException: Wrong format: 0x0
donnees = (Communication) in.readObject();
Cela semble être un problème de header dans le flux (faut-il vider le flux ? Si oui comment dans ce cas là ?), j'ai fais beaucoup de recherches mais je ne trouve aucune solution.
Sachant que l'objet sérialisé a le même UIDversion côté client et serveur, donc pas de problème à ce niveau là.
Je pense que je ne gère pas correctement mes sockets, cela fonctionne correctement un moment, donc ça doit être un problème
qui ne remet pas en cause toute l'architecture, mais lequel est-ce ?
Si certains peuvent me dire ce qui ne va pas dans mon code et/ou ce qui n'est pas très optimisé ? Ou même si quelqu'un à déjà rencontré ce problème,
ce qui serait parfait.
Edit : Ah oui, cela fonctionne parfaitement entre deux émulateurs... allez comprendre...
D'avance, merci
Cordialement
Partager