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 :

[Réseau] Programmation socket


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    raj
    raj est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut [Réseau] Programmation socket
    Bonjour , ce sont mes premiers pas avec les sockets en JAVA .
    Je programme une application qui doit se connecter à un serveur
    FTP .
    Apres création de la socket cliente , je recois les données :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( (c=donnee.read()) != -1 ) System.out.print((char)c);
    Mais la le problème c'est que ca bloque .

    Est-ce que j'ai oublié de faire quelque-chose ?
    [ Modéré par vedaer ]
    -> Ajout du tag dans le titre
    -> Ajout des balises code
    [ Merci de respecter les Règles du Forum ]

  2. #2
    Membre éprouvé Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Par défaut
    Ce n'est pas un pb de socket mais un pb de choix de méthode de lecture.
    la méthode read() est bloquante c'est à dire qu'elle ne retourne une valeur que lorsqu'un caractère est présent ou que la fin de flux (EOF) est détectée. Dans le cadre d'une communication par socket, la fin de flux arrive uniquement si l'une des deux parties ferme la connexion.
    Donc le code que tu as écrit bloque une fois les données reçues lues.

    Il existe une version non-bloquante de la méthode read :
    public int read(byte[] b, int off, int len)
    Cette méthode essaie de lire "len" octets dans le flux et renvoie le nombre d'octets effectivement lus (zero si aucun octet n'est disponible).

    Tu peux l'utiliser pour lire les données disponibles de façon non bloquante et les analyser au fur et à mesure (attention tes données peuvent arriver par petits paquets).

  3. #3
    raj
    raj est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut Programmation socket avec JAVA
    Une question :
    Est-ce que la méthode readLine de BufferedReader est aussi bloquante?

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Sans vouloir faire le facheux, a mon avis la method read(byte[], off, len) est aussi bloquante ..

    si tu veux placer ta socket en mode non bloquant il faut passer par un Channel a partir de la 1.4.. pour les jdk precedents, la lecture est toujours bloquante sur une socket ..

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  5. #5
    raj
    raj est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut Programmation socket avec JAVA
    Je rajoute aussi que la méthode read n'est pas bloquante

    Parce que le code suivant :

    while( (c= donnee.read()) != -1) {
    System.out.print((char)c);
    }


    Ce code fonctionne et affiche dans la console :

    220 (vsFTPd 1.1.3)

    Le problème c'est que le programme reste dans la boucle et n'en sort
    C'est à dire que la condition c != -1 ne se passe pas .
    Voilà plus d'explication de mon problème .
    J'ai essayé avec BufferedReader et readLine mais j'ai le mème problème

    Merci pour une aide je commence à perdre patience

  6. #6
    raj
    raj est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut Programmation socket avec JAVA
    Je m'excuse pour la sottise que j'ai pu dire .
    La méthode read est bloquante effectivement s'il n'y a plus
    de caractère .

    FTP renvoie-il un caractère spécial pour que l'on puisse
    reconnaitre la fin d'une réponse?

  7. #7
    raj
    raj est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 112
    Par défaut Programmation socket avec JAVA
    En fait c'est un bête problème de \n
    Maintenant ca marche correctement .
    Merci comme même .
    Ouf

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

Discussions similaires

  1. [Jeu] - Programmation réseau <sérialisation,sockets,threads>
    Par ixabro dans le forum Développement
    Réponses: 5
    Dernier message: 02/02/2012, 22h18
  2. Programmation sockets : limiter la bande passante
    Par e-t172 dans le forum Développement
    Réponses: 2
    Dernier message: 14/12/2005, 15h22
  3. Réponses: 2
    Dernier message: 31/05/2005, 09h50
  4. [Réseau] Problème socket
    Par neenee dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 18/01/2005, 15h26

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