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] Transfert non bloquants d'objets par SocketChannel


Sujet :

Entrée/Sortie Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [nio] Transfert non bloquants d'objets par SocketChannel
    Bonsoir tout le monde,

    je suis à la recherche d'un bout de code qui montre comment transférer des objets en utilisant les NIO (E/S hautes perfs.)

    J'arrive à envoyer des tableaux de bytes et même des strings, en faisant comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((SocketChannel)maSelectionKey.channel()).write(ByteBuffer.wrap("toto".getBytes()));
    mais je n'ai rien trouvé pour des objets quelconques. quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new ObjectOutputStream(aSocketChannel.socket().getOutputStream()).writeObject("Test")
    je me prend une "java.nio.channels.IllegalBlockingModeException", ce qui est normal dès lors que le SocketChannel est en mode non-bloquant...

    Quelqu'un aurait un ptit exemple sous la main ? Ou bien est-ce seulement possible ?


    Merci
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    alors j'ai trouvé la parade: je construis un ByteArrayOutputStream pour stocker les données de l'objet sérialisé, puis je le transfert en un bloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    ServerSocketChannel server = (ServerSocketChannel) selectionKey.channel();
     
    SocketChannel client = server.accept();
    client.configureBlocking(false);
    client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(toSend);
     
    client.write(ByteBuffer.wrap(baos.toByteArray()));
    et de l'autre côté je désérialise de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    SocketChannel sc = SocketChannel.open(new 
        		  InetSocketAddress(InetAddress.getLocalHost(), 80));
    ByteBuffer bb = ByteBuffer.allocate(1024);
    sc.read(bb);
    System.out.println("building object...");
     
    ByteArrayInputStream bais = new ByteArrayInputStream(bb.array());
    ObjectInputStream iis = new ObjectInputStream(bais);
    Object o = iis.readObject();
    System.out.println("object build ! toString: "+o.toString());
    Ce code fonctionne pas trop mal, mais le problème maintenant vient du fait que je ne sais pas exactement combien de bytes sont occupé par mon objet, ce qui fait que s'il est plus grand qu'un Ko, il ne pourra pas tenir dans mon ByteBuffer et je ne pourrai pas le reconstruire. ou pire, s'il y a deux objets qui sont envoyés successivement, je risque de ne pas pouvoir les distinguer.....


    Une idée ?

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/12/2011, 10h47
  2. Passer un objet par valeur et non référence
    Par Pynouz dans le forum C#
    Réponses: 2
    Dernier message: 14/01/2011, 09h42
  3. Lecture non bloquante sur plusieurs Sockets avec nio
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 19/04/2007, 16h14
  4. Réponses: 3
    Dernier message: 20/10/2006, 19h50
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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