ISUTIC 2017Mostramos como criar e manipular socket de fluxo e ... como um argumento para o método...
Transcript of ISUTIC 2017Mostramos como criar e manipular socket de fluxo e ... como um argumento para o método...
Programação com Sockets
Docente: MSc. Angel Alberto Vazquez Sánchez
ISUTIC2017
Bibliografía
● Deitel, H. M. & Deitel, H. Java: How to Program (Late Objects). (Pearson Education Limited, 2014), Chapter 27 Networking.
Introdução
● O Java oferece uma série de recursos de rede integrados que facilitam o desenvolvimento de aplicativos baseados na Internet e na web.
● O Java pode permitir que os programas busquem no mundo informações e colaborem com programas que funcionam em outros computadores a nível internacional, nacional ou apenas dentro de uma organização (sujeito a restrições de segurança).
Introdução
● As capacidades fundamentais de rede da Java são declaradas pelas classes e interfaces do pacote java.net, através das quais o Java oferece comunicações baseadas em fluxo que permitem que as aplicações vejam a rede como fluxos de dados.
● As classes e interfaces do pacote java.net também oferecem comunicações baseadas em pacotes para a transmissão de pacotes individuais de informações - comumente usado para transmitir imagens de dados, áudio e vídeo pela Internet.
● Nesta classe, mostramos como se comunicar com pacotes e fluxos de dados.
Introdução
● Concentramo-nos em ambos os lados da relação cliente / servidor.– O cliente solicita que alguma ação seja executada e o servidor
executa a ação e responde ao cliente.
– Uma implementação comum do modelo de solicitação-resposta é entre navegadores da web e servidores web. Quando um usuário seleciona um site para navegar através de um navegador (o aplicativo cliente), uma solicitação é enviada para o servidor web apropriado (o aplicativo do servidor).
– O servidor normalmente responde ao cliente enviando uma página da Web adequada para ser processada pelo navegador.
Introdução
● Apresentamos as comunicações baseadas em socket de Java, que permitem que as aplicações vejam a rede como se fosse um arquivo I/O - um programa pode ler de um socket ou escrever em um socket, assim como ler de um arquivo ou gravar em um arquivo.
● O socket é simplesmente uma construção de software que representa um ponto final de uma conexão.
● Mostramos como criar e manipular socket de fluxo e datagramas.
Introdução
● Com sockets de fluxo, um processo estabelece uma conexão com outro processo. Enquanto a conexão está em vigor, os fluxos de dados entre os processos em fluxos contínuos.
● É dito que os sockets de fluxo fornecem um serviço orientado a conexão. O protocolo usado para transmissão é o popular TCP (Transmission Control Protocol).
Introdução
● Com sockets de datagrama, pacotes de informações individuais são transmitidos.
● O protocolo utilizado - UDP, o protocolo de datagrama do usuário - é um serviço sem conexão e não garante que os pacotes chegam em qualquer ordem específica. Com UDP, pacotes podem ser perdidos ou duplicados. É necessária uma programação adicional significativa na sua parte para lidar com esses problemas (se você optar por fazê-lo).
● UDP é o mais apropriado para aplicativos de rede que não exigem verificação de erros e confiabilidade de TCP
● Os sockets de fluxo e o protocolo TCP serão mais desejáveis para a grande maioria dos aplicativos de rede Java.
Manipulando URLs
● A Internet oferece vários protocolos.– O HyperText Transfer Protocol (HTTP), que é a base da web, usa
URIs (Uniform Resource Identifiers) para identificar dados na Internet.
● URIs que especificam as localizações de sites e páginas da web são chamados de URLs (Uniform Resource Locators).– Os URLs comuns referem-se a arquivos ou diretórios e podem fazer
referência a objetos que executam tarefas complexas, como pesquisas de banco de dados e pesquisas na Internet.
● Se você conhece o URL de uma página da Web acessível ao público, você pode acessá-lo através do HTTP.
Manipulando URLs
● O Java facilita a manipulação de URLs. Quando você usa um URL que se refere à localização exata de um recurso (por exemplo, uma página da web) como um argumento para o método showDocument da interface AppletContext, o navegador no qual o applet está sendo executado acessará e exibirá esse recurso.
● O applet na Figura demonstra recursos de rede simples.– Permite ao usuário selecionar uma página da Web a partir de uma
JList e faz com que o navegador exiba a página correspondente. Neste exemplo, a rede é realizada pelo navegador.
Manipulando URLs
Processando Parâmetros do Applet
● Este applet tira proveito dos parâmetros do applet especificados no documento HTML que invoca o applet.
● Ao navegar na web, muitas vezes você encontrará aplicativos que estão no domínio público - você pode usá-los gratuitamente em suas próprias páginas da web (normalmente em troca de creditar o criador do applet).
● Muitos applets podem ser personalizados através de parâmetros fornecidos pelo arquivo HTML que invoca o applet.
Processando Parâmetros do Applet
● O documento HTML contém oito parâmetros especificados com o elemento param - essas linhas devem aparecer entre as tags do applet inicial e final.
● O applet pode ler esses valores e usá-los para personalizar. Qualquer número de elementos param pode aparecer entre as tags do applet inicial e final.
● Cada parâmetro tem um nome exclusivo e um valor. O método Applet getParameter retorna o valor associado a um nome de parâmetro específico como String.
Processando Parâmetros do Applet
● O argumento passado para getParameter é uma String contendo o nome do parâmetro no elemento param.– Neste exemplo, os parâmetros representam o título e a localização
de cada site que o usuário pode selecionar.
– Os parâmetros especificados para este applet são denominados title#, onde o valor de # é iniciado em 0 e aumenta em 1 para cada novo título.
– Cada título deve ter um parâmetro de localização correspondente da localização do formulário #, onde o valor de # começa em 0 e aumenta em 1 para cada nova localização.
Processando Parâmetros do Applet
● A declaração
obtém o valor associado ao parâmetro "title0" e atribui-lo ao título de referência. Se não houver uma etiqueta de param contendo o parâmetro especificado, getParameter retorna nulo.
Armazenando os Nomes e URLs do site
● O applet obtém do documento HTML as escolhas que serão exibidas no JList do applet.
● Class SiteSelector usa um HashMap (pacote java.util) para armazenar os nomes e URLs do site.– Neste exemplo, a chave é a String no JList que representa o nome
do site e o valor é um objeto de URL que armazena a localização do site para exibir no navegador.
Armazenando os Nomes e URLs do site
● Class SiteSelector também contém um ArrayList (pacote java.util) no qual os nomes dos sites são colocados para que eles possam ser usados para inicializar o JList (uma versão do construtor JList recebe uma matriz de Objetos que é retornada pelo método ArrayList toArray).
● Um ArrayList é uma matriz de referências dinamicamente redimensionável. Class ArrayList fornece o método add para adicionar um novo elemento ao final do ArrayList.
Lendo um arquivo em um servidor da Web
● A próxima aplicação usa o componente GUI da Swing JEditorPane (do pacote javax.swing) para exibir o conteúdo de um arquivo em um servidor web.
● O usuário insere uma URL no JTextField na parte superior da janela e o aplicativo exibe o documento correspondente (se existir) no JeditorPane.
● A classe JEditorPane é capaz de renderizar texto simples e texto formatado HTML, conforme ilustrado nas duas capturas de tela, de modo que este aplicativo atua como um navegador web simples.
Lendo um arquivo em um servidor da Web
● O aplicativo também demonstra como processar HyperlinkEvents quando o usuário clica em um hiperlink no documento HTML.
● As técnicas mostradas neste exemplo também podem ser usadas em applets.
● No entanto, um applet é permitido ler arquivos apenas no servidor do qual foi baixado.
Estabelecimento de um servidor simples usando o Stream Sockets
● Os dois exemplos discutidos até agora utilizam capacidades de rede Java de alto nível para se comunicar entre aplicativos.
● Nos exemplos, não era sua responsabilidade estabelecer a conexão entre um cliente e um servidor.– O primeiro programa baseou-se no navegador da Web para se
comunicar com um servidor web.
– O segundo programa dependia de um JEditorPane para executar a conexão.
● Esta seção começa nossa discussão sobre a criação de seus próprios aplicativos que podem se comunicar entre si.
Etapa 1: Criar um ServerSocket
● Estabelecer um servidor simples em Java requer cinco etapas. O Passo 1 é criar um objeto ServerSocket.
● Uma chamada para o construtor do ServerSocket, como
registra um número de porta TCP disponível e especifica o número máximo de clientes que podem esperar para se conectar ao servidor (ou seja, o comprimento da fila).
Etapa 1: Criar um ServerSocket
● O número da porta é usado pelos clientes para localizar o aplicativo do servidor no computador servidor.
● Isso geralmente é chamado de ponto de agitação manual. Se a fila estiver cheia, o servidor recusa as conexões do cliente.
● O construtor estabelece a porta onde o servidor espera conexões de clientes - um processo conhecido como vinculação do servidor para a porta.
● Cada cliente pedirá para se conectar ao servidor nesta porta.● Apenas um aplicativo por vez pode ser vinculado a uma porta
específica no servidor.
Etapa 2: aguarde uma conexão
● Programas gerenciam cada conexão de cliente com um objeto Socket. Na Etapa 2, o servidor escuta indefinidamente (ou blocos) para uma tentativa de um cliente se conectar.
● Para ouvir uma conexão de cliente, o programa chama o método ServerSocket aceitar, como em
que retorna um Socket quando uma conexão com um cliente é estabelecida.● O Socket permite que o servidor interaja com o cliente. As interações com o
cliente realmente ocorrem em uma porta de servidor diferente do ponto de handshake. Isso permite que a porta especificada na Etapa 1 seja usada novamente em um servidor multithread para aceitar outra conexão de cliente.
Passo 3: Obter os fluxos de E/S do Socket
● O Passo 3 é obter os objetos OutputStream e InputStream que permitem que o servidor se comunique com o cliente enviando e recebendo bytes.
● O servidor envia informações para o cliente através de um OutputStream e recebe informações do cliente através de um InputStream.– O servidor invoca o método getOutputStream no Socket para obter
uma referência ao OutputStream do Socket e
– invoca o método getInputStream no Socket para obter uma referência ao InputStream do Socket.
Passo 3: Obter os fluxos de E/S do Socket
● Os objetos de fluxo podem ser usados para enviar ou receber bytes individuais ou seqüências de bytes com a escrita do método OutputStream e o método InputStream lido, respectivamente.
● Muitas vezes, é útil enviar ou receber valores de tipos primitivos (por exemplo, int e double) ou Objetos serializáveis (por exemplo, Strings ou outros tipos serializáveis) em vez de enviar bytes.
● Nesse caso, podemos usar as técnicas para enrolar outros tipos de fluxo (por exemplo, ObjectOutputStream e ObjectInputStream) em torno do OutputStream e InputStream associados ao Socket.
Passo 3: Obter os fluxos de E/S do Socket
● Por exemplo:
Passo 3: Obter os fluxos de E/S do Socket
● A beleza de estabelecer essas relações é essa– Seja qual for o servidor escreve para o ObjectOutputStream é
enviado via OutputStream e está disponível no InputStream do cliente,
– e o que o cliente escreve para o OutputStream (com um ObjectOutputStream correspondente) está disponível através do InputStream do servidor.
● A transmissão dos dados através da rede é perfeita e é completamente processada por Java.
Etapa 4: executar o processamento
● O Passo 4 é a fase de processamento, no qual o servidor e o cliente se comunicam através dos objetos OutputStream e InputStream.
Etapa 5: Feche a conexão
● Na Etapa 5, quando a transmissão estiver completa, o servidor fecha a conexão invocando o método de fechamento nos fluxos e no Soquete.
Estabelecimento de um cliente simples usando tomadas de fluxo
Estabelecer um cliente simples em Java requer quatro etapas:● Passo 1: Criar um soquete para conectar-se ao servidor● Passo 2: Obter o Socket I / O Streams● Passo 3: executar o processamento● Passo 4: Feche a conexão
Passo 1: Criar um socket para conectar-se ao servidor
Na Passo 1, criamos um Socket para conectar-se ao servidor. O construtor Socket estabelece a conexão.
Por exemplo, a afirmação:
usa o construtor Socket com dois argumentos: o endereço do servidor (endereço do servidor) e o número da porta.
Passo 2: Obter os fluxos de E/S do Socket
Na Passo 2, o cliente usa métodos Socket getInputStream e getOutputStream para obter referências ao Socket InputStream e OutputStream.
Se o servidor estiver enviando informações sob a forma de tipos reais, o cliente deve receber as informações no mesmo formato.
Assim, se o servidor envia valores com um ObjectOutputStream, o cliente deve ler esses valores com um ObjectInputStream.
Passo 3: efectuar o processamento
● O Passo 3 é a fase de processamento em que o cliente e o servidor se comunicam através dos objetos InputStream e OutputStream.
Passo 4: Feche a conexão
● Na Passo 4, o cliente fecha a conexão quando a transmissão é concluída invocando o método de fechamento nos fluxos e no Soquete.
● O cliente deve determinar quando o servidor terminar de enviar informações para que ele possa ligar perto para fechar a conexão Socket.
● Por exemplo, o método InputStream read retorna o valor -1 quando ele detecta o fim do fluxo (também chamado de EOF-fim de arquivo).
● Se um ObjectInputStream lê informações do servidor, uma EOFException ocorre quando o cliente tenta ler um valor de um fluxo no qual o fim do fluxo é detectado.
Interação Cliente / Servidor com Conexões Socket Stream
● Nos próximos exemplos, usamos sockets de fluxo, ObjectInputStream e ObjectOutputStream para demonstrar um aplicativo de bate-papo cliente / servidor simples.
● O servidor aguarda uma tentativa de conexão com o cliente.● Quando um cliente se conecta ao servidor, o aplicativo do
servidor envia ao cliente um objeto String (lembre-se de que as Strings são objetos Serializable) indicando que a conexão foi bem-sucedida.
● Em seguida, o cliente exibe a mensagem.
Client/Server Interaction with Stream SocketConnections
● Os aplicativos de cliente e servidor fornecem campos de texto que permitem ao usuário digitar uma mensagem e enviá-la para o outro aplicativo.
● Quando o cliente ou o servidor envia a String "TERMINAR", a conexão termina.
● Em seguida, o servidor espera que o próximo cliente se conecte
Server Class
Server Class
Server Class
Server Class
Server Class
Server Class
Server class
Server class
Server class
Server class
Server class
Server Class
O construtor do servidor cria a GUI do servidor, que contém um JTextField e um JTextArea.
O servidor exibe sua saída no JTextArea.
Quando o método principal (linhas 6-11) é executado, ele cria um objeto Servidor, especifica a operação de fechamento padrão da janela e o método de chamadas runServer (linhas 57-86).
Client Class
● Como o servidor da classe, o construtor do cliente da classe (linhas 29-56) cria a GUI do aplicativo (um JTextField e um JTextArea).
● O cliente exibe sua saída na área de texto.● Quando o método principal (linhas 7-19) é executado, cria uma
instância de classe Cliente, especifica a operação de fechamento padrão da janela e o método de chamadas runClient (linhas 59-79).
● Neste exemplo, você pode executar o cliente a partir de qualquer computador na Internet e especificar o endereço IP ou o nome do host do computador servidor como um argumento de linha de comando para o programa.
Client Class
● Por exemplo, o comando
java Client 192.168.1.15● tenta se conectar ao Servidor no computador com o endereço
IP 192.168.1.15.
Client Class
Client Class
Client Class
Client Class
Client Class
Client Class
Client Class
Client Class
Client Class
Client Class
Client class
Client class
Client class
Conclusões