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

Entrée/Sortie Java Discussion :

[Socket] Envoi de texte et d'objets par socket


Sujet :

Entrée/Sortie Java

  1. #1
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut [Socket] Envoi de texte et d'objets par socket
    Bonjour,

    Je tente désespérément d'envoyer par socket à la fois du texte (par un PrintWriter) et des objets (ObjectOutputStream).
    Voilà un bout de code du client (attention, c'est plein de variables mais leur type est correct, l'erreur ne vient pas de là) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Socket sock = new Socket(Parametres.IP_SERVER, Parametres.PORT_SOCKET);
    BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    PrintWriter os = new PrintWriter(sock.getOutputStream(), true);
    //Envoi de l'info de départ pour identifier le document à générer
    os.print("CreationEtatSection" + "\r\n");
    //Envoi des informations générales
    os.print(_parent._cboSection._mapCodeLibelle.get(_section).toString() + "\r\n");
    os.print(_user._nom + "\r\n");
    os.print(_grade + "\r\n");
    os.print(nbSemaines + "\r\n");
    os.print(nbAgents + "\r\n");
    //Envoi des dates à afficher
    GregorianCalendar dateEnCours = new GregorianCalendar(dateDebut.get(Calendar.YEAR), dateDebut.get(Calendar.MONTH), dateDebut.get(Calendar.DATE));
    for (int i = 0; i < nbSemaines * 7; i++) {
      int mois = dateEnCours.get(Calendar.MONTH) + 1;
      os.print(Outils.afficheDate(dateEnCours.get(Calendar.DATE)) + "/" + Outils.afficheDate(mois) + "\r\n");
      dateEnCours.add(Calendar.DATE, 1);
    }
    os.flush();
    //Envoi des activités jour après jour pour chaque agent
    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
    oos.writeObject(data);
    oos.writeObject(_actis);
    oos.writeObject(_cookColor);
    oos.writeObject(_parent._cboActis._mapCodeLibelle);
    oos.flush();
    oos.close();
    os.close();
    sock.close();
    J'ai plusieurs questions :
    1/ Pourquoi fermer os puis ouvrir oos provoque la fermeture de la socket (erreur du type : socket closed) ? On parle bien d'un flux et pas de la socket à proprement parler ?

    2/ Quand j'effectue 2 fois de suite se code, même après avoir fermé la socket et l'avoir réouverte, je prends, côté client, l'erreur suivante :
    java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
    at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at tempo.FeuilleSection.genererPage(FeuilleSection.java:300)
    La ligne 300 est le premier writeObject : writeObject(data)

    Côté serveur, voilà le message :
    java.io.StreamCorruptedException: invalid stream header
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at tempo.TempoServer.traiter(TempoServer.java:314)
    at tempo.TempoServer.main(TempoServer.java:87)
    Celui-là correspond, côté serveur à ois = new ObjectInputStream(clientSocket.getInputStream());

    Je suis un peu perdu dans ce qu'il faut ouvrir, et fermer, et quand.

    Merci de votre aide,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Il est assez délicat d'envoyer dans un stream à la fois des objets et du texte, parce que les ObjectXXStream spécialisent le flux, en y mettant par exemple des headers, et toutes sortes de choses.

    Si tu y tiens absolument, tu peux y arriver, en intervenant sur le fonctionnement interne de ces streams ; à mon avis le jeu n'en vaut pas la chandelle.

    Le plus simple est de mettre ton texte dans des objets java, comme des String ou des BufferString, et d'envoyer ces objets par le ObjectOutputStream.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Merci de ton aide. C'est effectivement cette spécialisation du flux qui me pose problème ici (je comprends mieux les erreurs générées à présent). La solution que tu préconises est celle à laquelle je pensais, et que je redoutais un peu, parce qu'il faut qu eje modifie pas mal de code.

    Mais bon, tant pis. Je m'y colle.

    Merci encore,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Une autre approche est de faire l'inverse : au lieu de transformer les chaines de caractères en objets, tu transformes les objets en chaine de caractères Au lieu de l'ObjectOutputStream, ce serait le PrintStream qui serait ton flux de base.

    C'est relativement facile avec java.beans.Encoder, qui transforme un objet en flux xml, la contrainte est qu'il faut que ton objet suive le modèle des beans.

    Sinon, si ton objet n'est pas compliqué, tu peux en faire une version en chaine de caratères, que tu réinterpretes en recréant l'objet ; c'est une sérialization / désérialization perso, quoi.

    Sinon, si ton objet ne suit pas le modèle des beans, et qu'il est compliqué... je ne sais pas.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Cette seconde solution est effectivement plus compliquée, sachant que je fais passer des ArrayList contenant des objets Color. J'ai donc, finalement, remplacé tous mes transferts de chaînes de caractères par des transferts d'objets. Et ça marche bien mieux désormais.

    Merci de ton aide,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Bon j'aurais dû te dire que les XMLEncoder passaient aussi très bien tout ce qui est collection java, en particulier les ArrayList... Enfin tant mieux si la première solution marche.

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ceci dit, la solution XMLEncoder peut m'intéresser pour l'avenir. Est-ce que j'abuse si je te demande où je peux trouver des infos sur la façon dont on doit s'y prendre ?

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Expert éminent

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Points : 8 235
    Points
    8 235
    Par défaut
    La javadoc contient un exemple pour le XMLEnconder. Ca marche comme les ObjectOutPutStream, sauf que c'est du XML donc un peu plus bavard. L'avantage est que c'est lisible quand c'est envoyer vers des fichiers.

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

Discussions similaires

  1. Serialisation d'objet et envoie par socket
    Par alex8276 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/04/2015, 23h18
  2. Communication d'un Objet par socket
    Par Kiisuk dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2013, 16h43
  3. échange d'objets par socket
    Par korkoth dans le forum MFC
    Réponses: 5
    Dernier message: 10/01/2008, 15h30
  4. Envoi d'une capture d'ecran par socket
    Par manu225 dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/01/2007, 15h59
  5. Réponses: 5
    Dernier message: 19/07/2006, 11h24

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