 
                                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