You are on page 1of 22

Escola Politcnico de Viseu

Escola Superior de Tecnologia e Gesto de Lamego

Aplicao de Transferncia De Ficheiro


Entre Cliente e Servidor

Escola Superior de Tecnologia e Gesto de Lamego


Lamego, 26 de Maio de 2016

Escola Politcnico de Viseu

Escola Superior de Tecnologia e Gesto de Lamego

Engenharia Informtica e Telecomunicaes (EIT)

Disciplina Sistema Distribudo, 3 Ano

Docente: Carlos Costa

Trabalho Realizado por:


Justino de Jesus n Aluno 2757

Lamego, 26 de Maio de 2016

ndice
Introduo ....................................................................................................................... 4
1.

Conceitos .................................................................................................................. 5

2.

Requisitos da Aplicao .......................................................................................... 5

3.

Estado da Arte ......................................................................................................... 6

4.

O Protocolo de Transportes e do Modelo de Interao a Implementar ............. 6


4.1.

Protocolo TCP.................................................................................................... 7

4.2.

Protocolo UDP (User Datagram Protocol) ....................................................... 8

4.3.

SingleThreaded e MultiThreaded ...................................................................... 9

SingleThread/ MonoThread .................................................................................... 10


MultiThreaded ......................................................................................................... 10
5.

Proposta da Soluo .............................................................................................. 12

6.

Implementao da Aplicao ............................................................................... 12

7.

6.1.

Implementao a Classe FicheiroRemoto com Interface Serializable ............ 13

6.2.

SingleThreaded ................................................................................................ 14

6.3.

MultiThreaded ................................................................................................. 16

6.4.

Cliente .............................................................................................................. 16

Resultado Obtidos Teste da Aplicao desenvolvida ......................................... 17


7.1.

Servidor SingleThread ..................................................................................... 17

7.2.

Servidor MultiThreaded ................................................................................... 19

Concluso ...................................................................................................................... 20

Bibliografia................................................................................................. 21

Figuras
Figura 1 - Protocolo de comunicao entre o cliente e o servidor ............................... 11
Figura 2 - Estrutura dos projetos. ................................................................................. 12
Figura 3 - Classe implementa a interface serializable .................................................. 13
Figura 4 - Servidor fica a esperar a ligao .................................................................. 17
Figura 5 - Aplicao cliente est a iniciar .................................................................... 17
Figura 6 - Servidor, A ligao estabelecida, usando endereo local 127.0.0.1, escuta na
porta 6192, porta local de 8090 ................................................................................... 17
Figura 7 - Cliente solicitou o existe no servidor, o servidor devolve o tamanho do
ficheiro e a mensagem de confirmao, de seguir copia 25 bytes e guardando no seu
disco local e programa termina. ...................................................................................... 18
Figura 8 - o Servidor fica esperando outro pedido. ...................................................... 18
Figura 9 - Cliente solicita um ficheiro que no exista no servidor ............................... 18
Figura 10 - Servidor Multithreaded a ligao estabelecida com cliente 1, endereo
local, porta 6231, localport 8090. ................................................................................... 19
Figura 11 - Transferncia de ficheiro de servidor para o cliente .................................. 19
Figura 12 - Ligao estabelecida com Cliente 1 e Cliente 2 ........................................ 19

Introduo
Obviamente, estamos utilizando alguma variante de aplicao Cliente e
Servidor, onde parte do processamento dos dados feito do lado do cliente
utilizadores que pretendam obter as informaes desejadas e a parte processamento do
lado do servidor geralmente um computador que capaz de processar grande
quantidade de informao, atender vrios os pedidos de clientes. Em alguns casos
poderemos ter a relao um cliente para um servidor, vrios clientes para um servidor,
vrios servidores para um cliente. Em todos este caso podemos supor que os
computadores esto conectados via rede local ou internet.

Neste trabalho iremos desenvolver de um servio simples de transferncia de


ficheiro, no qual um host definido como cliente que possa solicitar um ficheiro de um
outro host, designado como servidor. O host servidor dever ser capaz de entender
vrios pedidos dos clientes. Esta aplicao dever ser implementada baseado em socket
TCP, usando a linguagem Java.

