FTP FILE F TRANSFER PROTOCOL Tópicos Revisão da aplicação FTP Implementação simples em Java de uma conexão FTP Implementação simples em Java de um comando de transferência de arquivo Descrição dos exercícios 1
FTP FILE F TRANSFER PROTOCOL Objetivos Promover compartilhamento de arquivos em rede Abstrair usuários dos diversos tipos de sistemas de arquivos existentes Introduzido em 1971 RFC 959 2
FTP FILE F TRANSFER PROTOCOL Modelo de operação 3
FTP FILE F TRANSFER PROTOCOL Modelo de operação Utiliza duas conexões TCP em paralelo Conexão de controle (comandos, etc) Conexão de dados Porta do servidor: 21 Porta da dados: Definida pelo cliente 4
FTP COMANDOSC Comandos Todo comando FTP gera uma resposta do servidor Um comando pode ter mais de um tipo de resposta, dependendo do sucesso ou fracasso da operação Sintaxe: Comando + espaço + CRLF Formato das respostas <código> + espaço + mensagem (opcional) Código é formado por 3 dígitos Ex: 200 Command okay. Resposta pode ter mais de uma linha; nesse caso é acrescido o caracter menos (-) ao lado do código Ex: 220- FTP WAR-FTPD 1.65 Ready 220 Please enter your user name. Notem que a última linha não tem o caracter - : É um sinal para indicar que é a última linha 5
FTP COMANDOSC Exemplos USER username Identificação do usuário PASS senha LIST Fornecimento da senha Obter uma lista dos arquivos do diretório remoto atual RETR arquivo Recuperar o arquivo especificado do servidor STOR arquivo CWD Armazenar o arquivo especificado no servidor Alterar o diretório remoto 6
FTP COMANDOSC Diálogo de login C> Conectar com ftp.server.com S> 220- FTP WAR-FTPD 1.65 Ready 220 Please enter your user name. C> USER username S> 331 User name okay, Need password. C> PASS xxxxxx S> 230 User logged in, proceed. Pedido de listagem de arquivos do diretório atual C> LIST S> 150 Opening ASCII NO-PRINT mode data connection for ls -l. S> 226 Transfer finished successfully. Data connection closed. 7
FTP COMANDOSC Determinação da porta para conexão de dados Supondo que o IP do cliente seja a.b.c.d C> De alguma maneira, obtém uma porta que não esteja sendo utilizada Ex: Porta 2048 C> PORT a,b,c,d,8,0 S> 200 Port command okay. Formato do comando PORT a,b,c,d : Endereço IP do cliente 8,0: Número da porta (16 bits) codificado em dois números de 8 bits, ou seja 00001000 00000000 (8 * 256) + 0 = 2048 8
FTP IMPLEMENTAÇÃO I DA CONEXÃO public class FtpConn { private String _hostname; // nome do servidor; e.g. ftp.java.sun.com private Socket _controlsocket; // socket para controle da conexão private BufferedReader _inputfromserver; // stream de onde lemos do servidor private PrintWriter _outputtoserver; // stream usado para enviar comandos ao servidor public int connect () throws Exception { // criação do socket de controle _controlsocket = new Socket (_hostname, 21); // criamos os canais de entrada e saída _outputtoserver = new PrintWriter (_controlsocket.getoutputstream () ); _inputfromserver = new BufferedReader (new( InputStreamReader (_controlsocket.getinputstream () ) ); // lemos a mensagem inicial do servidor e retornamos o código da resposta return readserverresponse (); } 9
FTP IMPLEMENTAÇÃO I DA CONEXÃO public int readserverresponse () throws Exception { // lê-se um dado do servidor String reply = _inputfromserver.readline (); // verificamos se a resposta é vazia if (reply == null reply.equals ("") ) return 0; return ExtractReplyCode (reply); } public int issuecommand (String command) throws Exception { // enviamos o comando para o servidor _outputtoserver.print (command + "\r\n" ); _outputtoserver.flush (); // recuperamos o código da resposta return readserverresponse (); } 10
FTP DOWNLOAD D DE ARQUIVOS public void download (String filename) { 1. Efetuar o comando PORT para informar ao servidor o número da porta da conexão de dados (é o mesmo que: servidor, vou abrir um socket em uma porta Y para você conectar-se a mim) 2. Efetuar o comando RETR filename 3. Ler a resposta do servidor para saber se a operação é possível; Se o código da resposta for 125 ou 150, o servidor está pronto para iniciar a conexão 4. Esperamos que o servidor estabeleça a conexão (de dados) 5. Lemos todos os dados enviados pelo servidor através do canal de comunicação 6. Lemos a resposta do servidor para essa operação (RETR) 7. Fecham-se os canais de comunicação (de dados) } 11
FTP DOWNLOAD D DE ARQUIVOS public void download (String filename) throws Exception { // 1. ServerSocket serversocket = openserversocket (); // 2. int responsecode = issuecommand ("RETR " + filename); // 3. if (responsecode!= 125 && responsecode!= 150) { serversocket.close (); return; ; } // 4. Socket datasocket = serversocket.accept (); // 5. BufferedReader datastream = new BufferedReader (new( InputStreamReader (datasocket.getinputstream() ) ); String line = datastream.readline (); while (line!= null) { System.out.println (line); line = datastream.readline (); } // 6. responsecode = readserverresponse (); // 7. datastream.close (); serversocket.close (); datasocket.close (); } 12
FTP LISTAGEM L DE ARQUIVOS public void listfiles () { 1. Efetuar o comando PORT para informar ao servidor o número da porta da conexão de dados 2. Efetuar o comando LIST 3. Ler a resposta do servidor para saber se a operação é possível; Se o código da resposta for 125 ou 150, o servidor está pronto para iniciar a conexão 4. Esperamos que o servidor estabeleça a conexão (de dados) 5. Lemos todos os dados enviados pelo servidor através do canal de comunicação 6. Lemos a resposta do servidor para essa operação (LIST) 7. Fecham-se os canais de comunicação (de dados) } 13
FTP EXERCÍCIOSE Implementar a sequência de login Implementar o comando LIST 14