P>

capa_NET39_G.gif

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 em Rock Progressivo e Beatles, amigo de muitos anos, procurou-me querendo saber se poderia ter um site com venda de CDs, camisetas e outros produtos, fórum de discussões e agendas de eventos.

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.

 

image004.jpg 

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 21, a porta usualmente atribuída aos servidores FTP. Essa comunicação é conhecida como “Canal de Controle de Conexão”.

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 em Visual Basic .NET no Visual Studio 2005. No entanto, podem ser escritos em qualquer linguagem do ambiente .NET, assim como em outras versões do Visual Studio (Express).

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).

 

image006.jpg

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 em OK. O Solution Explorer deverá estar semelhante a Figura 3.

 

image008.jpg

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 ...

Quer ler esse conteúdo completo? Tenha acesso completo