Ao longo deste projeto iremos abordar nomeadamente os protocolos de


transportes usando para que clientes e servidor possam efetuar as trocas de mensagem,
modelo de interao a implementar sobre SingleThreaded e Multithreaded, os
protocolos TCP e UDP, implementao e teste a aplicao desenvolvida, anlise os
resultados obtidos e o resumo geral do trabalho desenvolvido.

1. Conceitos
Alguns conceitos, devemos compreender so listados a seguir:

Servidor o computador que contm a aplicao que pretendemos executar via


remota;

Cliente a aplicao remota que permite interagir como o servio ou servidor;

Servio uma aplicao sendo executado no servidor. Para cada tipo de servio
poder ser ter um tipo de cliente especfico, capaz de efetuar a comunicao de
forma adequada.

Endereo a informao da localizao de um computador de uma rede local


ou na internet, constitudo por IP (Internet Protocol) do computador DNS
(Domain Name System).

Porta : endereo local em um computador, permite conectar a uma rede local ou


internet, identificado por um nmero nico.

Socket terminal de um canal de comunicao de duas vias, entre cliente e


servidor. Para que o cliente e servidor possa efetuado a troca de mensagem, o
cliente e o servidor criaro cada um u socket que sero associados um com outro
para o envio e receo de informao.

2. Requisitos da Aplicao
O requisito de uma aplicao pode ser definido como uma condio ou
capacidade que o programa deve possuir, para que os utilizadores possam resolver
um determinado problema ou atingir um objetivo. Para isso, esta aplicao deve ter
os seguintes requisitos funcionais para o servidor e cliente respetivamente:

Servidor

A aplicao deve possibilitar atender vrios pedidos do cliente;

capaz de responder a solicitao por parte do cliente;

Deve possibilitar identificar a identidade dos cliente tal IP address, porta


etc..

Cliente:

Deve realizar a ligao ao servidor;

Capaz de fazer pedido ao servidor, para obter a informao deseja;

Terminar a ligao;

3. Estado da Arte
O desenvolvimento desta aplicao para terem sucedido, devemos ter alguns dos
seguintes conhecimentos tcnicos:

Compreenso e implementao de diversas estruturas de controlos em


linguagem Java tal como condicionais, ciclos etc..;

Termos conhecimento da programao orientada a objetos, nomeadamente em


linguagem Java;

Conhecer alguns dos mecanismos de programao da redes em Java tal como


entrada e sada (Stream), Socket, ServerSocket etc..

Termos conhecimento bsico do funcionamento de um computador ligado em


uma determinada rede ou internet.

4. O Protocolo de Transportes e do Modelo de Interao a


Implementar
O protocolo de transporte o protocolo que oferecer um comunicao lgica
entre processos das aplicaes, tal como cliente e servidor em que a execuo em
diferente hosts. Estes protocolos so executados nos sistemas finais ou seja do lado
emissor divide as mensagens em vrios segmentos e passa-os a camada de rede por
exemplo ao IP e do lado recetor juntar de novamente os segmentos nas mensagem e
passa a camada de aplicao. Esta camada possui dois protocolos que so o
protocolo TCP (Transmission Control Protocol) e UDP (User Datagram Protocol).
Os Principais Objetivos de um protocolo de transportes

Garantir a integridade do fluxo de dados (TCP) ou seja capazes de detetar e


recuperao de pacotes fora da ordem e recuperar de erros e perdas de dados.

Garantir a entrega dos pacotes um determinado aplicao de destino dos


pacotes;

Controlo de fluxo e controlo de congesto, evitar congestionar o recetor e a


rede.

4.1.

Protocolo TCP

O protocolo TCP um protocolo orientao a conexo, permite criar uma conexo


virtual entre dois TCPs (cliente e servidor) para enviar dados. Alem disso, o TCP
tambm utiliza o fluxo e mecanismos de controlo de erros no nvel da camada de
transporte.

Servios de Entrega de Fluxo de Dados


o O TCP o um protocolo orientado a fluxo de dados, pelo contrrio do protocolo
UDP;
o Possibilita a um processo enviar dados de forma de um fluxo de bytes;
o O TCP cria um ambiente no qual os dois processos podem estabelecer via um
canal, suponha que transporta dados pela internet.

