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

Contribuez .NET Discussion :

[C#] Comment implémenter le passage d'un objet dans une socket ? [FAQ]


Sujet :

Contribuez .NET

  1. #1
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut [C#] Comment implémenter le passage d'un objet dans une socket ?
    J'ai un objet personnel : Grille à envoyer à un serveur.
    J'utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Socket maSocket = new Socket();
    ...
    byte[] buffer;
    MaSocket.send(buffer, buffer.length, SocketFlags.None);
    C'est une méthode que j'ai trouvée mais je n'y arrive pas car je n'arrive pas à convertir l'objet Grille en tableau de byte.

    Merci pour vos réponses.

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    il faudrait que tu nous en dises plus de cet objet Grille pour qu'on puisse t'aider à le convertir en Bytes

  3. #3
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    L'objet Grille contient 3 variables de type integer , un tableau d'objets à 2 dimensions + ses méthodes.

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    peut être en passant par une serialisation binaire
    Classe BinaryFormatter
    tu devrais pouvoir recupérer le BinaryStream sous la forme d'un Byte[]

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    +1 avec neguib (j'aime bcp ton avatar ;-))

  6. #6
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    merci neguib
    J'essaierai avec ça

  7. #7
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Si je comprend bien le principe :

    Coté Client
    - Je sérialise ma classe OK
    - Puis je récupere []byte OK
    - Ensuite je l'envoie dans la socket OK

    Coté serveur
    - Je récupere []byte OK
    - Puis il faut que je le désérialise ??
    (Faut-il que je le remette dans un fichier pour pouvoir le désérialiser ?? )

  8. #8
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Ben tout depends de ce que tu dois en faire, tu envoies cet objet pourquoi pour quel traitement :

  9. #9
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Salut .

    il faut pour que ton objet soit utilisable à la réception que tu le désérialises effectivement .

    Pour qu'un objet soit sérialisable il faut que la classe de cette objet soit marqué comme étant sérialisable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [Serialisable]
    public class testSeri
    {
     
    }

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par pbn
    Coté serveur
    - Je récupere []byte OK
    - Puis il faut que je le désérialise ??
    (Faut-il que je le remette dans un fichier pour pouvoir le désérialiser ?? )
    Oui tu deserialize toujours avec BynaryFormatter et MemoryStream.
    Pas besoin de mettre dans un fichier.

    Si tu y arrives pas je filerai un exple ;-)

  11. #11
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    j'ai bien mis
    devant ma classe de ce coté la pas de probleme

    J'ai réussi a sérialiser avec BynaryFormatter et MemoryStream
    Je le passe ensuite dans la socket

    Mais quand j'essaie de déserialiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ClientSocket.Receive(btDonneesTransf, btDonneesTransf.Length, SocketFlags.None);
    MemoryStream memStream = new MemoryStream(btDonneesTransf.Length+1);
    try 
    {
    	memStream.Position = 0;
    	memStream.Write(btDonneesTransf, 0, btDonneesTransf.Length-1);
    	BinaryFormatter formatter = new BinaryFormatter();
            maClasse =  (Classe)formatter.Deserialize(memStream);
            ....
    }
    .....
    j'ai une exception qui est levée
    Fin de flux rencontrée avant la fin de l'analyse

  12. #12
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Tu es sur que tout ton objet reçu en un seul appel de Receive?
    Quelle est la taille de ton buffer?

  13. #13
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    le buffer fait 147 (si c'est la taille du tableau que tu me demande)

  14. #14
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par pbn
    le buffer fait 147 (si c'est la taille du tableau que tu me demande)
    Il n'est pas assez grand. Ton objet fait surement plus de 147 octets et avec la sérialisation ça augmente encore.
    Pourquoi 147?
    Il y a une raison?
    Sinon essaye plus grand. 1024 par exemple

  15. #15
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    formatter.Serialize(memStream, maClasse);
    Console.WriteLine(memStream.Length.ToString())   // 147;
    147 c'est la valeur de memStream apres la sérialisation

  16. #16
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Je parle de la taille du tableau de bytes (lol ça me fait tjrs rire ça j'y peux rien) btDonneesTransf

  17. #17
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    je l'ai mis à 1024 comme tu m'as dis et ça marche
    Merci

    mais je croyais qu'il devait être de la même taille que memStream
    Y a t'il un moyen de savoir exactement à quel taille je dois l'initialiser ?
    du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] btDonneesTransf = new byte[quelqueChose.length]
    Je sais pas si je dois créer un autre sujet mais j'ai une seconde question :

    Je dois passer un autre objet comment faire la différence (pour celui qui reçoit) entre les 2 objets (pour pouvoir utiliser la déserialisation approprié)?

  18. #18
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    1024 fonctionne pour ce cas là.
    Pour un objet plus gros cela ne fonctionnera peut être pas.
    Si tu veux commencer à passer plus de données dans tes sockets tu auras surement à mettre en place un protocole.
    Au lieu d'envoyer juste ta classe dans le tableau de byte, tu mets d'abord la taille totale du message que tu envoies, puis un indicateur savoir le type de message (ou de classe par exple : ça répond à ta 2ème question) puis tu mets ton objets.

    Comme ça sur le serveur tu sais que tu dois lire d'abord la taille du message, puis le type du message, puis le message.

    J'espère que c'est assez clair ??

  19. #19
    pbn
    pbn est déconnecté
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    ok
    je comprend au sujet de l'indicateur (type de message) mais pourquoi je dois aussi passer la taille total du message envoyer ?

    j'ai essaier sans passer la taille total du message dans le message et ça marche

    MERCI A TOUS

  20. #20
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Super
    La taille du message peut te servir dans le cas ou ton buffer n'est pas assez grand pour contenir un objet entier

    Imagine tu as un buffer de 1024. Mais tu envoies à la suite trois objets qui font 500, 500 et 500.

    Tu vas lire les deux premiers OK.
    Et le troisième tu auras l'erreur 'Fin de flux avant analyse'

    Si tu mets la taille du message dans ta trame, tu peux detecter si tu as tout le message disponible dans le buffer. Si oui tu le traites, sinon tu stockes la partie reçue et tu refais un Receive pour avoir le reste ... et ainsi de suite.

    [edit]
    Tu peux eviter ce genre de tracasserie en mettant un buffer très grand : exple: 10*1024
    [edit]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/12/2007, 15h16
  2. [Struts] [HashMap] passage d'un bean dans une HashMap
    Par cosmos38240 dans le forum Struts 1
    Réponses: 4
    Dernier message: 29/09/2005, 17h05
  3. Comment faire pour faire glisser un objet dans une form ?
    Par Olun dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2005, 18h49
  4. [SQL Server] Passage d'un paramètre dans une procédure
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 14h19
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 11h15

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