Você está na página 1de 5

Sistemas Distribuídos e Paralelos

Guia para AP VII: Comunicação entre processos

(Comunicação por datagrama UDP)

Introdução
Focalizamos os dois lados do relacionamento cliente/servidor. O cliente solicita
que alguma acção seja realizada e o servidor realiza a acção e responde para o
cliente.

Nesta aula vamos demonstrar o processo de comunicação por datagrama UDP,


criaremos um cliente e um servidor simples. A comunicação será feita mediante
sockets.

As comunicações baseadas em socket do java, permitem aos aplicativos


visualizar a rede como se fosse uma E/S de arquivo. Socket é simplesmente uma
construção de software que representa uma extremidade final de uma conexão.

Com sockets de datagrama, são transmitidos pacotes individuais de


informações. O protocolo utilizado é o UDP (User Datagram Protocol), um
serviço sem conexão e, assim, não garante que pacotes cheguem em uma
ordem particular. Com UDP os pacotes podem ser perdidos ou duplicados. O
UDP é mais apropriado para aplicativos de rede que não requerem verificação
de erros e confiabilidade do TCP.

Problema

Um cliente deseja saber o tamanho de uma String fazendo uso dos serviços
oferecidos pelo servidor. O cliente envia um datagrama e espera a resposta
(quantidade de caracteres que compõe a String). Implemente um programa
cliente-servidor que permite resolver o problema.
Orientações
 Crie um projecto chamado ComunicacaoPorUDP com o método main,
renomeie o arquivo “ComunicacaoPorUDP.java” por “Servidor.java”.
 Crie uma outra classe Cliente com o método main na pasta
“comunicacaoporudp”.
 Lembra que esse é um laboratório, faça como está abaixo, a menos que
haja erro.

Solução

Classe Servidor
package comunicacaoporudp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
*
* @author D.N.Kasso
*/
public class Servidor {

public static void main(String[] args) {

try {
DatagramSocket socket = new DatagramSocket(49157);
//Especificar o vector de bytes para receber mensagens.
byte[] buffer = new byte[1024];
DatagramPacket pacoteAReceber = new DatagramPacket(buffer,
buffer.length);
socket.receive(pacoteAReceber); //Recebe do cliente
int tamanho = pacoteAReceber.getLength();
String s = Integer.toString(tamanho);
DatagramPacket pacoteAEnviar = new DatagramPacket(s.getBytes(),
s.length(), pacoteAReceber.getAddress(), pacoteAReceber.getPort());
socket.send(pacoteAEnviar); //Envia resposta ao cliente
} catch (SocketException ex) {

} catch (IOException ex) {}


}

}
Classe Cliente

package comunicacaoporudp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;

/**
*
* @author D.N.Kasso
*/
public class Cliente {

public static void main(String[] args) {

String s = JOptionPane.showInputDialog("Mensagem a enviar");


try {
DatagramSocket socket = new DatagramSocket();
Byte[] mensagem = s.getBytes(); //Mensagem em bytes
DatagramPacket pacoteAEnviar = new DatagramPacket(mensagem,
mensagem.length, InetAddress.getByName("NomeDispositivo"), 49157);

socket.send(pacoteAEnviar); //Envia ao servidor


//Especificar o vector de bytes para receber mensagens.
byte[] buffer = new byte[1024];
DatagramPacket pacoteAReceber = new DatagramPacket(buffer,
buffer.length);
socket.receive(pacoteAReceber); // Recebe resposta do Servidor
System.out.println("Tamanho da String: " +new
String(pacoteAReceber.getData()));
} catch (SocketException ex) {

} catch (UnknownHostException ex) {

} catch (IOException ex) {

}
}

Você também pode gostar