Buffer da Transmisso e Receo


o Existe dois buffers, um buffer de emissor e um buffer de recetor um em cada
direo;
o possvel que os processo de transmisso e de receo no gerem a mesma
velocidade, pelo que o TCP precisa de buffer para o seu armazenamento.

Segmentos
o Na camada de transporte, o TCP agrupa determinado nmeros de bytes em
pacotes de dados, designados por segmentos;
o O TCP acrescenta um cabealho a cada segmento para que possa controlar
entrega o segmento para a camada IP para sua transmisso.
o Os segmentos so encapsulados em datagramas IP e transmitidos.

Modo de Comunicao Full-Duplex


o O processo de comunicao no qual os dados podem fluir em ambos as
direes simultaneamente.
o Cada processo TCP implementa um buffer de transmisso e um buffer de
receo e os segmentos trafegam e ambas as direes.
7

Servios Orientados a Conexo


o Quando um processo de cliente que enviar e receber dados do outro processo
de servidor, ocorre o seguinte cenrios:
o Os dois processos TCP estabelecem uma ligao entre eles;
o Os dados so trocados em ambos os sentidos (full-duplex);
o A ligao encerrada.

4.2.

Protocolo UDP (User Datagram Protocol)

A UDP um protocolo mais simples e por si s, no fornece garantia na entrega


pacotes. No entanto o processo de garantia de dados pode ser simplesmente realizado
pela aplicao em si (UDP) e no pelo protoloco. Usando o protocolo UDP, uma
mquina emissora envia uma determinada informao e a mquina recetora recebe essa
informao, no existindo quais quer mecanismos para confirmar dos pacotes recebidos.
Se um pacotes perde no existe solicitao de reenvio, assim torna se um protocolo
mais leve, em termos de utilizao de recursos computacionais.

Operaes da UDP
o Servio sem conexo significa que cada datagrama de utilizador enviado
pelo protocolo UDP datagrama independente ou seja no existe nenhuma
relao entre diferentes datagramas de utilizador, mesmo que se forem
provenientes do mesmo processo de origem e tiveram o mesmo programa de
destino. Os datagramas no so enumerados e no existe mecanismo para
estabelecer e ou terminar uma conexo virtual.
o Controlo de Fluxo e de erros: no implementa controlo de fluxo e portanto,
nenhum mecanismo de janela (window). O recetor pode ser inundado com
um nmero excessivo de mensagem que chegam a ele. No implementa
mecanismo controlo de erro exceto checksum, isto o emissor no sabe se
uma mensagem foi perdida ou duplicada. Quando o recetor deteta um erro
por meio do checksum, o datagrama de utilizador descartado de forma
imperceptivel.

o Encapsulamento e Desencapsulamento: para enviar uma mensagem de um


processo a outro o protocolo UDP encapsula e desencapsula mensagem em
um datagrama IP.

Uso de UDP
o A UDP usada em alguns protocolos de roteamento para atualizao de
rotas como o RIP (Routing Infomation Protocol).
o Adequado para um processo que requeira comunicao solicitao simples
com pouca preocupao com controlo de erros e de fluxos de dados.
o Utilizado na gesto de redes.

4.3.

SingleThreaded e MultiThreaded
Antes de irmos abordar sobre singlethreaded e multithreaded, vamos apresentar

o conceito do programa e o processo. O programa um conceito esttico, isto um


programa um ficheiro em disco local que contem um cdigo executvel por uma
unidade central de processamento (UCP). No memento em que este programa
executado dizemos que um processo. Portanto um processo um programa ou uma
aplicao em execuo. Note que um programa em execuo precisa de alocar recurso
como memria, disco etc. Podemos considerar a CPU sigla em Inglesa (Control process
Unit) como um recurso alocado por um processo, porque pode haver vrios processos
em execuo simultaneamente e s um processo est com o recurso CPU numa
determinada instante.
Um mesmo programa pode ser executado vrias vezes simultaneamente. Assim
podemos afirmar que temos vrias linhas de execuo deste programa.
Praticamente, o sistema operativo controla a execuo dos vrios processos:
o Dando uma alguns segundos para cada um de acordo com algum esquema de
prioridade.
o Assegurando a sincronizao entre os processos quando os mesmos precisam
trocar informaes.
Em java possvel executar vrias linhas de execuo do mesmo programa, designado
por Threads ou MultiThreading A diferena com os programas e processo referido
9

