Baixe o app para aproveitar ainda mais
Prévia do material em texto
Prof. Ítalo Quirino Brilhante Não existe distinção entre clientes e servidores em uma arquitetura de objetos distribuídos; Cada entidade é um objeto que fornece serviços para outros objetos e recebe serviços de outros objetos; Os objetos se comunicam através de um sistema de middleware chamado “requisitor de objetos”. É o processo de explorar grandes quantidades de dados à procura de padrões consistentes, como regras de associação ou sequências temporais, para detectar relacionamentos sistemáticos entre variáveis, detectando assim novos subconjuntos de dados. Este é um tópico recente em ciência da computação, porém faz uso de várias técnicas de: ◦ Estatística; ◦ Recuperação de Informações; ◦ Inteligência Artificial; ◦ Reconhecimento de Padrões. A mineração de dados é formada por um conjunto de ferramentas e técnicas que através do uso de algoritmos de aprendizagem, são capazes de explorar um conjunto de dados, ajudando a evidenciar padrões nestes dados e auxiliando na descoberta de conhecimento. Este conhecimento pode ser apresentado por estas ferramentas de diversas formas: agrupamentos, hipóteses, regras, árvores de decisão e grafos. O ser humano sempre aprendeu observando padrões, formulando hipóteses e testando-as para descobrir regras. A novidade da “era do computador” é o volume enorme de dados que não pode mais ser examinado à procura de padrões em um prazo razoável. A solução é instrumentalizar o próprio computador para detectar relações que sejam novas e úteis. A mineração de dados surge para esta finalidade e pode ser aplicada tanto para a pesquisa científica como para impulsionar a lucratividade da empresa madura, inovadora e competitiva. A Arquitetura de Objetos Distribuídos é a mais adequada para permitir que a mineração de dados possa ser realizada e um novo conhecimento possa ser gerado. Exemplos middleware para objetos distribuídos: ◦ CORBA; ◦ RMI; ◦ DCOM. É um canal de comunicação entre duas máquinas por determinadas aplicações comunicando entre si; Em uma conexão via Socket, sempre existe um computador servidor e um computador cliente. Todavia, uma mesma máquina pode exercer ambos os papéis. O computador servidor abre uma porta de comunicação, executando “listening”, até que um computador cliente tente realizar uma conexão; 1- Cria um Socket de escuta (listening) em uma determinada porta; 2 – Processa requisições de conexões, cria o Socket com a máquina cliente; 3 – Processa o pedido de fluxo; 4 – Utiliza o fluxo, conversa com a outra máquina; 5 – Fecha o fluxo; 6 – Fecha o Socket. 1- Cria a conexão, cria um socket com algum servidor; 2 – Cria um fluxo de comunicação no socket; 3 – Utiliza o fluxo, conversa com a outra máquina; 4 – Fecha o fluxo; 5 – Fecha o Socket. Apenas existe comunicação entre duas máquinas se houver conexões de entrada e saída estabelecidas entre os dois computadores, através de uma determinada porta do computador de origem à uma porta do computador de destino. Construtores: ◦ Socket (String, int); Métodos: ◦ OutputStream getOutputStream( ) – Retorna a saída do fluxo do Socket; ◦ InputStream getInputStream( ) – Retorna a entrada do fluxo do Socket; ◦ close( ) – Fecha o Socket. Construtores: ◦ ServerSocket (int porta); - Porta que ficará em escuta; Métodos: ◦ accept( ) – Aguarda conexão na porta em escuta; ◦ close( ) – Fecha o Socket. Temos dois tipos de serviços de transporte via socket: o confiável orientado a cadeia de bytes e os datagramas não confiáveis. O protocolo na qual é implementado o primeiro é o TCP, já o segundo é implementado no protocolo UDP. Inicialmente o cliente deve contatar o servidor. Para isso, o processo servidor já deve estar executando o programa antes de ser contatado, além de já ter criado o socket que aceita o contato do cliente. O cliente contata o servidor criando um socket TCP local e especifica o endereço IP e o número da porta do processo servidor. Quando o servidor é contatado, ele cria um novo socket para se comunicar com o cliente, permitindo assim a liberação do socket de “boas-vindas” para que possa ser contatado por outros clientes. No início do programa, deverá ser inserida a linha seguinte, que importa a biblioteca que contém as classes que são utilizadas em uma aplicação com Socket (java.net.*) e as classes de recepção de informação do teclado ou Socket do cliente ou servidor (java.io.*). import java.net.*; Import java.io.*; Criamos um objeto socket, que é o socket do lado do servidor, número_da_porta deverá ser substituído pelo número da porta pela qual a aplicação cliente usará para conectar com o servidor. Este socket esperará a requisição de conexão de um cliente. ServerSocket bemVindoSocket = new ServerSocket(numero_da_porta); Como o programa servidor normalmente fica funcionando por tempo indefinido, coloca-se o restante das instruções dentro de um loop infinito, como segue: while (true) { } A próxima instrução cria um objeto conexaoSocket do tipo Socket quando um cliente conectar ao servidor. O TCP se encarregará de criar uma conexão virtual direta entre este socket e o socket do cliente de forma que todos os bytes serão enviados ao servidor na ordem certa. Socket conexaoSocket = bemVindoSocket.accept(); No caso do envio de um objeto do tipo String do cliente para o servidor, utilizamos as seguintes instruções para receber os dados do cliente: BufferedReader cadeiaCliente = new BufferedReader (new InputStreamReader (conexaoSocket.getInputStream()); DataOutputStream servidorParaCliente = new DataOutputStream (conexaoSocket.getOutputStream()); String clienteSentenca = cadeiaCliente.readLine(); Depois de processar a informação enviada pelo cliente, queremos enviar um outro objeto (mensagem_para_cliente) do tipo String de volta para o cliente, como um mensagem de dado recebido ou algo do tipo. //transforma a linha em maiúsculas sentencaCapturada = clienteSentenca.toUpperCase() + "\n"; //envia a linha maiúscula para o cliente servidorParaCliente.writeBytes (sentencaCapturada); Com isso termina-se o programa do lado do servidor. Agora analisaremos o programa cliente; Como no caso do programa servidor, o código inicia com a importação das bibliotecas que contém as classes de sockets e de envio de informações. import java.io.*; import java.net.*; Primeiramente, criamos o socket que conectará com o servidor. O primeiro parâmetro passado ao construtor é o nome do servidor, por exemplo, 127.0.0.1 se a aplicação servidor estiver rodando no mesmo computador que a aplicação cliente. O segundo parâmetro é o número da porta que é informado ao socket servidor. //cria o stream do teclado BufferedReader cadeiaUsuario = new BufferedReader(new InputStreamReader(System.in)); //cria os streams (encadeamentos) de entrada e saída com o servidor Socket clienteSocket = new Socket("localhost", 6789); Após a criação do socket cliente, temos que criar os objetos de cadeia que serão ligados ao socket. O objeto clienteParaServidor será a cadeia que enviará informações para o servidor e o objeto cadeiaServidor será a cadeia que receberá informações do servidor. //cria os streams (encadeamentos) de entrada e saída com o servidor DataOutputStreamclienteParaServidor = new DataOutputStream (clienteSocket.getOutputStream()); BufferedReader cadeiaServidor = new BufferedReader (new InputStreamReader (clienteSocket.getInputStream())); Utilizaremos o mesmo caso do servidor, e enviaremos (sentenca) e receberemos (clienteParaServidor) dois objetos do tipo String para exemplificar. //lê a linha do teclado e coloca em sentença sentenca = cadeiaUsuario.readLine(); //envia a linha para o server clienteParaServidor.writeBytes (sentenca + "\n"); Agora já podemos imprimir o resultado e fechar o socket, e também a conexão TCP entre cliente e servidor. //lê uma linha do server sentencaModificada = cadeiaServidor.readLine(); //apresenta a linha do server na tela System.out.println("Para o servidor " + sentencaModificada); //fecha o cliente clienteSocket.close(); Sockets UDP são mais rápidos que sockets TCP; São mais simples, porém menos confiáveis; Em UDP não é necessário abrir conexão, deste modo a comunicação ocorre apenas com o envio da mensagem; Um mensagem é um datagrama, que é composto de um remetente (sender) e um receptor (receiver) e a mensagem (content). Exercício prático em Java. RPC: Remote Procedure Call; RPC: Chamada Remota de Procedimento; É uma tecnologia de comunicação entre processos que permite a um programa de computador chamar um procedimento em outro espaço de endereçamento (outra máquina ligada em rede). O desenvolvedor não necessita se preocupar com detalhes de implementação da interação remota; Do ponto de vista de código-fonte, a chamada se assemelha a chamadas de procedimentos locais. É uma tecnologia para a implementação do modelo cliente-servidor de computação distribuída; Uma chamada de procedimento remoto é iniciada pelo cliente enviando uma mensagem para um servidor remoto para executar um procedimento específico. Uma resposta é retornada ao cliente. Uma diferença entre chamadas de procedimento remotas e as locais é que a chamada remota pode falhar por problemas de rede. Utilizada pela Xerox em 1981; Na década de 90, a Microsoft desenvolveu o MSRPC, mais tarde sendo desenvolvido o DCOM com base neste; Atualmente utiliza-se XML como linguagem de descrição de interface e HTTP como protocolo de rede para formar web services.
Compartilhar