Esempio di utlizzo FTP Client API

Indice

Spiegazione passo-passo

Per prima cosa importiamo i packages necessari.

import it.mindflavor.ftp.*;
import java.io.*;
import java.net.*;

Ora impostiamo la classe. Per mantenerla semplice utilizziamo solo il metodo static main. Definiamo una stringa contenente l'URL da raggiungere.
Nota: gli URL vanno passati senza il protocollo prefisso: in questo modo Java, non sapendo come gestire l'URL ne demanda tutte le operazioni alle API.

public class TestFTP {
	
public static void main(String ag[]) {
	final String URL = "ftp.honors.unr.edu";

Adesso avvolgiamo tutte le operazioni in un grande blocco try { ... } catch(...) { ... } . Nella vostra applicazione potreste volere un controllo più fine (in modo da individuare esattamente dove è stato generato l'errore) ma nel caso specifico è più che sufficiente.
Di seguito dichiariamo e inizializziamo una FTPConnection al server Web scelto.

	try {
		FTPConnection conn = new FTPConnection(URL);

Ora linkamo una classe FTPAsker alla connessione appena creata. La classe FTPAsker si occupa di generare richieste al server e di decodificarne la risposta per voi. E' il cuore di FTP API.

		FTPAsker asker = new FTPAsker(conn);

Successivamente aggiungiamo, per scopi didattici, un WaitForCodeHandler. Questa classe si occupa di controllare i messaggi di risposta del server e di informarci quando capitasse quello che stavamo aspettando. E' molto importante sapere che le chiamate al server sono (secondo la filosofia di Internet) serializzate: cioè si possono inviare più richieste al server senza attendere la risposta.
Il parametro false indica che la classe non deve visualizzare su STDOUT le risposte del server (utile solo per il debugging in quanto creerebbe in questo caso confusione).

		WaitForCodeHandler handler = new WaitForCodeHandler(false, "TestFTP.Main()");
		conn.addFTPHandling(handler);

Di seguito ci connettiamo. Se FTPConnection.isOk() è affermativo possiamo procedere.

		conn.logon();
		if(conn.isOk()) {

Adesso eseguiamo, tramite FTPAsker alcune richieste al server. In particolare cerchiamo di connetterci come utenti anonimi fornendo come password un indirizzo e-mail. In seguito cambiamo qualche directory per raggiungere quella desiderata.

			asker.anonymousLogon("trymail@foo.it");
				
			asker.changeDir("pub");
			asker.changeDir("games");
			asker.changeDir("windows");

Adesso usiamo un metodo per ottenere una serie di informazioni sui file remoti nella directory corrente. Dopo averli ottenuti li inviamo semplicemente a STDOUT per la loro consultazione (guardateli attentamente perchè sono molto utili per capire come vengono gestiti i files remoti).

			RemoteFile[] rf = asker.listCurrentDir();
			for(int i=0; i<rf.length; i++)
				System.out.println((i+1) + ") " + rf[i]);

Adesso proviamo a ottenere un file, nello specifico il primo dell'elenco (che generalmente è un file di testo). Ricordiamoci di settare il tipo di trasferimento chiamando FTPAsker.setType(boolean isASCII).

			asker.setType(true);

Ora richiediamo effettivamente il file. Come si può notare la chiamata FTPAsker.retrive(...) ritorna una InputStream che possiamo gestire come vogliamo. Nel nostro caso non facciamo altro che girare i dati ricevuti a un FileOutputStream che copia il file in locale.
Provate a cambiare il tipo di trasferimento per vedere le differenze: se utilizzate un sistema non Unix dovreste vedere la differenza nell'interpretazione del ritorno-carrello/a capo dei 2 sistemi operativi.

			BufferedReader bin = new BufferedReader(new 
InputStreamReader(asker.retrive(rf[0])));
			FileOutputStream fout = new FileOutputStream(new File("message.txt"));
			int i = 0;
			while( (i = bin.read()) != -1)
				fout.write(i);
			
			bin.close();
			fout.close();
			System.out.println("File \"" + rf[0].getName() + 
			"\" richiamato con successo.");
			System.exit(0);

In questa parte del programma ci curiamo di avvertire l'utente se qualcosa fosse andato storto.

		} else {
			System.out.println("Non posso accedere al sito.");
		}
	} catch(UnknownHostException e) {
		System.err.println("Non posso accedere al sito FTP("+URL+").\nErrore: " + e);
	} catch(IOException e) {
		System.err.println("Errore di connessione: " + e);
	}
}	
}

Indice

Download

Descrizione Dimensione Download
Applicazione di esempio (non compilata)
2 Kb

Indice

Data ultimo aggiornamento: 13 Dicembre 2002

@2002 Francesco Cogno