ftp - IC/UFF

Propaganda
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
Download