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) { } }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.
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(); } }
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
Partager