FTP – FILE 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 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 TRANSFER PROTOCOL Modelo de operação 3 FTP – FILE 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 – COMANDOS 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 – COMANDOS Exemplos USER username PASS senha Recuperar o arquivo especificado do servidor STOR arquivo Obter uma lista dos arquivos do diretório remoto atual RETR arquivo Fornecimento da senha LIST Identificação do usuário Armazenar o arquivo especificado no servidor CWD Alterar o diretório remoto 6 FTP – COMANDOS 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 – COMANDOS 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 DA CONEXÃO public class FtpConn { private String _hostName; private Socket _controlSocket; private BufferedReader _inputFromServer; private PrintWriter _outputToServer; // nome do servidor; e.g. ftp.java.sun.com // socket para controle da conexão // stream de onde lemos do servidor // 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 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 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 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 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ÍCIOS Implementar a sequência de login Implementar o comando LIST 14