Newsgroup: it.comp.java
Titolo: Client FTP : HELP !!!

Ciao a tutti,
devo implementare un Client FTP.
Ho trovato un esempio si server FTP al sito 
http://www.freecode.com/
In una parte del codice trovato ho trovato quanto segue (come il server
FTP risponde ad un comando ls ):
ServerSocket s = new ServerSocket(21); 
...
Socket incoming = s.accept(); 
.............
BufferedReader in   = new BufferedReader(new
InputStreamReader(incoming.getInputStream())); 
PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 
............
.....
if(str.startsWith("LIST")) { 
     try 
     { 
	out.println("150 ASCII data"); 
        Socket t = new Socket(host,ip); 
        PrintWriter out2  = new PrintWriter(t.getOutputStream(),true); 
        File f = new File(dir); 
        String[] a = new String[10]; 
        String d,e; 
        int i1,j1; 
        a = f.list(); 
        j1 = a.length; 
        d = f.getName(); 
        for(i1=0;i1<j1;i1++) 
        { if( a[i1].indexOf(".") == -1) // DIR 
                      { di = "d ";} 
           else 
              { di = "- ";} 
           out2.println(di+a[i1]); 
        } 
        t.close(); 
        out.println("226 transfer complete"); 
        } 
      catch(IOException e){} 
    } 
} 
Non riesco a capire perche' viene creato un nuovo oggetto di tipo Socket
ed un nuovo oggetto PrintWriter per poter leggere i file che sono sotto
la dir, visto che esiste gia' un oggetto PrintWriter.
Volendo quindi mandare dal lato client il comando LIST cosa dovrei fare
visto che facendo quanto segue :
  try {
          connessione = new Socket (ip_address,porta); 
     } catch(IOException e) {
              ......}
......
 
     try {
        in = connessione.getInputStream();
        datain = new DataInputStream(in);
        out = connessione.getOutputStream();
        prout = new PrintStream (out);
     }    catch(IOException e) { }
 prout.println("LIST");
 prout.flush();
try {
       arriva=datain.readLine();
    }    catch(IOException e) { }
il messaggio che mi arriva dal server FTP e' : "425 Can't build data
connection: Connection refused".
Sicuramente con 'arriva=datain.readLine(); ' non riesco a ' catturare'
quanto mi manda il server, ma perche' mi arriva quel messaggio di errore
?
Che oggetto devo utilizzare X catturare quanto mi viene spedito ? 
Grazie .
--
Posted from 
tlvsdy.vim.tlt.alcatel.it
 [151.98.8.244]
via Mailgate.ORG Server - 
http://www.mailgate.org

Dai un'occhiata all'RFC 959 ( 
http://www.ietf.org/rfc/rfc0959.txt
 ) per
capire come funziona FTP, e perche' devi aprire una data connection.

 
Il problema e' proprio questo !!!
Prima di mandare un comando che 'utilizza' il file System (tipo "LIST")
devo definire con il comando "PORT h1,h2,h3,h4,p1,p2" la data port da
usare nel 'data connection'. E questo lo faccio.
Dopodiche' ,penso, dovrei creare un oggetto ServerSocket che ascolta
sulla porta definita dal comando "PORT ...." come qunto segue :
...
try {
        in = connessione.getInputStream();
        datain = new DataInputStream(in);
        out = connessione.getOutputStream();
        prout = new PrintStream (out);
     }    catch(IOException e) { }
.....
prout.println("PORT 151,98,180,158,9,20"); //porta 2324
prout.flush();
a ricevo  : "200 PORT command successful."
Poi creo un ServerSocket :
try{
            ServerSocket s = new ServerSocket(2324);
           prout.println("LIST"); //SEND COMMAND LIST
            prout.flush();
            data = s.accept();
        }catch(Exception e){} 
 
     try {
           out2 = new PrintWriter(data.getOutputStream(), true); 
            ir = new InputStreamReader(data.getInputStream());
            in2 = new BufferedReader(ir); 
     }catch (IOException e) { }  
     if (ir.ready())
     {
 
                        inputLine = in2.readLine();
 
             //BUT HERE I DON'T RECEIVE NOTHING !!!!!!          
      }     
In cosa sbaglio? Perche' non ricevo nulla dopo aver inviato il comando
"LIST" ?
Sicuramente non va bene "inputLine = in2.readLine();". Cosa devo
utilizzare ?
Ho visto un esempio di Server FTP, il quale alla ricezione del comando
LIST fa quanto segue :
....
if(comm.equals("LIST")||comm.equals("NLST"))
{
	File f = new File(dir); 
        if(f.exists())
	{ 
        	try
		{ 
		      out.println("150 Opening data connection for /bin/ls."); 
                      Socket t; 
		      if(!passive)
		      { 
                	 	t = new Socket(host,ip); 
		      }else{t=dt;} 
               	      PrintWriter out2 = new
PrintWriter(t.getOutputStream(),true); 
		      String[] files=f.list(); 
                      String p=f.getPath(); 
		      if(f.getParent()!=null)
		      { 
				... ls(p,".",out2); ........
			                      		     } 
		                      for(int j=0;j<files.length;j++){ 
			                      ls(p,files[j],out2); 
			                      //ls2(p,files[j],System.out); 
                      			} 
		                      out2.close(); 
                		      t.close(); 
		                      if(passive)pPort++; 
                		      out.println("226 transfer complete"); 
                                 }      
                      		catch(IOException e){ 
		                      System.out.println(e);} 
                      } 
                      else out.println("550 "+dir+": no such file or
directory"); 
