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

Concurrence et multi-thread Java Discussion :

[ByteBuffer] Thread safe


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut [ByteBuffer] Thread safe
    Bonjour,

    Dans un développement d'un proxy (qui n'est pas de moi), une personne utilise un ByteBuffer pour transférer les données entre les différentes sockets.
    Je souhaiterais connaitre la taille des données transférées entre les sockets. Cependant je n'arrive pas à comprendre comment je peux récupérer cette taille en octets.

    Quelqu'un aurait-il une idée ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    As-tu cherché dans la Javadoc ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    Je ne comprends pas trop ton problème, si tu connais la personne qui utilise le byteBuffer, ou que tu a vu le code, pourquoi ne pas lui demander de te donner la capacity de celui-ci (ou de lire le code) ?

    Sinon, si tu n'a accès qu'à l'autre coté du socket, je ne vois pas de moyen dans la mesure où un socket n'a aucune connaissance de la classe ByteBuffer, ni même du langage java, à moins que le protocile d'échange prévoie un octet ou un marqueur de fin de bloc qui soit placé tous les X octets, en supposant que ce nombre soit celui de la capacity du buffer, ce qui n'est pas sûr.

    Cordialement




    Cordialement

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    On s'en tape de la capacity, ce n'est qu'un buffer. Il vaut mieux jeter un œil du côté des appels à ReadableByteChannel.read() ou WritableByteChannel.write(), et compter le nombre d'octets vraiment lus ou écrits.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    En effet, mea culpa, j'ai mal formulé ma question. J'étais plus dans le doute de savoir l'information la plus fiable pour avoir le nombre de bytes échangés.

    J'ai procédé comme suit :
    Le code actuel appelle une fonction transfer qui est appelé à chaque fois que mon buffer est plein. Dans cette fonction, je récupère les bytes lus dans la socket :
    int numRead = socket.read(MyByteBuffer);

    J'utilise cette valeur que j'incrémente pour connaitre le nombre de bytes total récupérés dans ma socket.

    J'ai quand même des valeurs assez étranges comme une page web dont le Header indique Content-length : 880 et j'ai 45321 bytes récupérés. Cela est peut être du à un mauvais codage, je vais revérifier mon code.

    Merci pour votre aide.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    Petit aparté pour thelvin, on ne dit pas "on s'en tape de..' mais "je pense que la question posée ne concerne pas la capacity ..." C'est plus poli et ça fait preuve d'un peu plus de respect vis à vis des gens (en l’occurrence, moi) qui tentent de rendre service et qui, comme tout un chacun, peuvent comprendre de travers une question.

    Ensuite, pour FinalSpirit, j'ai effectivement été induit en erreur par le titre de ton message. Par contre, je me demande quelle est la classe de cet objet que tu nommes "socket" et qui possède une méthode read(ByteBuffer) ?

    Est-ce une classe d'encapsulation de la classe Socket faite par toi ?
    Si oui, peut-être le code nous aiderait à comprendre la raison de ces tailles apparemment erronées

    Cordialement

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Oui en effet, je n'ai pas précisé, c'est un SocketChannel d'où la méthode read. Les java.nio.channels.Selector et java.nio.channels.SocketChannel sont utilisé pour gérer les différentes demandes des applications.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    Dans ce cas, ça doit être vrai, tu peut le vérifier en conservant la valeur de MyByteBuffer.remaining() et en la comparant avec ce même appel au retour du read, ça devrait être égal au retour de la fonction read.

    Tu as parlé de pages web, il n'y aurait pas des images ou autres gros objets genre CDATA qui transitent sur cd même canal ?

    Cordialement

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Il y a en effet des images et autres gros objets qui peuvent transiter. Pour le moment je n'ai pas vu de soucis. Le proxy est assez simple :
    - Une socket est ouverte lors de l'appel depuis le navigateur
    - Récupération de la requête et création du deuxième socket pour envoyer la requête au serveur web.
    - Attente de la réponse du serveur web puis réception des données
    - Transfert du bytebuffer en sortie de la socket vers la socket ouverte par le navigateur.

    Mon soucis est que je log les HEADER. Donc je lis le contenu du ByteBuffer mais il est souvent tronqué.

    Par exemple au lieu d'avoir :
    Content-length : 880
    Content-type : image/gif

    je peux avoir :
    Content-length : 880
    mage/gis

    Je ne vois pas d'où provenir ce décalage dans la lecture... En modifiant la valeur du allocate de 128 à 256 ça décale mais il est toujours présent...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Ca doit venir de mon code. Je fais un clone du ByteBuffer pour que le traitement soit fait dans un Thread mais à première vue le clone n'est pas ressemblant à 100%

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Je ne comprend rien au buffer.
    J'ai une méthode où je parcours mon buffer pour le convertir en String pour récupérer le HEADER de l'objet transmis.
    Si je place cette méthode dans un Thread, la lecture est tronquée par endroit alors que cette dernière fonctionne très bien de manière synchrone. J'ai vu que le ByteBuffer n'est pas Thread safe mais je ne vois pas comment le rendre Thread safe...

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Revoyez votre code.

    Si vous avez besoin d'intercepter ce qui passe entre les deux socket via byebuffer, alors vous n'avez plus besoin de bytebuffer. Le principe du bytebuffer c'est justement d'essayer d'éviter le transit des données par la mémoire si c'est possible. Utilisez des socket classiques, elles sont plus facile à manipuler coté contenu.


    Question subsidiaire: pourquoi avoir besoin de faire le calcul dans un thread à part?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Par défaut
    Je souhaite que l'utilisateur obtienne la réponse à sa requête dans les meilleurs délais donc de placer les calculs de données dans un thread à part pour laisser le proxy terminer son travail.

    Merci pour l'info. Je vais voir pour passer par un autre buffer. Dans ce cas, lequel est conseillé ? InputStream et OutputStream ?

    D'ailleurs je rajoute une petite question : peut on renvoyer le résultat dans une autre socket en même temps et cette socket est géré par une autre classe du programme ?

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ca dépend ce que t'entends par gérer. Le thread à part est inutile et ralentissant. Tu pompe les données dont tu as besoin au passage, dans le thread qui fait le transfert et tu fait tes calculs après. Avec un thread à part tu va pas plus vite puisque, de toutes façons, le thread d'envoi et le thread de calcul sont synchrones.

  15. #15
    Membre éclairé
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 28
    Par défaut
    pour completer la reponse de tchize_ : et en plus d'être synchrones avec une thread en plus tu te rajoutes de permutations de contexte qui sont inutiles.

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

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