Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
14/03/12
1
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
2.
Tecnologias
de
programação
em
sistemas
distribuídos
2.1
Programação
baseada
em
troca
de
mensagens
2.2
Chamada
de
procedimentos
remotos
(RPC)
2.3
Invocação
de
métodos
remotos
(RMI)
2.4
Padronização
para
objetos
distribuídos
–
Corba
Tema
da
aula
14/03/12
2
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Socket é uma tecnologia que possibilita a comunicação entre
aplicações usando a rede de computadores;
o O JAVA oferece os seguintes os seguintes modos:
o TCP – modo orientado a conexão
o UDP – modo orientado a datagrama
o Os dois modos funcionam sobre o protocolo IP
Introdução
Socket
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Socket
14/03/12
3
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o O processo de comunicação é orientado a conexão;
o Processo:
o O servidor escolhe uma determinada porta
o O servidor fica aguardando conexões nessa porta
o O cliente deve saber previamente qual é a máquina servidor e a porta
o O cliente solicita a conexão com a máquina/porta
Sockets
usando
TCP/IP
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Se nenhum problema acontecer então irá estabelecer a comunicação
Sockets
usando
TCP/IP
14/03/12
4
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o O comportamento do servidor é ficar em um loop aguardando
novas conexões gerando sockets para atender as solicitações dos
clientes
Sockets
usando
TCP/IP
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
14/03/12
5
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Para
implementar
a
estrutura
de
cliente/servidor
uHlizando
o
Java,
este
existe
uma
biblioteca
para
trabalhar
com
essa
estruturas.
Portanto
para
usá-‐las
basta
importar
para
o
projeto;
o Prá?ca
01
o Criar
um
projeto
usando
o
NetBeans
o Criar
uma
Classe
e
nomeá-‐la
de
Cliente
o Criar
uma
Classe
e
nomeá-‐la
de
Servidor
o Importar
a
classe
java.net.*
para
a
classe
cliente
e
servidor;
o Importar
a
classe
java.io.*
para
a
classe
cliente
e
servidor;
Sockets
usando
TCP/IP
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
o Implementação
do
cliente:
o Especificar
qual
máquina
o
cliente
conectará
em
qual
porta
o Criar
um
canal
para
enviar
os
dados
o Criar
um
canal
para
receber
os
dados
o Funcionalidades
do
programa
Socket s = new Socket("localhost",2000);!
DataInputStream entrada = new !
DataInputStream(s.getInputStream());!
!!
DataOutputStream saida = new !
DataOutputStream(s.getOutputStream());!
14/03/12
6
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
o Implementação
do
cliente:
o Funcionalidades
do
programa
o Finalizar
conexão
com
o
servidor
fichar
o
canal
de
comunicação
for (int i = 0; i < 10; i++){!
saida.writeInt(i);!
System.out.println("Enviei: "+i);!
String en = entrada.readUTF();!
System.out.println("Recebi: "+en);!
}!
entrada.close();!
saida.close();!
!
s.close();!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Implementação
do
servidor:
o Especificar
qual
porta
o
servidor
ficará
escutando
o Se
aparecer
alguma
conexão
deverá
aceitar
o Criar
um
canal
para
receber
os
dados
o Criar
um
canal
para
enviar
os
dados
Sockets
usando
TCP/IP
ServerSocket s = new ServerSocket(2000);!
System.out.println("Esperando conexao...............");!
!
conexao = s.accept();!
System.out.println("Conexao aceita, esperando dados...");!
DataOutputStream saida = new !
DataOutputStream(conexao.getOutputStream());!
DataInputStream entrada = new !
DataInputStream(conexao.getInputStream());!
!!
14/03/12
7
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Implementação
do
servidor
VERSÃO
01:
o Fica
recebendo
os
dados
enviados
pelo
cliente
Sockets
usando
TCP/IP
for (int i = 0; i < 10; i++) {!
int linha = entrada.readInt(); !
System.out.println("entrei");!
saida.writeUTF("recebi seu dado: " + linha);!
}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Problemas
do
servidor:
Sockets
usando
TCP/IP
• O servidor aceita somente uma conexão por vez;!
• O servidor não gera um loop infinito;!
• Não temos dados dos clientes no servidor para gerar !
relatório!
14/03/12
8
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Implementação
do
servidor
VERSÃO
02:
o Fica
recebendo
os
dados
enviados
pelo
cliente
Sockets
usando
TCP/IP
InetAddress endereco_remoto;!
int porta_remota;!
ServerSocket s = new ServerSocket(2000);!
System.out.println("Esperando conexao.......................");!
conexao = s.accept();!
System.out.println("Conexao aceita, esperando envio de dados.");!
endereco_remoto = conexao.getInetAddress();!
porta_remota = conexao.getPort();!
!
System.out.println("Nome da maquina remota: " + !
endereco_remoto.getHostName());!
System.out.println("IP da maquina remota: " + !
endereco_remoto.getHostAddress());!
System.out.println("Porta maquina remota: " + porta_remota);!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Implementação
do
servidor
VERSÃO
02:
o Fica
recebendo
os
dados
enviados
pelo
cliente
Sockets
usando
TCP/IP
DataInputStream entrada = new DataInputStream(!
conexao.getInputStream());!
DataOutputStream saida = new DataOutputStream(!
conexao.getOutputStream());!
!
for (int i = 0; i < 10; i++) {!
int linha = entrada.readInt();!
System.out.println("entrei");!
saida.writeUTF("recebi seu dado: " + linha);!
}!
14/03/12
9
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Problemas
do
servidor:
Sockets
usando
TCP/IP
• O servidor aceita somente uma conexão por vez;!
• O servidor não gera um loop infinito;!
• Temos dados dos clientes no servidor para gerar !
relatório!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
• PráHca
02
-‐
CLIENTE
public static void main(String args[]) {!
try {!
!
Socket conexao = new Socket("127.0.0.1", 2001);!
!
DataInputStream entrada = new DataInputStream(!
conexao.getInputStream());!
DataOutputStream saida = new DataOutputStream(!
conexao.getOutputStream()); !
String linha;!
BufferedReader teclado = new BufferedReader(new !
! ! ! !InputStreamReader(System.in));!
!while (true) {!
! ! System.out.print("> ");!
linha = JO….;!
saida.writeUTF(linha);!
linha = entrada.readUTF();!
!
14/03/12
10
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
• PráHca
02
-‐
CLIENTE
! ! if (linha.equalsIgnoreCase("")) {!
System.out.println("Conecao encerrada!");!
break;!
}!
System.out.println(linha);!
}!
}!
catch (IOException e) {!
System.out.println("IOException: " + e);!
}!
}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
• PráHca
02
-‐
SERVIDOR
public static void main(String args[]) {!
try {!
!
ServerSocket s = new ServerSocket(2001);!
while (true) {!
System.out.print("Esperando alguem se conectar...");!
Socket conexao = s.accept();!
System.out.println(" Conectou!");!
DataInputStream entrada = new DataInputStream!
(conexao.getInputStream());!
! DataOutputStream saida = new DataOutputStream!
(conexao.getOutputStream());!
!
! ! String linha = entrada.readLine();!
!
! ! while (linha != null && !(linha.trim().equals(""))) {!
saida.writeUTF(linha);!
linha = entrada.readUTF();!
!
14/03/12
11
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
TCP/IP
• PráHca
02
-‐
SERVIDOR
! ! }!
! ! saida.writeUTF(linha);!
conexao.close();!
}!
}!
catch (IOException e) {!
System.out.println("IOException: " + e);!
}!
}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Problemas
do
servidor:
Sockets
usando
TCP/IP
• O servidor aceita somente uma conexão por vez;!
• O servidor gera um loop infinito;!
• Temos dados dos clientes no servidor para gerar !
relatório!
14/03/12
12
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
• APLICAÇÃO
CLIENTE
Exemplos
Threads
Java
import java.io.*;!
import java.net.*;!
!
public class Cliente extends Thread{!
!!
!private static boolean done = false;!
!private Socket conexao;!
!!
!public Cliente(Socket s){!
! !conexao = s;!
!}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
public static void main(String[] args) {!
!try{!
! !Socket conexao = new Socket(”localhost",2000);!
! !PrintStream saida = new PrintStream!
! ! ! !(conexao.getOutputStream());!
! ! !!
! !BufferedReader teclado = new BufferedReader(new !
! ! ! !InputStreamReader(System.in));!
! !System.out.print("Entre com o seu nome: "); !
! !String meuNome = teclado.readLine(); !
! !saida.println(meuNome); !
! !Thread t = new Cliente(conexao);!
! !t.start(); ! ! !!
! !String linha;!
! !!
14/03/12
13
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
! !while (true){!
! ! !if (done){!
! ! ! break; ! ! ! ! !!
! ! !} ! ! !!
! ! !System.out.println("> "); ! ! !
! linha = teclado.readLine(); !
! ! !saida.println(linha); ! ! !
!!
! ! !!
! !}!
! !catch (IOException e){!
! ! !System.out.println("IOException: " + e);!
! !} ! !!
!}!
!
! !!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
public void run(){!
try{!
!BufferedReader entrada = new BufferedReader(new !
! !
!InputStreamReader(conexao.getInputStream()));!
!String linha;!
!while (true){!
! !linha = entrada.readLine();!
! !if (linha.trim().equals("")){!
! ! !System.out.println("Conexao encerrada!!!");!
! ! !break;!
! !}!
! !System.out.println();!
! System.out.println(linha);!
! System.out.print("...> ");!
!}!
}!
catch(IOException e){ ! !!
!System.out.println("IOException: " + e);!
}!
done = true;!
}!
! !!
14/03/12
14
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
• APLICAÇÃO
SERVIDOR
Exemplos
Threads
Java
import java.io.*;!
import java.net.*;!
import java.util.*;!
!
public class Servidor extends Thread {!
!
!private static Vector clientes;!
!private Socket conexao;!
!private String meuNome;!
!
!public Servidor(Socket s){!
! !conexao = s;!
!}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
public static void main(String[] args) {!
!clientes = new Vector();!
!try{!
! !ServerSocket s = new ServerSocket(2000);!
! !while (true){!
! ! !System.out.print("Esperando conectar...");!
! ! !Socket conexao = s.accept();!
! ! !System.out.println(" Conectou!");!
! ! !Thread t = new Servidor(conexao);!
! ! !t.start();!
! !}!
!}!
!catch(IOException e){!
! !System.out.println("IOException: " + e);!
!}!
}!
14/03/12
15
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
public void run(){!
try{!
!BufferedReader entrada = new BufferedReader(new !
InputStreamReader(conexao.getInputStream()));!
!PrintStream saida = new PrintStream!
(conexao.getOutputStream());!
!
!meuNome = entrada.readLine();!
!if (meuNome == null){!
! return;!
!}!
!clientes.add(saida);!
!String linha = entrada.readLine();!
!
!while ((linha != null) && (!linha.trim().equals(""))){!
! sendToAll(saida," disse: ",linha);!
! linha = entrada.readLine();!
!}!
! ! !!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
!sendToAll(saida," saiu "," do Chat!");!
!clientes.remove(saida);!
!conexao.close();!
}!
catch(IOException e){!
!System.out.println("IOException: " + e);!
}!
}!
! ! !!
14/03/12
16
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Exemplos
Threads
Java
public void sendToAll(PrintStream saida, String acao, String
linha) throws IOException {!
!Enumeration e = clientes.elements();!
!while (e.hasMoreElements()) {!
! PrintStream chat = (PrintStream) e.nextElement();
! if (chat != saida) {!
! !chat.println(meuNome + acao + linha);!
! }!
! if(acao == " saiu "){!
! if (chat == saida)!
! ! chat.println("");!
! }!
}!
} ! ! !!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Problemas
do
servidor:
Sockets
usando
TCP/IP
• O servidor aceita várias conexões;!
• O servidor gera um loop infinito;!
• Temos dados dos clientes no servidor para gerar !
relatório!
14/03/12
17
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Para
o
ulHmo
exemplo
feito
em
Java
usando
Threads
colocar
uma
interface
gráfica
para
deixar
o
exemplo
mais
fácil
de
uHlizar.
o O
trabalho
será
apresentado
para
o
professor
da
disciplina
o Grupos
de
3
alunos
o Valor
do
projeto
3
pontos
o Data
de
entrega:
___________________
Projeto
01:
projeto
de
TCP/IP
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Sockets
usando
UDP
14/03/12
18
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o São muito mais rápidos que o TCP;
o São muito mais simples;
o Menos confiáveis;
o Não temos estabelecimentos de conexão;
o Comunicação ocorre apenas com o envio de mensagens;
Sockets
usando
UDP/IP
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Uma mensagem é um datagrama;
o Composto por um sender;
o Um destinatário
o Um receptor;
o Uma mensagem;
o Caso o destinatário não esteja aguardando uma mensagem a
mesma é perdida
Sockets
usando
UDP/IP
14/03/12
19
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Cliente:
o criar um datagrama e informar qual o endereço do servidor
o Habilitar que o usuário entre com dados
Sockets
usando
UDP/IP
DatagramSocket s = new DatagramSocket();!
InetAddress sender = InetAddress.getByName("localhost");!
String envio;!
!
BufferedReader teclado = new BufferedReader(new !
InputStreamReader(System.in));!
System.out.print("> ");!
envio = teclado.readLine();!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Cliente:
o Enquanto o usuário quiser enviar dados aceitar:
o Criar o buffer
o Montar o pacote de envio
o Enviar
Sockets
usando
UDP/IP
while(!envio.equalsIgnoreCase("")){!
byte[] buffer = envio.getBytes();!
DatagramPacket pergunta = new DatagramPacket(buffer, !
buffer.length, sender, 4545);!
s.send(pergunta);!
14/03/12
20
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Cliente:
o Enquanto o usuário quiser enviar dados aceitar:
o Montar o pacote para receber
o Receber
o Mostra para o usuário a resposta
Sockets
usando
UDP/IP
DatagramPacket resposta = new !
DatagramPacket(new byte[512], 512);!
s.receive(resposta);!
for(int i = 0; i < resposta.getLength(); i++){!
System.out.print((char) resposta.getData()[i]);!
}!
System.out.println();!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Cliente:
o Enquanto o usuário quiser enviar dados aceitar:
o Montar o pacote para receber
o Receber
o Mostra para o usuário a resposta
Sockets
usando
UDP/IP
DatagramPacket resposta = new !
DatagramPacket(new byte[512], 512);!
s.receive(resposta);!
for(int i = 0; i < resposta.getLength(); i++){!
System.out.print((char) resposta.getData()[i]);!
}!
System.out.println();!
14/03/12
21
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Cliente:
o Enquanto o usuário quiser enviar dados aceitar:
o Esperar o usuário entrar com dados novamente
o Fechar do datagrama
Sockets
usando
UDP/IP
System.out.print("> ");!
envio = teclado.readLine();!
s.close();!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Servidor:
o Criar o datagrama em uma porta
o Monta o pacote para receber os dados do cliente
o Enquanto estiver recebendo os dados
Sockets
usando
UDP/IP
DatagramSocket s = new DatagramSocket(4545);!
System.out.println("Servidor esperando conexão.......");!
String envio;!
DatagramPacket recebe = new !
DatagramPacket(new byte[512], 512);!
while(true){!
envio = "";!
s.receive(recebe);!
14/03/12
22
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Servidor:
o Recebe os dados e monta a resposta
o Monta o buffer para o cliente e atribui ao datagrama e envia
Sockets
usando
UDP/IP
System.out.print("Mensagem recebida: ");!
for(int i = 0; i < recebe.getLength(); i++){!
System.out.print((char) recebe.getData()[i]);!
envio = envio + (char) recebe.getData()[i];!
}!
System.out.println();!
byte[] buffer = envio.getBytes();!
DatagramPacket resp = new DatagramPacket(buffer, !
b u f f e r . l e n g t h , r e c e b e . g e t A d d r e s s ( ) ,
recebe.getPort());s.send(resp); !
}!
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
o Para
o
ulHmo
exemplo
feito
em
Java
usando
UDP
colocar
uma
interface
gráfica
para
deixar
o
exemplo
mais
fácil
de
uHlizar.
o Além
disso
criar
uma
função
no
servidor
que
envia
para
todos
os
clientes
conectados
as
mensagens
enviadas
simulando
um
chat.
o O
trabalho
será
apresentado
para
o
professor
da
disciplina
o Grupos
de
3
alunos
o Valor
do
projeto
4
pontos
o Data
de
entrega:
___________________
Projeto
02:
projeto
de
UDP/IP
14/03/12
23
INSTITUTO FEDERAL
TRIÂNGULO MINEIRO
Campus Uberlândia
Fim
aula.....
ricardoboaventura@iftm.edu.br