acima que java interpretado. O prprio interpretador Java responsvel vrios


threads de um programa. H vantagens em relao aos processos so o chaveamento
entre as threads mais rpido que um chaveamento entre processo e a troca de
mensagem entre os thread tambm mais eficiente.

SingleThread/ MonoThread
No ambiente de programao singleThread, um processo suporta apenas um
programa no seu espao de endereamento e apenas uma instruo do programa
executada.
Relaciona-se ao cliente e servidor. Normalmente vrios clientes podem fazer
pedido ao mesmo tempo para um determinado servidor. O servidor ento pode atender
um cliente por vez e outros clientes tem que esperar. Este cenrio designado
singletheaded ou servidor no concorrente.
MultiThreaded
Para diminuir o tempo gasto na criao ou eliminao de subprocesso, bem como
economizar recursos computacionais, foi introduzido o conceito de thread. No ambiente
multithread,

cada

processo

pode

responder

vrias

solicitaes

mesmo

simultaneamente. O processo neste ambiente tem pelo menos uma thread de execuo,
podendo compartilhar o seu espao de endereamento com vrios threads, que podem
ser executados de modo concorrente no caso de mltiplos processadores.
As vantagens: so necessrios poucos processo para realizar a mesma tarefa.
O servidor multithread ou servidor concorrente deve ser capaz de atender vrios clientes
simultaneamente.
Modelo de Interao
O paradigma para interao entre cliente e servidor. Um lado do sistema assume papel
de executar um servio (servidor) e outro lado faz pedido a execuo de um servio
(cliente).

10

4.4.

Protocolo de comunicao entre cliente e servidor de ficheiro

Cliente

Incio

Servidor

Incio

Solicita a ligao

Esperar a ligao

Estabelecer a ligao

Envia nome do
ficheiro pretendido

Directory do
ficheiro

Pesquisar nome do
ficheiro

Se

Print, sim existe ficheiro ,


filesize

Solicita o blocos de dados em


bytes?

Print : Bloco de dados

Guardar o bloco de dados no disco

Existe, envia
sim, filesize

No existe

Ler bloco de dados

Envia bloco de dados

Envia o centedo do
ficheiro

Guardar o ficheiro no disco

Termina a ligao

Figura 1 Protocolo de comunicao entre o cliente e o servidor


11

5. Proposta da soluo
1. Iniciar o servidor, fica espera de pedidos de ligao;
2. O cliente faz pedido de ligao, enviando nome do ficheiro, aguardando a
confirmao da existncia do ficheiro e o tamanho do ficheiro. Caso no o exista
no servidor, servidor envia uma notificao ao cliente diz no existe o ficheiro e
o programa cliente termina a ligao;
3. Caso exista o ficheiro, O cliente dever solicitar os blocos de dados do ficheiro,
guardando-o no seu disco local;
4. O servidor dever enviar os blocos de dados ao cliente;
5. Para ter maior eficincia, o servidor dever enviar o contedo do ficheiro de n
bytes por cada bloco;
6. O cliente ler n bytes e guardando-o no ficheiro no seu disco local.
7. A ligao dever ser terminada

6. Implementao da Aplicao
Na prtica criamos trs projetos so cliente, servidor e objetos remoto (classe
implementada a interface serializable). Como vimos a estrutura dos projetos na
figura 1

Figura 2 Estrutura dos projetos.

12

6.1.

Implementao a Classe FicheiroRemoto com Interface


Serializable

Para que instncias de classe FicheiroRemoto possam ser enviada e recebidas por
servidores e cliente precisa que sejam serializveis. Para isto, devemos declarar a
classe como implementando o interface serializable.
A classe FicheiroRemoto tem vrios methods so:
o Mtodo para confirmar a existncia de ficheiro;
o Mtodo para devolver o tamanho do ficheiro, blocos de dados,

o Mtodos para imprimir as informaes do ficheiro.

