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 :

transfert d'objet, problème de Buffer


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut transfert d'objet, problème de Buffer
    Pour une appli que je développe actuellement mais aussi pour un cours que je dois donner en fin d'année, j'ai besoin d'utiliser des sockets non bloquantes pour transférer des objets sérialisables.

    je suis en train de faire des tests et je n'arrive pas à transmettre des données. J'en envoie mais je ne reçois rien.

    J'envoie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Socket socket = sockChan.socket();
    System.out.println(socket);
    OutputStream os = socket.getOutputStream();
    BufferedOutputStream baos = new BufferedOutputStream(os);
    System.out.println("ClientSocket, sendMessage : " + request);
    byte[] T = getBytes(request);
    for(int i = 0; i < T.length ; i++){
     
    	System.out.println(i +" : " + T[i]);
    }
    baos.write(T);
    baos.flush();
    voici la trace correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ClientSocket, sendMessage : q
    0 : -84
    1 : -19
    2 : 0
    3 : 5
    4 : 116
    5 : 0 
    6 : 1
    7 : 113
    quand au serveur, lui a

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    try {
    	ssChanel = ServerSocketChannel.open();
    	System.out.println(ssChanel.isRegistered());
    	serverSocket = ssChanel.socket();
    	Selector selector = Selector.open();
    	serverSocket.bind(new InetSocketAddress(5000));
    	System.out.println(ssChanel.isOpen());
    	System.out.println(ssChanel + " : Port ON");
    	ssChanel.configureBlocking (false);
    	ssChanel.register (selector, SelectionKey.OP_ACCEPT);
     
    	int rep = 0;
     
    	while(true){
     
    		System.out.println ("Attente");
    		int n = selector.select();
    		System.out.println ("selector.select() = " + n);
    		if (n == 0) 
    			continue;
    		Iterator it = selector.selectedKeys().iterator();
    		while (it.hasNext()) {
    			SelectionKey key = (SelectionKey) it.next();
    			System.out.println ("SelectionKey = "+key);
    			System.out.println ("Acceptable()" + key.isAcceptable()) ;
    			System.out.println ("Valid()" + key.isValid());
    			System.out.println ("Readable()" + key.isReadable()) ;
    			System.out.println ("Writable()" + key.isWritable()) ;
    			if (key.isAcceptable()) {
    				System.out.println ("***Key Acceptable");
    				ServerSocketChannel server = (ServerSocketChannel)key.channel();
    				SocketChannel channel = server.accept();
    				System.out.println ("-- SocketChannel = "+channel);
    				channel.configureBlocking (false);
    				channel.register (selector, SelectionKey.OP_READ);
    			}
    			ByteBuffer buffer = ByteBuffer.allocateDirect (10240);
    			if (key.isReadable()) {
    				System.out.println ("***Key readable");
    				SocketChannel socketChannel = (SocketChannel) key.channel();
    				System.out.println (socketChannel);
    				Socket socket = socketChannel.socket();
    				System.out.println (socket);
    				buffer.clear();int count;
    				count = socketChannel.read (buffer);
    				System.out.println ("read count = "+count+ " contenu :");
    				byte[] T = new byte[count];
    				buffer.get(T);
     
    				for(int i = 0; i < T.length ; i++){
     
    					System.out.println(i +" : " + T[i]);
    				}
    				buffer.clear();    
     
     
    			}
     
    		}
    	}
    }
    catch(Exception e){
     
    	e.printStackTrace();
    }
    et la trace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    read count = 8 contenu :
    0 : 0
    1 : 0
    2 : 0
    3 : 0
    4 : 0
    5 : 0
    6 : 0
    7 : 0
    A noter que le message peut changer, il trouve toujours le même nombre d'octets à l'entrée et à la sortie mais j'obtient toujours que des 0 à l'arrivée.

    Qui peut m'aider ?

  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
    A l'époque ou j'avais testé NIO, si je me souviens bien, étant donné que c'est non bloquant, il y a un mécanisme proche des événements pour recevoir les données (un read ne peut renvoyer des données que si elles sont dans le buffer. Et c'est un événement qui nous avertit de l'entrée de données)

    Je pourrais essayer de retrouver mes anciens codes si ça te dit...


  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse. Je pense que mon premier message pouvait laisser penser que le code présenté n'était pas qu'un extrait et l'ai donc modifié en mettant tout le code "serveur". Je pense que ce que je fais (select etc.) c'est ce dont tu me parlais lorsque tu évoquais "un mécanisme proche des événements" ?

    Pour mon problème, je pense que les données devraient être dans le buffer puisque le count indique une bonne taille, pourtant tous les octets sont à 0.

  4. #4
    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
    Oui, c'est bien la gestion du sélecteur qui fournit ce que j'ai comparé au événements.

    A première vue, je dirais que après un read du buffer, je ne ferais pas un get sur un tableau de byte nouvellement créé.

    A la place, il y a une méthode (flip je crois) de ByteBuffer pour passer en mode de lecture (ça permet de parcourir le contenu du buffer)

    Un truc du genre je pense:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int count = socketChannel.read (buffer);
    System.out.println ("read count = "+count+ " contenu :");
    buffer.flip();
     
    while(buffer.hasRemaining()) {
        System.out.println(buffer.get());
    }
    A peu de chose près

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    c'est super, je reçois tout maintenant merci !

    et je pense au résolu

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

Discussions similaires

  1. [Applet]Transfert d'objet serialisé applet/servlet
    Par fanou28 dans le forum Applets
    Réponses: 7
    Dernier message: 22/02/2010, 21h45
  2. [N-Tier] Problème transfert d'objets entre les couches
    Par Hajer.B dans le forum Autres
    Réponses: 1
    Dernier message: 30/08/2008, 10h48
  3. SQL + problème de buffer-oracle version 8.1.7
    Par new_wave dans le forum Oracle
    Réponses: 4
    Dernier message: 21/11/2005, 14h51
  4. Réponses: 3
    Dernier message: 08/09/2005, 10h45
  5. [ObjectOutputStream] Pb de transfert d'objets
    Par TylerKnoxx dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 02/11/2004, 13h53

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