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 :

Encode du flux de sortie d'un socket


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Encode du flux de sortie d'un socket
    Bonjour,

    J'aimerais savoir comment je peux définir un encodage précis à mon flux de sortie de mon socket ?

    Est-ce que quelqu'un a une idée ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Utilises un OutputStreamWriter...

    a++

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    OK merci c'est la solution que pour laquelle j'ai opté.
    En fait, je me suis trompée, il ne s'agissait pas du flux de sortie mais plutôt du flux d'entrée donc j'ai crée un InputStreamReader pour récupère la réponse du socket.

    Maintenant ce que je dois faire c'est stocker ce flux dans un fichier.
    En fait, c'est la réponse d'une requête HTTP avec un transfer-encoding: chunked.

    Ce que je fais c'est que je lis mon flux, je récupère la taille du paquet que je convertis. Et là, je crée un buffer de char[] qui a comme taille, celle du paquet (un buffer de Char[] et pas de byte[] à cause du InputStreamReader).

    Le problème qui reste maintenant c'est au niveau du buffer. Je lui crée un buffer de la taille de la réponse mais celui-ci ne lit pas tout... il s'arrête en plein milieu d'une ligne donc je ne peux pas récupérer tout d'un coup.

    Est-ce que quelqu'un voit ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Kitiz Voir le message
    Maintenant ce que je dois faire c'est stocker ce flux dans un fichier.
    En fait, c'est la réponse d'une requête HTTP avec un transfer-encoding: chunked.
    Dans ce cas n'utilise pas un Reader, utilise InputStream directement. Les chunks sont transmis en indiquant une taille en octets, et il est primordial de respecter cette taille en octets. Normalement ça ne peut se faire qu'en lisant des octets et non des caractères.

    Ça demande un peu de travail pour parser les headers de chunks, mais c'est pas la mer à boire non plus.

    Ce que je fais c'est que je lis mon flux, je récupère la taille du paquet que je convertis. Et là, je crée un buffer de char[] qui a comme taille, celle du paquet (un buffer de Char[] et pas de byte[] à cause du InputStreamReader).
    Oublie. Il y a forcément de nombreux cas où ça ne marche pas. Fais avec InputStream. Quand tu as un paquet à lire, lit des octets jusqu'à détecter une fin de ligne, puis transforme les octets lus dans cette ligne en une String composée des caractères ASCII, et parse la taille en octet. Ensuite, lis autant d'octets.

    À noter que HttpClient et son ChunkedInputStream font très bien ça tous seuls.

    Le problème qui reste maintenant c'est au niveau du buffer. Je lui crée un buffer de la taille de la réponse mais celui-ci ne lit pas tout...
    C'est normal. Déjà il ne faut pas lire des caractères quand on veut des octets. Ensuite, read() ne lit pas exactement la taille du buffer, il lit au plus la taille du buffer. Le nombre d'octets lus est la valeur renvoyée par read(). Il faut donc appeler read() (avec l'offset et le nombre max adaptés) jusqu'à ce que le buffer soit rempli.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif Avatar de Torg666
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 230
    Points : 254
    Points
    254
    Par défaut
    un read(buffer,debut,fin) te renvoie le nombre d'octet qu'il à effecivement reçu.
    Donc il te suffit de n'ecrire que les octet reçus.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int nbOctet;
    BufferedInputStream bis;
    byte buffer=new byte[256];// à toi de voir la taille que tu as besoin 
    Socket monSocket;
    //... du code...
     
    bis=new BufferedInputStream(monSocket.getInputStream());
    while((nbOctet=bis.read(buffer,0,buffer.length))!=-1){
     for(int cpt=0;cpt<nbOctet;cpt++){
      System.out.print(buffer[cpt]);
     }
    }
    Ce code te permet d'afficher dans la console ce que tu lis sur le socket.
    bon il manque les bloc try/catch mais je vais qd même te laisser chercher un peu.
    Le fait que ca arrive pas forcement d'un coup est normal... mais je saurai pas te l'expliquer.
    La javaDoc est mon amie, elle est la tienne aussi!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    @thelvin

    en fait, je crois que je n'ai pas le choix d'utiliser un IntputStreamReader pour des soucis d'encodage d'accents et autre.
    Du coup, si j'utilises un InputStreamReader je dois utiliser un FileWriter pour mon fichier dans lequel je dois stocker le contenu du paquet.

    comment faire...

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je suis à peu près sûr que ça n'a aucun rapport.

    Si tout ce que tu as à faire est d'enregistrer la réponse dans un fichier, les accents et les caractères ne sont pas ton problème. Ça pourrait aussi bien être un MP3 ou un divX. Tu n'as besoin de voir que les octets. Tu *dois* ne voir que les octets. Si ton flux est en utf-8, un même caractère accentué pourrait très bien être coupé entre deux chunks.

    (Bon, sauf si tu as besoin de faire une conversion de charset à la volée, auquel cas c'est plus compliqué, oui, il faut d'abord récupérer les octets, puis les encapsuler dans un InputStreamReader, et enregistrer le tout dans un FileReader. Si c'est le cas, ça devient un joli cas d'école.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    bon d'accord pour l'encodage. Là, j'ai un autre souci parce que je n'obtiens toujours pas le bon résultat. Ce que je fais :

    - je boucle tant que ma ligne est différente de "0" (le fameux 0 de fin de transfer-encoding: chunked)
    - je lis la première ligne ce qui me permet de récupérer la taille du paquet
    - je crée un buffer de byte qui a pour taille la taille que je viens de définir juste au-dessus
    -je boucle sur : je lis mon input avec la méthode octet_lu = read(buffer, off, len); tant que octet_lu != -1 (fin du buffer), j'écris ce qui est lu dans mon fichier (FileOutputStream) myFile.write(buffer, 0, octet_lu);
    - je fais un flush sur mon fichier.

    j'arrive à obtenir mon fichier le problème c'est que je stocke aussi le 0 et le \r\n

    comment faire ?

    P.S : pour une image qui se trouve dans un script php, ça fonctionne cette méthode là mais pourquoi sur ma page html ça m'écrit le 0 et le reste ?

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je dirais repense ta boucle pour ne pas inclure le 0 et le \r\n. Je ne sais pas trop comment tu t'es débrouillée pour l'inclure.

    Je recommande à nouveau de ne pas s'embêter à programmer ça et de juste réutiliser le ChunkedInputStream de commons-httpClient :

    http://hc.apache.org/httpclient-3.x/...putStream.html
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    ok merci

Discussions similaires

  1. Traiter les flux de sortie
    Par soulhouf dans le forum Linux
    Réponses: 9
    Dernier message: 20/04/2006, 17h48
  2. [Java 1.5] Process : afficher le flux de sortie
    Par Zapan dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 11/01/2006, 10h34
  3. [MySQL] Flux de sortie : ob_start + header
    Par ToxiZz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/12/2005, 23h56
  4. Awk - changer le flux de sortie
    Par Longrais dans le forum Linux
    Réponses: 1
    Dernier message: 16/08/2005, 17h11
  5. [Réseau] plusieurs flux a partir d'une socket
    Par al85 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/01/2005, 18h11

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