Figura 3 Classe implementa a interface serializable

Servidor
Basicamente o servidor singlethreaded e multithreaded tem a implementao
semelhante, h diferena que singlethreaded apenas um cliente por vez pode se
conectar ao servidor enquanto o servidor multithreaded permite vrios clientes podem
estar ligados ao mesmo tempo no servidor.

13

6.2.

SingleThreaded

O servidor singlethreaded tem dois mtodos. O mtodo main() que representa o fluxo
principal do servidor e mtodo processConnection(Socket con) ser responsvel por
processar uma nica conexo com um cliente.
O mtodo main() cria uma instancia de ServerSocket que ser responsvel por esperar a
ligao do cliente, tambm contem um ciclo infinito while(true) onde o servidor ficar
aguardar a ligao do cliente. Quando um cliente se conectar a este servidor, o mtodo
accept() da classe ServerSocket criar uma instncia de Socket para a efetuar a
comunicao com cliente, e prosseguir a execuo do lado do servidor.
Assim quando uma ligao do cliente for aceita, o mtodo processConnection(Socket
con) ser executado usando como argumento a instncia recm criada da classe Socket,
corresponde conexo com cliente. No mtodo main() ainda temos os blocos cathc()
responsveis pelo processamento das excees que podem ocorrer neste mtodo.
BindException que ser executado caso o endereo desejado j esteja em uso por outro
servio e IOException que ser criada caso ocorra algum erro de entrada ou sada.

public class ServidorDeFicheiroSingleThreaded


