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

API standards et tierces Android Discussion :

Problèmes application Client-Serveur multi-clients


Sujet :

API standards et tierces Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 41
    Points : 79
    Points
    79
    Par défaut Problèmes application Client-Serveur multi-clients
    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é :

    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)
    Et même parfois à la place :

    java.io.StreamCorruptedException: Wrong format: 0x0
    Ces deux messages renvoient à cette ligne :

    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

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,


    Euh , à tout les coup tu récupères une valeur nulle ou erronée et lors du cast bye bye .

    Ce que tu peux faire :

    a toi de voir ce que tu veux attraper comme Exception

    ClassNotFoundException if the class of one of the objects in the object graph cannot be found.
    IOException if an error occurs while reading from the source stream.
    OptionalDataException if primitive data types were found instead of an object.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bis = new ByteArrayInputStream(b);
    in = new ObjectInputStream(bis);
    if (in.available() > 0 ) {
        donnees = (Communication) in.readObject();
    }
    De plus essaye de faire une meilleur gestion de la fermeture de ton close dans un finally avec un try catch qui englobe le tout, comme tu avais commencé à faire .
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un serveur multi client (problème de thread)
    Par Benyou dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 21/08/2013, 01h27
  2. [Base de donnée] Une seule transaction dans une application client/serveur multi-utilisateurs
    Par Socrat dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2011, 10h12
  3. [Client/serveur] Compiler Client / Serveur
    Par torNAdE dans le forum Linux
    Réponses: 3
    Dernier message: 20/10/2008, 22h08
  4. Réponses: 7
    Dernier message: 22/01/2008, 08h05
  5. Client-Serveur Dcom = Client+Serveur lancés sur la machine ?
    Par Jilam dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/07/2004, 14h55

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