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.
 
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

	}

}
 
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, 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