4 ANÁLISE E ESPECIFICAÇÃO DO SISTEMA
5.4 I MPLEMENTAÇÃO DO SISTEMA DE DISTRIBUIÇÃO DO LVD
5.4.1 Cliente e Servidor Java TCP
Os sockets, da linguagem Java, são criados por um conjunto de classes do pacote
java.net. Na conexão TCP, o cliente e o servidor são oriundos de classes diferentes. O
servidor usa a classe ServerSocket para “escutar” uma porta de rede da máquina a espera de requisições de conexão, sendo assim, o seu construtor possui como um de seus parâmetros o número desta porta.
O cliente, por sua vez, deve conhecer em qual máquina o servidor está sendo executado e a porta a qual ele está escutando. Neste contexto, o cliente utiliza a classe Socket para requisitar conexão a um servidor específico e então transmitir dados. O seu construtor tem como parâmetros o endereço IP do servidor e a porta escutada.
O servidor usa o método accept() para bloquear a execução e aguardar até que um cliente requisite conexão. Uma vez recebida à conexão o servidor responde ao cliente, e então é criado um fluxo de conexão.
No modelo de fluxos (streams) dos sockets utilizam-se dois fluxos: um de entrada e outro de saída, criados a partir das classes InputStream e OutputStream, respectivamente. Um processo envia dados a outro quando escreve em um fluxo de saída associado a um socket. E um processo recebe dados escritos por outro processo lendo um fluxo de entrada associado a um socket.
Para encerrar a conexão tanto cliente quanto servidor utilizam o método close(). A Figura 5.32 ilustra os processos de estabelecimento de conexão, troca de informação e encerramento de conexão em sockets cliente e servidor.
Figura 5.32: Sockets cliente e Servidor.
Considerando o funcionamento dos sockets TCP implementou-se os serviços do cliente e servidor para o LVD. Para tanto, foram desenvolvidas duas classes denominadas
Client e Server, que são responsáveis pelas etapas de estabelecimento e encerramento da
conexão do cliente e o servidor, respectivamente. Estas classes também possuem a função de gerar uma interface gráfica para que o usuário realize estas tarefas.
A Figura 5.33 apresenta a interface gerada pela classe Server.
Figura 5.33: Interface de estabelecimento e encerramento de conexão do servidor.
Por meio da interface Server o usuário pode executar o servidor em uma determinada máquina, clicando no botão “Start”. Esta ação coloca o servidor em espera por uma requisição de conexão de um cliente. Pode-se observar que o servidor deve ser executado antes de do cliente para aguardar a esta requisição.
A interface apresenta ainda uma barra de status, que oferece as informações: “Waiting...”, que indica a espera de uma ação do usuário ou de uma requisição de conexão de um cliente; “Conected”, aponta que o servidor está conectado a algum cliente; “Disconected”, indica que a conexão foi rompida pelo cliente.
Caso o usuário queira encerrar o servidor basta fechar a interface Server clicando no botão de fechamento da janela. A Figura 5.34 apresenta o trecho de código que implementa a classe Server.
Figura 5.34: Trecho de código da classe Server.
A classe Server deve ser a primeira executada em um programa, garantido a possibilidade de conexão ao usuário e todas as funcionalidades do sistema. Em termos de implementação, o desenvolvedor pode optar por chamá-la em uma aplicação isolada ou em uma aplicação similar a um cliente, no caso deste trabalho uma aplicação do LVD. Sendo que, logo após a sua chamada, em ambos os casos, deve-se implementar os respectivos recursos para promover a troca de informações.
No desenvolvimento deste projeto optou-se por chamar a classe Server dentro de uma aplicação do LVD, com intuito de minimizar a quantidade de janelas que devem ser manipuladas e as ações realizadas pelo usuário para colocar o sistema em funcionamento.
Para garantir que a classe Server seja chamada antes de qualquer execução, ela foi declarada dentro da função public void initialize() da classe principal do Transmissor Java conectado ao respectivo LVD. Esta função executa todo o procedimento em seu interior no momento em que o ambiente está sendo carregado. O resultado deste processo é ilustrado na Figura 5.35.
Figura 5.35: Aplicação do LVD chamando a classe Server.
Caso o usuário feche a interface Server, o ambiente LVD associado a ela continua sendo executado normalmente, mas de maneira local, assim como os outros ambientes conectados a ele. É importante ressaltar que adotando ou não esta estratégia o sistema continua trabalhando de acordo com a arquitetura desenvolvida.
A interface referente à classe Client encontra-se ilustrada na Figura 5.36.
A interface do cliente possui um campo no qual o usuário pode digitar o endereço IP da máquina onde o servidor está sendo executado. Ao pressionar a tecla “Enter” do teclado o cliente requisita conexão ao servidor, que responde a requisição, e deste modo à conexão é estabelecida e a troca de informações pode ser iniciada. A interface apresenta ainda uma barra de status que oferece as mesmas informações que a barra de status da interface Server: “Waiting...”, “Conected” e “Disconected”. Caso o usuário queira desconectar o cliente, basta fechar a interface Client clicando no botão de fechamento da janela. Após esta ação o ambiente LVD associado a esta interface passa a trabalhar localmente.
Diferentemente da classe Server a classe Client obrigatoriamente deve ser associada a uma aplicação do LVD e neste projeto optou-se por declará-la dentro da função public void
initialize() da classe principal do Transmissor Java conectado ao respectivo LVD. Neste
contexto, o resultado de execução de um cliente é similar ao apresentado na Figura 5.35, porém, o usuário visualiza a interface Client ao invés da Server. O código da classe Client é análogo ao da classe Server, mudando apenas alguns componentes Java de interface e os componentes de conexão apresentados na Figura 5.37.
Figura 5.37: Trecho de código da classe Client.
Os objetos input e output declarados nos códigos das classes Server e Client referem- se às classes InputStream e OutputStream e são usados na classe Transmissor para a troca de informações. A classe transmissor e os algoritmos criados para otimizar esta troca de informações são apresentados na próxima seção.