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 :

[NIO] données 'texte' vers SocketChannel: s'accumule dans le buffer


Sujet :

Entrée/Sortie Java

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut [NIO] données 'texte' vers SocketChannel: s'accumule dans le buffer
    Bonjour,

    Je vais rester simple sur ce soucis... je simplifie mon problème.

    Le serveur envoie des requêtes de manière très soutenue au client qui les analyse.
    exemple de requête:
    1|Banane
    2|Fromage


    En fonction de la requête, le client réalise une action différente.

    Cas sans erreur, le client reçoit:
    01|Fromage
    01|Saucisson
    02|Banane
    01|Raison


    De temps en temps, en cas d'erreur.
    01|Fromage
    01|Saucisson02|Banane <<<<---- error
    01|Raison

    On observe ici une concatènation des deux requêtes lorsque le client lit dans son

    Mon hypothèse: lorsque le client ne peut lire son message et qu'un deuxième arrive très vite derrière, alors il y a 2 messages dans le Buffer du socketChannel du client, du coup on arrive à cet effet

    Algo pour écrire (serveur):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(requestCode.compareTo("1") == 0){
    	// envoie la requête						
    	buffer = ByteBuffer.wrap(new String("1|Banane").getBytes());
            client.write(buffer);// on envoie le message au client (on écrit dans le buffer du socket)
    (ps: private ByteBuffer buffer; // buffer défini par défaut, on l'utilise pour écrire/lire les flux
    this.buffer = ByteBuffer.allocateDirect(1024);
    SocketChannel client = (SocketChannel) k.channel(); // socketChannel client, celui qui reçoit le message (l'interface qui écoute))

    Algo pour écouter (client):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if((client.read(buffer)) > 0 ) {
    buffer.flip();
    //data est un tableau de n bytes ou n représente le nombre d'octets a lire dans le buffer
    byte[] data = new byte[buffer.remaining()];
    // on lit le contenu du buffer et on le stocke d'un coup dans data
    buffer.get(data);
    // on affiche le contenu de data (et donc du buffer)
    System.out.println(new String(data));  // c'est ici qui donne 01|Saucisson02|Banane <<<<---- error
    Est-ce que j'ai bien identifié ce probleme?
    Avez-vous une solution pour contrer ce fait?


    Merci de tout coeur !

    Cécilia!

  2. #2
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Tu as compris,

    Il ne s'agit ni plus ni moins qu'un mécanisme de producteur/consommateur.
    lorsque tu lit ton buffer en reception, "nio" te donneras toutes les données qu'il possede peut importe que ces données aient été émises par differents "write" par l'émetteur.

    C'est à toi de savoir differencier tes differents messages "logiques".

    Tu peu même avoir le cas où tu ne lit qu'une partie d'un de tes messages logiques "exemple: 01|Rai" et il te faudra attendre de recevoir de nouvelles données afin de completer ce message logique fragmenté.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  3. #3
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Une des façons de contrer ce problème est par exemple d'envoyer en entete de message le nombre d'octets lui correspondant.
    Ta couche réseau peut alors separer tes differents messages et même savoir lorsqu'ils sont complet.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    merci divxdede,

    Merci de confirmer mon avis sur ce problème.

    Je ne suis pas sur d'avoir compris ton message
    Une des façons de contrer ce problème est par exemple d'envoyer en entete de message le nombre d'octets lui correspondant.
    Ta couche réseau peut alors separer tes differents messages et même savoir lorsqu'ils sont complet.
    C'est un paramêtre java à indiquer? ou alors c'est un modification de mon protocole.

    Par exemple, il suffirait d'ajouter un caractère de fin de requête.

    (ou $: représente la fin de la requête)

    de cette sorte, si je recois une requête de type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01|Banane$02|Raisin$01|Kiwi
    Je peux donc analyser:
    01|Banane
    puis
    02|Raisin
    MAIS pas encore 01|Kiwi (pas de caractère $ de fin de requête)

    Est-ce bien ce à quoi tu pensais?

    Merci bien,
    Bien cordialement

    Cécilia

  5. #5
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Oui cette solution convient (à partir du moment ou $ ne peut etre utilisé pour autre chose que le séparateur de message).
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 106
    Points : 78
    Points
    78
    Par défaut
    Oui cette solution convient (à partir du moment ou $ ne peut etre utilisé pour autre chose que le séparateur de message).
    Bien entendu. Merci pour votre réponse, très gentil de votre part.
    Je met le topic en résolu.

    Merci et bonne journée.

    Bien cordialement, Cécilia.

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

Discussions similaires

  1. Ecrire du texte sous forme de pixels dans un buffer
    Par kikekoikan dans le forum Windows
    Réponses: 12
    Dernier message: 22/12/2008, 10h22
  2. Réponses: 2
    Dernier message: 14/05/2007, 09h40
  3. Données fichier texte vers BDD
    Par dr_octopus74 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/02/2007, 15h54
  4. transfert des données d'un fichier text vers un fichier excel sous VB
    Par insane_80 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 24/09/2006, 13h32
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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