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 :

[Java][Socket] Pas de lecture de flux


Sujet :

Entrée/Sortie Java

  1. #1
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut [Java][Socket] Pas de lecture de flux
    Salut,

    J'ai actuellement trois classes (mon but est de réaliser un serveur et un client FTP simple) Serveur, Client et FtpRequest.

    Le plus simple est que je mette le code et que je vous dise où je ne comprends pas :

    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
     
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.File;
     
    public class Serveur
    {
        ServerSocket s;
        FtpRequest ftp;
     
        Serveur(String rep)
        {
        	try
        	{
     
    			s=new ServerSocket(1023);
    			System.out.println("Attente de la connexion sur le port 1023");
    			Socket client=s.accept();
    			ftp=new FtpRequest(client); // le FtpRequest est construit des que la connexion est etablie
    			System.out.println("Connexion établie avec le client");
     
    			ftp.readClientCommand();
     
     
    		}catch(Exception e)
    		{
    			System.out.println(e);
    		}
        }
     
        public static void main(String[] s)
        {
    		Serveur serveur=new Serveur("/usr/");
        }            
    }
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    import java.net.Socket;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
     
    public class FtpRequest
    {
        Socket client;
        static String USER="test";
        static String PASS="test";
     
        BufferedReader br=null;
     
        String commandAddemted;
        boolean loggedIn;
     
        FtpRequest(Socket client)
    	{
    	    this.client=client;
     
    	    try
    	    {
    	    	this.br=new BufferedReader(new InputStreamReader(client.getInputStream()));
    	    	System.out.println("reader initialise");
    	 	}
    	 	catch(Exception e)
    	 	{
    	 		System.out.println(e);
    	 	}
    	}
     
        public void readClientCommand()
        {
        	System.out.println("Attente d'une commande du client");
        	try
        	{
        		String s=br.readLine();
        		System.out.println(s);
        		processRequest(s);
        	}catch(Exception e)
        	{
        		System.out.println(e);
        	}
    	}
     
     
        public void processRequest(String commande)
    	{
    		if(commande==null)
    			System.exit(0);
    		if(commande.startsWith("help") || commande.startsWith("HELP") || commande.startsWith("?"))
    		{
    			System.out.println("Commandes disponibles pour le FTP : ");
    			System.out.println("USER $usr : Permet de se logger");
    			System.out.println("PASS $pass: Permet de définir le password");
    			System.out.println("RETR $file: Permet de transférer un fichier du serveur au client");
    			System.out.println("STOR $file: Permet de reprendre le transfert d'un fichier du serveur au client");
    			System.out.println("LIST      : Permet de lister les fichiers du répertoire courant");
    			System.out.println("QUIT      : Permet de quitter le serveur");
    		}
    	    else if(commande.startsWith("USER"));
     
    		else if(commande.startsWith("PASS"));
     
    		    else if(commande.startsWith("RETR"));
     
    			else if(commande.startsWith("STOR"));
     
    			    else if(commande.startsWith("LIST"));
     
    				else if(commande.startsWith("QUIT"));
     
    				    else
    						System.out.println("Erreur de commande");
     
    	}
     
        public void processUSER(String commande)
    	{
    	}
    }
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    import java.net.Socket;
    import java.net.InetAddress;
     
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
     
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
     
    public class Client // la classe client qui gere le client FTP
    {
        Socket s; // le socket de connexion
        BufferedReader br; // le BufferedReader qui va nous permettre de lire le flux clavier
     
        BufferedWriter bw;
     
        Client()
        {
    		br=new BufferedReader(new InputStreamReader(System.in)); // on initialise la lecture du flux clavier
     
    		String adresse=null;
    		System.out.println("Entrez l'adresse a laquelle vous voulez vous connecter : ");
    		try
    	    {
    			adresse=br.readLine();
    	    }catch(Exception e)
    		{
    			System.out.println(e);
    		   	e.printStackTrace();
    		}
     
    		System.out.println("Entrez le port : ");
     
    		Integer port=null;
     
    		while(port == null)
    	    {
    			try
    		    {
    				port=new Integer(Integer.parseInt(br.readLine()));
    		    }catch(Exception e)
    			{
    			    System.out.println("Veuillez entrer un nombre");
    			}
    	    }
    		initialiser (adresse,port.intValue());
        }
     
     
        private void initialiser(String host,int port)
        {
    	try
    	    {
    			s=new Socket(InetAddress.getByName(host),port); // on initialise le socket
    			bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
     
    	    }catch(Exception e)
    		{
    		    System.out.println(e);
    		    e.printStackTrace();
    		}
        }
     
     
        public void lancement()
        {
    		System.out.println("Bienvenue sur le (basique) client FTP");
    		System.out.println("Pour l'aide, tapez HELP , help ou ?");
    		for(;;)
    		{
    			try
    			{
    				String temp;
    				System.out.println(temp=br.readLine());
    				bw.write(temp+"\n");
    			}catch(Exception e)
    			{
    				System.out.println(e);
    			}
    		}
        }
     
     
        public static void main(String [] args)
        {
    		Client c=new Client();
    		c.lancement();
        }
    }
    Lorsque le client se connecte au serveur, la méthode accept() renvoie le socket du client au serveur. Je crée à partir de celui-ci un BufferedReader pour récupérer les commandes envoyées par le client.
    Le client lui se connecte à l'adresse et au port que je lui donne (ici localhost et 1023). Ensuite, je crée un BufferedWriter à partir du Socket du client. Lorsque le client envoie une commande, elle entre bien dans le writer (et ca j'en suis quasiment sûr). Le probleme est que le serveur semble rester bloqué sur le br.readLine() (bloquant), donc il ne recoit rien du Socket renvoyé par la fonction accept().

    Où que c'est que ca bug ?

    Merci

    Fred

    edit : désolé pour m'être trompé de forum, mais j'avais pas vu le sous forum de sous forum

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Dans ton exemeple, si ton client parle au serveur, le serveur va ecouter, puis eventuellement répondre, pour ensuite réécouter, etc ...

    En faite, il faut que le client parle, puis le serveur puis le client, etc ... ( ou inversement ).

    L'idée, c'est que ton appli reste bien bloqué sur le readline, et ne passe pas au reste.

    Pour eviter cela, tu peut creer un thread a ton client qui va ecouter en boucle le socket ( pour le serveur tout comme pour le client ).

  3. #3
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ah non mais attention, j'ai oublié de préciser, je lance la classe Client et la classe Serveur indépendamment, ce sont donc deux programmes différents !

    Désolé

    Fred

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu utilises des BufferedReader/BufferedWriter qui effectues des lectures/écritures groupées. Donc les données que tu écris dans ton buffer ne sont pas réellement envoyé sur la socket. Elles ne le seront que lorsque tu aura remplit le buffer interne (de 8096 char il me semble).

    Je pense que pour du dialogue comme cela il faut éviter les BufferedReader/Writer et forcer le flush() après chaque écriture pour être sûr que les données soient bien envoyées...

    a++

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    J'avais bien compris ca.... Et heururexement d'aillieur sinon ca serait pas un client/serveur...


    Ca ne change rien a ma reponse

  6. #6
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Tu utilises des BufferedReader/BufferedWriter qui effectues des lectures/écritures groupées. Donc les données que tu écris dans ton buffer ne sont pas réellement envoyé sur la socket. Elles ne le seront que lorsque tu aura remplit le buffer interne (de 8096 char il me semble).

    Je pense que pour du dialogue comme cela il faut éviter les BufferedReader/Writer et forcer le flush() après chaque écriture pour être sûr que les données soient bien envoyées...

    a++
    Mais le flush, je l'ai forcé en faisant un "\n" à la fin de ma string non ?

    J'avais bien compris ca.... Et heururexement d'aillieur sinon ca serait pas un client/serveur...


    Ca ne change rien a ma reponse
    Oui d'accord, mais le truc est que je bloque bien le serveur pendant que le client envoie sa commande (bloqué par le readLine() ). Pour l'instant, faire une instruction du client vers le serveur est mon but.

    Merci

    Fred

  7. #7
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Alors en fait c'est résolu, il fallait bien faire un flush mais aussi faire un newLine() .

    Merci à vous deux

    Fred

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina
    Mais le flush, je l'ai forcé en faisant un "\n" à la fin de ma string non ?
    Non !
    Ceci n'est vrai que pour le flux spécial System.out (et encore il me semble que cela dépend du système d'exploitation et de la console).

    a++

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

Discussions similaires

  1. Lecture / Ecriture Flux (Fichier, socket, etc.)
    Par LittleT dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 26/01/2013, 11h05
  2. Socket et lecture du flux
    Par Looney dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/07/2009, 10h09
  3. [Socket] Problème de lecture flux danss communication
    Par tooney dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 06/06/2005, 11h08
  4. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30
  5. [Socket] Attente de lecture
    Par al85 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/01/2005, 11h16

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