P>
Clique aqui para ler todos os artigos desta edição
Conectividade
Desenvolvendo um Cliente FTP
Este artigo discute |
Este artigo usa as seguintes tecnologias |
· Protocolo de Transferência de Arquivos (FTP); · Arquitetura em camadas; · Aplicação FTP client. |
Visual Studio 2005, Visual Basic .NET, Windows Forms e .NET Framework 2.0 |
O proprietário de uma pequena loja de discos especializada
De imediato pensei o quão eloquente seria concorrer com os grandes sites de comércio eletrônico. Depois percebi que estaríamos lidando com um público especializado composto de colecionadores e aficionados, ou seja, uma tribo fiel. O meu “cliente”, o proprietário da lojinha, colocou ainda duas premissas que deveriam ser consideradas no projeto do site:
· A administração do site deverá ser de operação muito simples e a mais automática possível, sabendo-se que o usuário do sistema será um especialista em “raridades” e não em tecnologia;
· “Não tenho como te pagar em dinheiro e nem ao menos posso gastar muito para manter o site funcionando”. Essa premissa deverá nortear muitas das decisões a serem adotadas durante o desenvolvimento.
A lojinha de discos já utilizava um antigo sistema desktop para controlar o caixa e o estoque dos produtos comercializados. O projeto do site deveria prever a integração com o sistema legado (reescrever o sistema, oneraria o custo do projeto de forma proibitiva). Um dos problemas a enfrentar seria a atualização periódica do catálogo de produtos a venda.
Optou-se então por desenvolver uma aplicação Windows para extrair os dados do sistema legado, gerar e transferir arquivos via FTP para o servidor onde o site estivesse hospedado. Um Web Service poderia ser uma alternativa mais elegante e moderna para essa transferência de dados, mas, muitos estudos apontam para uma significativa perda de performance dos Web Services quando lidamos com grandes volumes de dados.
Projetar sistemas de computador é, na maior parte do tempo, decidir qual a solução mais adequada para resolver determinado problema ou necessidade que o sistema em construção deverá satisfazer. A solução deverá estar absolutamente alinhada aos requisitos do sistema. O problema é que muitas vezes subestimamos os requisitos não funcionais, que envolvem elementos como performance, custo e facilidade de operação.
Neste artigo discutiremos a criação de um software cliente de um servidor FTP (File Transfer Protocolo), onde utilizaremos algumas das muitas facilidades disponíveis no .NET 2.0. Nosso pequeno projeto de software estará organizado em duas camadas: uma biblioteca de classe com as funcionalidades do cliente FTP, representando a camada de dados e um sistema aplicativo para teste da biblioteca, responsável pela interface com o usuário, representando a camada de apresentação.
O Protocolo de Transferência de Arquivos (FTP)
FTP é o acrônimo de File Transfer Protocol (Protocolo de Transferência de Arquivos), um protocolo de comunicação especificado para atuar em ambientes distribuídos (arquitetura cliente/servidor), objetivando o compartilhamento de arquivos de dados entre usuários de ambientes híbridos.
O mecanismo do FTP teve sua primeira proposta impetrada em 1971, passou por várias melhorias e correções ao longo dos anos, até a publicação da versão atual em outubro/1985 na RFC959 (veja link nas referências bibliográficas).
O protocolo tem como principais objetivos:
1. A promoção do compartilhamento de arquivos;
2. O encorajamento indireta e implicitamente à utilização de computadores remotos;
3. A proteção dos usuários das variações entre os sistemas de armazenamento de arquivos;
4. A transferência confiável e eficiente de dados.
A Figura 1 apresenta o modelo de transações do FTP.
Figura 1. Modelo de transações do FTP
O cliente inicializa uma sessão com o servidor FTP solicitando uma conexão TCP na porta
O interpretador do protocolo do cliente envia comandos FTP padrões ao servidor e aguarda o retorno de respostas, compostas de um código e um texto explicativo. O código é direcionado para uso por sistema de computador, enquanto que o texto está direcionado ao usuário final que pode estar utilizando o protocolo diretamente através de um software emulador de terminal (Telnet, por exemplo).
Dessa forma, podemos observar que o controle de transações do FTP está baseado na troca de comandos e respostas entre o lado cliente e o servidor remoto. Os comandos FTP são geralmente compostos de quatro caracteres, um espaço em branco, um argumento opcional e um código de fim de linha (CRLF).
A transferência de dados entre a estação cliente e o servidor FTP, necessário em vários procedimentos, como, por exemplo, o upload e download de arquivos, requerem a alocação de uma segunda porta de comunicação que será utilizada na troca de dados. Essa comunicação é conhecida como “Canal de Dados”.
A Tabela 1 apresenta a relação dos principais comandos FTP especificados na RFC959. Alguns fabricantes de servidores FTP implementam um conjunto adicional de comandos, agregando novas funcionalidades que, apesar de vantajosas, não são padrões e, portanto, podem não ser tratadas por todos os utilitários.
Comando FTP |
Descrição |
USER |
Identificação do código de usuário para logon no servidor. |
PASS |
Senha de acesso do usuário para logon no servidor. Deve ser usado logo após o comando USER quando o código de usuário requerer. |
QUIT |
Encerra a sessão FTP em uso, desconectando o usuário. |
SYST |
Retorna o tipo do sistema operacional do servidor remoto. |
HELP |
Ajuda a respeito dos comandos FTP do servidor remoto. |
NOOP |
Faz com que o servidor responda com a mensagem 200 (Command okay). Esse comando não afeta nenhum parâmetro ou comando anterior. É utilizado apenas para evitar que a sessão seja encerrada pelo servidor remoto por expiração de tempo sem comunicação (time out). |
PWD |
Retorna o nome do diretório corrente do servidor remoto. |
CWD |
Troca o diretório corrente do servidor remoto. |
RMD |
Remove um diretório ou subdiretório do servidor remoto. |
MKD |
Cria um diretório ou subdiretório no servidor remoto. |
DELE |
Exclui um arquivo do servidor remoto. |
TYPE |
Especifica o tipo de dado que deverá ser utilizado em uma sessão de transferência e armazenamento de dados. |
PASV |
Configura o FTP passivo, requerendo que o processo de transferência de dados do servidor (server DTP) aguarde uma conexão de dados a partir de uma porta TCP específica. O servidor responderá ao comando informando o IP e a porta da conexão de dados. |
RETR |
Faz com que o servidor envie para a estação cliente a cópia de um arquivo, especificado no argumento do comando, através de uma conexão de dados associada (download). |
STOR |
Faz com que o servidor aceite a recepção de dados a partir de uma conexão de dados associada e armazenando-os em um arquivo especificado no argumento do comando (upload). |
REST |
Reinicia a transferência de um arquivo de dados a partir de um ponto de interrupção anterior. |
RNFR |
Inicializa o procedimento para renomear um arquivo ou subdiretório, informando como argumento a nome do elemento que será renomeado. |
RNTO |
Deve ser usado logo após o comando RNFR finalizando o procedimento para renomear um arquivo ou subdiretório. O elemento será renomeado para o nome informado no argumento do comando. |
LIST |
Retorna uma lista de arquivos e subdiretórios contidos no diretório corrente ou no diretório informado no argumento do comando. A lista será enviada pelo servidor remoto através de uma conexão de dados associada. |
ABOR |
Interrompe o processamento do comando anterior e qualquer processo de transferência de dados associado, fechando a conexão de dados associada. |
Tabela 1. Principais comandos do FTP
Nesse artigo utilizaremos alguns dos comandos mostrados na Tabela 1, servindo como base para um conhecimento que, dependendo da necessidade, pode ser aprofundado.
Iniciando o desenvolvimento
Estaremos trabalhando com dois projetos do Visual Studio, um para a biblioteca de classe (camada de dados) e outro para o aplicativo de teste (camada de apresentação), intitulados ClienteFTP e TesteFTP, respectivamente. Ambos os projetos serão escritos
O fato da biblioteca de classe, responsável pelas funcionalidades do cliente FTP, ser construída em um projeto individual, que resultará em um assembly próprio, possibilitará a reutilização da classe em outros projetos que necessitem da mesma funcionalidade, sem qualquer implementação adicional. Essa é uma das grandes vantagens da arquitetura em camadas.
Podemos então criar um novo projeto do tipo Class Library, para nossa biblioteca de classes, atribuindo-lhe o nome de “ClienteFTP”. Quando salvar a solução, não deixe de marcar a opção Create directory for solution (Figura 2).
Figura 2. Criando o projeto Class Library
No Solution Explorer clique com o botão direito e adicione um novo projeto Windows Applications, de nome “TesteFTP”. Nesse momento, nossa solução já conterá os dois projetos com os quais trabalharemos. Resta-nos apenas adicionar uma referência à biblioteca de classe no projeto da aplicação de teste.
Para isso, clique com o botão direito no projeto Windows Application e escolha a opção Add Reference. Na janela, clique na aba Projects e clique
Figura 3. Arquitetura de projeto da solução
A biblioteca ClienteFTP
No projeto ClienteFTP vamos excluir o arquivo Class1.vb e adicionar a classe “ClienteFTP.vb” (clique com o botão direito e escolha Add> Class), que conterá as propriedades e métodos responsáveis pelas funcionalidades que desejamos implementar para nosso cliente de servidor FTP.
A Tabela 2 apresenta a relação das propriedades públicas da classe ClienteFTP, juntamente com os tipos de dados e uma breve descrição do conteúdo.
Propriedade |
Tipo |
Descrição |
ServidorRemoto |
String |
Endereço ou IP do servidor remoto |
Porta |
Integer |
Número da porta FTP do servidor remoto |
Usuario |
String |
Código de usuário para logon no servidor |
Senha |
String |
Senha de acesso para logon no servidor |
TamanhoBlocoDadosDownload |
Small Integer |
Tamanho em bytes do bloco de dados durante o download (recepção) de dados |
TamanhoBlocoDadosUpload |
Small Integer |
Tamanho em bytes do bloco de dados durante o upload (envio) de dados |
Tabela 2. Propriedades públicas da classe ClienteFTP
A Listagem 1 apresenta a classe ClienteFTP, com a declaração das variáveis locais, das propriedades públicas e dos métodos construtores e destrutores da classe. Em Imports estão referenciados os namespaces que serão utilizados.
Listagem 1. A classe ClienteFTP
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Public Class ...