{
private static final int port = 8090 ;
FicheiroRemoto fr = null;
public static void main(String[] args)
{
ServidorDeFicheiroSingleThreaded s = new ServidorDeFicheiroSingleThreaded();
ServerSocket server = null;
try{
// Criar a instncia de serverSocket que poder responder por solicitaes
server = new ServerSocket(port);
Socket connection = null;
System.out.println("\t\tServidor SingleThreaded de Ficheiro Local.");
System.out.println("\t\t==========================================");
// O servidor espera as conexes
while(true){
System.out.println("A Espera de ligacao....... ");
connection = server.accept();
System.out.println("\tA ligacao estabelecida " + connection );
// .. O servidor a processa.
s.processConnection(connection);
connection.close();
} // End while
....
...
// gera excepes..
...
...
} // end main

14

Mtodo processConnection(Socket con)


Este mtodo ser responsvel por processar uma nica ligao com este servidor. Este
mtodo

executa

aps

mtodo

accept()

executado.

mtodo

processeConnection(Socket com) criar objectInputStream e ObjectOutputStream para


enviar ou receber objetos respetivamente, DataInputStream e DataOutputStream que
capaz de enviar e receber sequncia de caracteres. Nos utilizamos DataInputStream inLocal
= new DataInputStream(new FileInputStream(select));

para ler todos os bytes do ficheiro

pedido, enviando-os para o cliente. Para maior eficincia, vamos ler e enviar os dados
em blocos de 25 bytes.
private void processConnection(Socket con)
{
String pasta = "C:/Origem";
File dir = new File(pasta);
ObjectInputStream serverInstream = null;
ObjectOutputStream serverOutstream = null;

try
{
serverInstream = new ObjectInputStream(con.getInputStream());
serverOutstream = new ObjectOutputStream(con.getOutputStream());
DataOutputStream dos = new DataOutputStream(con.getOutputStream());
fr = (FicheiroRemoto) serverInstream.readObject();
fr.existFile(fr.getFileName(), dir);
serverOutstream.writeObject(fr); // server Sends objects to client
// Abrir o ficheiro local
if(fr.exisFile())
{
File select = new File(fr.getAbsPathFile());
DataInputStream inLocal = new DataInputStream(new
FileInputStream(select));
// para maior eficient vamos ler ou enviar os blocos de dados de 25 bytes.
byte[] arrayInBytes = new byte[fr.getDatainBytes()];
while(true)
{
// tentamos ler at 25 bytes do ficheiro
int result = inLocal.read(arrayInBytes, 0, fr.getDatainBytes());
if( result == -1) break;
// Escreve apenas os bytes lidos
dos.write(arrayInBytes, 0, result);
}

15

6.3.

MultiThreaded

O servidor mutlithreaded tem algo comum com a implementao do servidor


singlethreaded nomeadamente pedido de ligao, gerar excees, etc. O principal meta
deste servidor permite de atender mltiplas requisies simultneas dos clientes. Para
isso utilizamos linha de execuo (Threads). Basicamente threads permitem que
aplicaes executam mais de uma tarefa de forma aparentemente ao mesmo tempo.
Continuamos com uma aplicao que tem um nico mtodo main(). Durante a execuo
deste mtodo, criar vrias instncias de classes que podem ser executadas
concorrentemente.
ServidorFicheiroConnection oneconnection = new ServidorFicheiroConnection(connection,
numConnections, this);
new Thread(oneconnection).start();

6.4.

Cliente

O cliente tem dois mtodos:


O mtodo communicate() tenta fazer ligao ao servidor, quando a ligao
estabelecida, fazer pedido, o nome do ficheiro pretendido, caso existe o ficheiro no
servidor copia-lo e guardando-o no seu disco local e termina a ligao.
public class ClienteDeFicheiro
{
private static final int port =8090 ;
private static final String host = "127.0.0.1";
private static void communicate()
{
///------------} // end communicate
// Main Program
public static void main(String[] args)
{
communicate();
}
} // end class

16

7. Resultado Obtidos Teste da Aplicao desenvolvida


7.1.

Servidor SingleThread

Servidor

Figura 4 Servidor fica a esperar a ligao

Cliente:

Figura 5 Aplicao cliente est a iniciar

Servidor:

Figura 6 Servidor, A ligao estabelecida, usando endereo local 127.0.0.1, escuta na


porta 6192, porta local de 8090

17

Cliente:

Figura 7 Cliente solicitou o existe no servidor, o servidor devolve o tamanho do


ficheiro e a mensagem de confirmao, de seguir copia 25 bytes e guardando no seu
disco local e programa termina.

Servidor:

Figura 8 o Servidor fica esperando outro pedido.

Cliente:

Figura 9 Cliente solicita um ficheiro que no exista no servidor

18

7.2.

Servidor MultiThreaded

Figura 10 Servidor Multithreaded a ligao estabelecida com cliente 1, endereo local,


porta 6231, localport 8090.

Cliente:

Figura 11 Transferncia de ficheiro de servidor para o cliente

Servidor:

Figura 12 Ligao estabelecida com Cliente 1 e Cliente 2

19

Concluso

A camada de transporte o protocolo que oferecer um comunicao lgica entre


processos das aplicaes, tal como cliente e servidor em que a execuo em diferente
hosts. O protocolo TCP um protocolo orientao a conexo, permite criar uma
conexo virtual entre dois TCPs do (cliente e servidor) para trocar os dados. Este
protocolo permite garantir a integridade do fluxo de dados, garantir a entrega dos
pacotes um determinado aplicao de destino, modo de comunicao full-duplex.
O protocolo UDP um protocolo mais simples e por si s, no fornece garantia
na entrega pacotes, Servio sem conexo significa que cada datagrama de utilizador
enviado pelo protocolo UDP datagrama independente, no implementa Controlo de
Fluxo e de erros.
singleThread, um processo suporta apenas um programa no seu espao de
endereamento e apenas uma instruo do programa executada.
O servidor multithread ou servidor concorrente deve ser capaz de atender vrios
clientes simultaneamente.
A compreenso e utilizao das classes ou objetos dos pacotes da linguagem Java
nomeadamente java.io, java.net foram essenciais para sucesso do nosso trabalho e
desenvolvimento da aplicao em rede.

20

Bibliografia
Elliotte Rusty Harold, Java Network Programming, 4th Ed.;
Paul Deitel, Harvey Deitel, Java How To Program 9th Ed.
https://pt.wikipedia.org/wiki/User_Datagram_Protocol
https://pt.wikipedia.org/wiki/Transmission_Control_Protocol
https://gist.github.com/CarlEkerot/2693246
http://www.java2s.com/Code/Java/NetworkProtocol/ServerSocketandSocketforSerializableobject.htm
http://beginnersbook.com/2013/03/multithreading-in-java/

21

You might also like