Programação em rede com Java
Curso:
Engenharia de Controle e Automação
Disciplina:
Disciplina:
Sistemas Distribuídos e Redes de Computadores
Professor:
Programação em rede com Java
Identificação de Hosts (número IP)
o Cada computador conectado a uma rede TCP/IP é chamado de Host e é
identificado por um único número de 32 bits, denominado de número IP.
o O número IP é representado por quatro grupos de 8 bits, limitando desta
forma o valor numérico de cada grupo ao valor máximo de 255.
o Exemplo: o Exemplo:
Programação em rede com Java
Identificação de Processos (Portas)
o A comunicação entre dois processos em uma rede TCP/IP é assimétrica,
no sentido um processo faz o papel de servidor, oferecendo um serviço e outro faz o papel de cliente do serviço.
o Em um único Host vários processos podem estar fazendo o papel de
servidor, oferecendo serviços através de um único meio físico. Portanto, é servidor, oferecendo serviços através de um único meio físico. Portanto, é preciso uma forma de identificar os servidores em um mesmo Host.
o Isto é feito por meio da associação de um número inteiro, chamado de
porta, ao processo servidor.
o Essa associação é feita pelo processo assim que é carregado, por meio de
uma chamada ao sistema.
o O número da porta pode variar de 1 a 65535, no entanto os números de 1 a
Programação em rede com Java
Programação em Rede com Java
o O pacote java.net contém as classes e interfaces usadas para
programação de sistemas em rede com Java
Comunicação básica entre aplicações
o As classes Socket, ServerSocket, DatagramSocket, DatagramPacket e
InetAddress, fornecem os métodos necessários para a comunicação básica entre dois processos
o As classes Socket e ServerSocket são utilizadas para comunicação
orientada à conexão, enquanto que as classes DatagramSocket e DatagramPacket são utilizadas para comunicação não orientada à conexão
Programação em rede com Java
Programação em rede com Java
Java Sockets Orientado a Conexão
o TCP - orientado a conexão
• java.net.Socket
Programação em rede com Java
Java Sockets Orientado a Conexão
o O servidor executa em um computador específico e possui um socket
associado a um número de porta;
o O servidor apenas escuta, aguardando que um cliente solicite o
estabelecimento de uma conexão;
o O cliente deve conhecer em qual máquina o servidor está sendo executado o O cliente deve conhecer em qual máquina o servidor está sendo executado
e a porta no qual ele escuta;
o O servidor aceita a conexão e recebe um novo socket associado à mesma
porta;
o Ele necessita do novo socket para poder continuar escutando no socket
original por requisições de conexão, enquanto atende o cliente já conectado;
Programação em rede com Java
Java Sockets Orientado a Conexão
o Do lado cliente, se a conexão foi aceita, um socket é criado para ser
utilizado na comunicação com o servidor;
o O cliente e o servidor podem agora se comunicar, escrevendo e escutando
em seus respectivos sockets;
o Os dados são enviados e recebidos através de fluxos de entrada e saída. o Os dados são enviados e recebidos através de fluxos de entrada e saída.
Os seguintes métodos são utilizados:
• InputStream getInputStream(): retorna um fluxo de entrada para este socket. • OutputStream getOutputStream(): retorna um fluxo de saída para este socket. o A classe ServerSocket implementa um socket servidor que utiliza conexão.
Um socket servidor espera por requisições que venham da rede. Ele realiza operações baseadas na requisição e possivelmente envia os resultados ao requerente:
Programação em rede com Java
Sockets Clientes
o Topos os programas cliente seguem o mesmo scritp básico:
• 1. Criam a conexão de socket cliente
• 2. Adquirem fluxos de leitura e escrita para o socket
• 3. Utilizam os fluxos de acordo com o protocolo do servidor
• 4. Fecham os fluxos
• 4. Fecham os fluxos
Programação em rede com Java
Sockets Servidores
o Os servidores não criam conexões de forma ativa. Em vez disso, eles
permanecem passivamente aguardando um pedido de conexão de cliente, e depois fornecem seus serviços. Os servidores são criados com o seguinte script:
• 1. Criam o socket servidor e iniciam a escuta.
• 1. Criam o socket servidor e iniciam a escuta.
• 2. Chamam o método accept() para obter novas conexões.
• 3. Criam fluxos de entrada e saída para o socket retornado.
• 4. Conduzem a conversação com base no protocolo combinado.
• 5. Fecham os fluxos e o socket do cliente.
• 6. Voltam ao Passo 2 ou continuam até o Passo 7.
Programação em rede com Java
Programação em rede com Java
Programação em rede com Java
Programação em rede com Java
Agora um exemplo de cliente e servidor de eco, usando
sockets TCP
o Servidor: recebe uma linha do cliente e devolve essa mesma linha para o
cliente.
• Arquivo: ServidorDeEco.java
Cliente: espera o usuário digitar uma linha, envia essa linha para o servidor,
o Cliente: espera o usuário digitar uma linha, envia essa linha para o servidor,
recebe essa linha de volta do servidor e mostra no vídeo.
Programação em rede com Java
Qual o problema na solução anterior?
o Apenas um cliente por vez pode se conectar ao servidor
o Imagine agora que em vez de um servidor de eco, tivéssemos um servidor
de “chat” (bate papo). Vários clientes tinham que estar conectados ao mesmo tempo no servidor
o Para que isso possa ocorrer, a solução é usar a Thread o Para que isso possa ocorrer, a solução é usar a Thread
o A linha de execução inicial dispara outra linha a cada novo cliente e fica
Programação em rede com Java
Threads em Java
o Em Java é possível lançar várias linhas de execução do mesmo programa.
Chamamos a isso de Threads ou MultiThreading
o Vejamos primeiramente um exemplo de execução sequencial
• No próximo exemplo o método f() da classe TesteA é chamado
sequencialmente 5 vezes sequencialmente 5 vezes
Programação em rede com Java
Programação em rede com Java
Threads em Java
o No exemplo a seguir vez de esperar algum tempo (Thread.sleep), o método
f usa efetivamente a CPU contando até 1, 2 e 3 milhões.
o São lançados 3 threads. Cada um deles é interrompido no meio das
Programação em rede com Java
Programação em rede com Java
Um servidor e cliente de chat
o Vamos modificar o servidor/cliente de eco acima, para um servidor/cliente
de chat
o O servidor de chat deve aceitar conexão de um cliente, disparar uma thread
para atender esse cliente e esperar por conexão de um novo cliente
o A thread que atende um cliente específico deve esperar que este envie uma o A thread que atende um cliente específico deve esperar que este envie uma
mensagem e replicar esta mensagem para todos os clientes conectados. Quando esse cliente desconectar a thread deve avisar a todos os clientes conectados que isso ocorreu
o Portanto, é necessário que o servidor guarde em um vetor, todos os
Programação em rede com Java
Um servidor e cliente de chat
o O cliente deve aguardar o usuário digitar uma mensagem no teclado e
enviar essa mensagem ao servidor
o Mas não é tão simples assim. Há um problema: mensagens podem chegar
a qualquer momento no servidor e devem ser mostradas no vídeo. Se você pensou também em thread, acertou
pensou também em thread, acertou
o Um thread é lançada no início e fica esperando qualquer mensagem do
servidor para apresentá-la no vídeo
o A linha de execução principal do cliente se encarrega de esperar uma
mensagem digitada pelo usuário e enviá-la para o servidor
o Exemplos:
• Arquivo: ServidorDeChat.java • Arquivo: ClienteDeChat.java
Programação em rede com Java
Java Sockets Sem Conexão
o UDP - sem conexão
• java.net.DatagramPacket
Programação em rede com Java
Java Sockets Sem Conexão
o Algumas aplicações não requerem o canal seguro de comunicação
ponto-a-ponto provido pelo protocolo TCP
o Nestes casos, a aplicação pode utilizar um modo de comunicação que
entrega pacotes independentes cuja entrega e sequenciamento das mensagens não são garantidos
mensagens não são garantidos
o O protocolo UDP provê este serviço o Classes utilizadas:
• DatagramPacket: insere bytes em um pacote UDP denominado datagrama • DatagramSocket: envia e recebe datagramas UDP
Programação em rede com Java
Java Sockets Sem Conexão
o Para enviar dados, insere-se os mesmos em um DatagramPacket,
enviando-o através do DatagramSocket
o Para receber dados, recebe-se um DatagramPacket através de um
DatagramSocket, procedendo-se em seguida a remoção dos dados a partir do pacote
do pacote
o O mesmo tipo de socket é utilizado tanto no cliente quanto no servidor o Trabalha com pacotes individuais e não com fluxo: os dados enviados em
um datagrama são enviados em um único pacote
Programação em rede com Java
Java Sockets Sem Conexão
o Pacotes datagramas são usados para implementar um serviço de entrega
de pacotes sem conexão
o Cada mesagem é roteada de uma máquina até a outra baseada somente
na informação contida dentro do pacote
o Múltiplos pacotes enviados de uma máquina a outra poderiam ser roteados o Múltiplos pacotes enviados de uma máquina a outra poderiam ser roteados
de uma forma diferente e podem chegar em qualquer ordem
o A entrega de pacotes não é garantida o Classe DatagramPacket
• DatagramPacket(byte[] buf, int length): constrói um pacote de datagrama
Programação em rede com Java
Java Sockets Sem Conexão
o Um socket datagrama (A classe DatagramSocket ) é o ponto de envio ou
recebimento para um serviço de entrega de pacotes
• DatagramSocket(int port, InetAddress laddr): cria um socket datagrama,
ligado a um endereço local (laddr, port) específico
o Cada pacote enviado ou recebido em um socket datagrama é o Cada pacote enviado ou recebido em um socket datagrama é
individualmente endereçado e roteado
o Múltiplos pacotes enviados de uma máquina para outra pode ser roteado
diferentemente e pode chegar em qualquer ordem
o Envio e Recebimento de pacotes
• void receive(DatagramPacket p): recebe um pacote de datagrama deste
socket
Programação em rede com Java
Mas por quê usar UDP ?
o Quando se deseja rapidez e eficiência a operação sem conexão utilizando o
protocolo UDP é mais adequado, mas não garantido.
o Datagramas têm menos overhead do que sockets TCP, pois nenhum
controle de fluxo é necessário quando se envia ou recebe um datagrama UDP.
UDP.
o Os datagramas UDP também podem ser usados num servidor Java que
envie atualizações periódicas para um conjunto de clientes. O servidor teria de fazer menos trabalho e consequentemente seria mais rápido, se ele
pudesse simplesmente enviar datagramas UDP em vez de ter de iniciar uma conexão TCP para cada cliente.
Programação em rede com Java
Atividade 01
o Execute os programas ServidorEcoDatagrama.java e
ClienteEcoDatagrama.java
o O que pode ser notado (diferença) em relação ao funcionamento dos
Programação em rede com Java
Atividade 02
o Capturar e analisar o trafego utilizando o Ethereal para uma comunicação
orientada a conexão
• Programas: ReceptorUDP.java e RemetenteUDP.java
o Capturar e analisar o trafego utilizando o Ethereal para uma comunicação
sem conexão sem conexão