Protocollo FTP

lostedsheep

Nuovo Utente
30 Nov 2010
18
0
0
Salve a tutti! Per scopi didattici sto cercando di capire a fondo il protocollo FTP e per mettere in pratica lo studio teorico vorrei provare ad implementare un server ed client fittizzi giusto per capire se quanto ho appreso è corretto.
Da quanto si legge nella RFC 959 il server si pone in ascolto di nuove connessioni su una porta L=21; quando un client si connette instaura una connessione di controllo utilizzando una qualsiasi porta locale (U) assegnatagli dal sistema che comunicherà al server; nel momento in cui il client impartisce un comando di trasferimento il server crea una connessione sulla porta locale L-1=20 e la porta del client U.
Ora la mia domanda è: come fa il client ad accettare connessioni sulla porta U?
Ho provato a realizzare il tutto in java come segue
Codice:
// codice del server

try {
    socket = new ServerSocket(21);
    System.out.println("Socket successfully created\nWaiting for incoming connection");
    Socket clientSocket = socket.accept();
    System.out.println("Connection established with " + clientSocket.getInetAddress());
    ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
    Integer port = (Integer) ois.readObject();
    System.out.println("Client's port: " + port);
    System.out.print("Establishing connection with remote host...");
    Socket remHost = new Socket(clientSocket.getInetAddress(), port);
    System.out.println("success");
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} finally {
    if (socket != null) {
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Codice:
// codice del client

InetAddress address = InetAddress.getLocalHost();
int port = 21;
Socket socket = new Socket(address, port);
System.out.println("Established connection with host");
ObjectOutputStream oop = new ObjectOutputStream(socket.getOutputStream());
oop.writeObject(socket.getLocalPort());
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.accept();
socket.close();

ma come mi aspettavo sul client viene sollevata una bind exception e sul server una connection refused.
Avete qualche idea??? Grazie infinite a tutti coloro che mi risponderanno.
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
Ciao, una volta accettata la connessione lato server ti viene restituita una socket. Quella socket è l'unica che devi usare per la comunicazione con il client. Lato client non devi usare le server socket ma solo una normale socket. Sotto un piccolo esempio che usa un thread per ogni client.

ciao

Codice:
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			
			ServerSocket serverSocket = new ServerSocket(1234);
			while(true){
				Socket clientSocket = serverSocket.accept();
				System.out.println("Connessione accettata");
				FtpThread ftpThread = new FtpThread(clientSocket);
				ftpThread.start();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}

FtpThread

Codice:
public class FtpThread extends Thread {

	private Socket	clientSocket;

	public FtpThread(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}

	@Override
	public void run() {
		try {
			InputStream inputStream = clientSocket.getInputStream();
			OutputStream outputStream = clientSocket.getOutputStream();
			
			System.out.println(inputStream.read());
			
			outputStream.write("ciao".getBytes());
			//TODO AGGIUNGERE LA LOGICA
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

Client

Codice:
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost",1234);
			InputStream inputStream = socket.getInputStream();
			OutputStream outputStream = socket.getOutputStream();
			
			outputStream.write("ciao".getBytes());
			
			System.out.println(inputStream.read());
			//TODO AGGIUNGERE LA LOGICA
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub

	}

}
 

lostedsheep

Nuovo Utente
30 Nov 2010
18
0
0
Ciao, innanzi tutto grazie per la risposta.
Come dici va più che bene ma non l'FTP o meglio la soluzione postata non rispetta le specifiche del protocollo FTP. Come avevo spiegato, dall'RFC si ha che il client attiva una socket su una porta U che si "dirama" con due connessioni TCP verso due socket sul server identificate dai numeri di porta L ed L-1 che di default sono la 20 e la 21; sulla L transitano i comandi che il client impartisce al server quali cambio directory, username, password, ecc. mentre sulla L-1 i dati dal client al server in caso di upload e dal server al client in caso di download. La tua soluzione non mi pare sia aderente a quanto specificato nel protocollo.
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
Ciao, innanzi tutto grazie per la risposta.
Come dici va più che bene ma non l'FTP o meglio la soluzione postata non rispetta le specifiche del protocollo FTP. Come avevo spiegato, dall'RFC si ha che il client attiva una socket su una porta U che si "dirama" con due connessioni TCP verso due socket sul server identificate dai numeri di porta L ed L-1 che di default sono la 20 e la 21; sulla L transitano i comandi che il client impartisce al server quali cambio directory, username, password, ecc. mentre sulla L-1 i dati dal client al server in caso di upload e dal server al client in caso di download. La tua soluzione non mi pare sia aderente a quanto specificato nel protocollo.

Ciao quella che ti ho postato è la soluzione per aprire la sessione di controllo, cioè quella dove vengono passati i comandi ftp.

Per quanto riguarda la connessione per il passaggio dei dati, dipende da come la vuoi fare, cioè se vuoi usare il passive mode o l'active mode (in realtà lato server dovresti prevederli entrambi).

In active mode, il client deve passare al server un ip e una porta dove il server si connette per inviare o ricevere i dati. In passive mode è il client che riceve questi due parametri e apre un altra connessione verso il server.

Spero di esserti stato d'aiuto.

ciao
 
Discussioni simili
Autore Titolo Forum Risposte Data
F Problemi con protocollo FTP Filezilla HTML e CSS 7
M ASP: accesso tramite protocollo FTP Classic ASP 2
S Protocollo https non compare sempre Hosting 5
batik79 Problema port forwarding con protocollo RTSP su vodafone station IP Cam e Videosorveglianza 0
MarcoGrazia Ricerca dell'esistenza del protocollo ( http | https ) in un url Javascript 2
P id auto_increment per protocollo PHP 2
I pagina pdf stampabile con numero di protocollo sequenziale Javascript 3
T codice per protocollo smtp in php? PHP 10
8 ORA-12560: TNS: errore dell'adattatore del protocollo Oracle 0
peppoweb Alert: Vulnerabilita' nel protocollo RPC Sicurezza e Virus 0
R Cambiare il nome dell'immagine dopo caricamento ftp HTML e CSS 0
L Caricamento dominio con FTP già preesistente in rete Domini 2
I Non riesco ad accedere ftp tramite IP in LAN Reti LAN e Wireless 6
romeocharly [PHP] Script per rinominare in automatico le immagini inviate da ftp PHP 0
D FTP e Account ddns - unico account da remoto e locale? Reti LAN e Wireless 0
R Configurazione upload ftp su dvr IP Cam e Videosorveglianza 3
romeocharly come sapere quali porte ftp passive un software usa Web Server 0
felino [WordPress] Ridurre peso immagini via FTP WordPress 7
romeocharly [WordPress] come si aprono le porte dell' FTP passivo ... WordPress 0
B errore ftp Domini 4
Chompy_666 Errore 550 /ftp client Server Dedicati e VPS 1
romeocharly richiesta credenziali ftp in wordpress Server Dedicati e VPS 1
C IP CAM ed invio foto via FTP IP Cam e Videosorveglianza 5
Magenta [WordPress] Dati ftp per aggiornare in locale WordPress 10
michelangelopaone IPCAM Szinocam e upload FTP IP Cam e Videosorveglianza 0
felino Netgear e connesssione FTP Adsl e Connettività 2
S DVR e configurazione ftp IP Cam e Videosorveglianza 5
L Configurazione client FTP integrato in Dreamweaver HTML e CSS 3
Monital Bloccare l'accesso ad una cartella sull'ftp PHP 3
B Problema caricamento files con FTP Hosting 5
filomeni Ftp PHP 2
D [VB.NET] Eliminare Cartella e sottocartelle TRAMITE FTP .NET Framework 1
asevenx problema con accesso ftp Hosting 4
A client FTP gratis per Mac Mac e Software 1
voldemort Svolgere operazioni FTP all'interno di app iOS Sviluppo app per iOS 0
F Ftp server Windows e Software 0
A problema nella visualizzazione file caricato tramite ftp WordPress 0
M Comandi FTP in pagina html - Javascript Javascript 1
E Leggere file tramite FTP/TLS PHP 11
M Scaricare file Xml dal Web sul Proprio ftp possibile? PHP 0
N PHP e FTP PHP 9
N Trasferimento file da server FTP a FTP tramite script PHP 1
N permessi ftp WordPress 2
L problema ftp upload su host windows PHP 9
M [FTP]Problemi con aruba Hosting 5
L [PHP e FTP upload] controllo file allegato PHP 6
Frank10 Aggiornare contenuto sito senza FTP HTML e CSS 6
YellowMan Client FTP per Android Smartphone e tablet 1
voldemort Aruba problemi FTP Hosting 1
S Spostare file hostati con ftp PHP 1

Discussioni simili