Upload
jose-f-rodrigues-jr
View
158
Download
5
Embed Size (px)
Citation preview
http://publicationslist.org/junio
RedeProf. Jose Fernando Rodrigues Juniorhttp://www.icmc.usp.br/~junio
INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP
SCC0504 - Programação Orientada a Objetos
http://publicationslist.org/junio
Rede – conceitos básicos• A comunicação entre computadores é denominada comunicação via
rede de computadores
• Para que esta comunicação ocorra, os computadores participantes darede precisam seguir um protocolo
• Um protocolo é uma sequência de passos necessária para que os doiscomputadores saibam:• quando uma conexão começa e quando termina• quando uma transmissão começa e quando termina• quando ocorre uma falha, e como se recuperar da falha• entre outras funcionalidades necessárias
http://publicationslist.org/junio
Rede – conceitos básicos - TCP• O protocolo mais usado é o Transmission Control Protocol (TCP)
• O TCP provê a transmissão segura (garantia de entrega),ordenada, com verificação de erro, de um stream de bytes entredois programas de computador, cada um em um computador diferente
• O protocolo Internet Protocol (IP) funciona de maneiracomplementar ao TCP (e a outros protocolos) oferecendofuncionalidades de roteamento entre computadores
• Segundo o IP, um computador é identificado por um número IP
• Em cada computador, processos são identificados por númerosde portas
http://publicationslist.org/junio
Sockets• Socket: trata-se de um conceito presente em diversas plataformas de
programação, o qual abstrai o uso do protocolo TCP para acomunicação entre computadores
• Definição: uma socket é ponto terminal (endpoint = IP:port) de umaconexão bi-direcional entre dois programas que usam a rede para secomunicar.
• Uma socket é atrelada a um número de porta, de maneira que oprotocolo TCP possa identificar a aplicação para a qual os dados sãodestinados
http://publicationslist.org/junio
SocketsO pacote java.net provê duas classes que possibilitam o uso de sockets:
• ServerSocket: usado para receber conexões• Socket: usado para fazer conexões
• Basicamente o uso destas classes ocorre na seguinte ordem:1. Abertura da Socket2. Abertura de streams de leitura e escrita na Socket3. Escrita e leitura de dados nas/das streams4. Fechamento dos streams5. Fechamento da socket
• O Java abstrai as funcionalidades de rede usando implementaçõesespecíficas de cada plataforma (Windows, Mac, Linux, ...)
http://publicationslist.org/junio
Servidor TCP simples
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
Servidor
SERVIDOR
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);
Servidor
ServerSocketOUVIDO
SERVIDOR
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
Servidor
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
Servidor
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Socket
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR CLIENTE
ENVIA
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR CLIENTE
RECEBE
ENVIA
ENVIA
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR
ENVIA
CLIENTE
RECEBE
ENVIA
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR
ENVIA
CLIENTE
RECEBE
ENVIA
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();
Servidor
ServerSocketOUVIDO
SERVIDOR
ENVIA
CLIENTE
RECEBE
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();ENVIA.close();
Servidor
ServerSocketOUVIDO
SERVIDOR CLIENTE
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();OUVIDO.close();
Servidor
SERVIDOR CLIENTE
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();OUVIDO.close();
Servidor
SERVIDOR CLIENTE
Perceba que existe um protocolo entre o servidor e o cliente:
• no servidor: receber, e em seguida enviar• no cliente: enviar, e em seguida receber
Protocolos são necessários em comunicação entrecomputadores, pois eles definem o quê e quando as coisas irãoacontecer.
Em todos os próximos exemplos, sempre haverá umprotocolo, por mais simples que seja.
http://publicationslist.org/junio
Cliente TCP simples
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Cliente
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
Cliente
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Socket
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE ENVIA
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
ENVIA.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
ENVIA RECEBE
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
ENVIA.close();RECEBE.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
ENVIA.close();RECEBE.close();LEITOR_ENTRADA_PADRAO.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
http://publicationslist.org/junio
• Cliente que envia texto ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ENVIA = new PrintWriter(CLIENTE_SOCKET.getOutputStream(), true);
RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
BufferedReader LEITOR_ENTRADA_PADRAO = new BufferedReader(new InputStreamReader(System.in));
String userInput = "";while(userInput.compareTo(“BYE") != 0){userInput = LEITOR_ENTRADA_PADRAO.readLine();ENVIA.println(userInput);System.out.println(RECEBE.readLine());
}
ENVIA.close();RECEBE.close();LEITOR_ENTRADA_PADRAO.close();CLIENTE_SOCKET.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTE
http://publicationslist.org/junio
Servidor TCP simples para múltiplos clientes usando Threads
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);
Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();OUVIDO.close();
Servidor com Threads
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);
Socket SERVIDOR_SOCKET = OUVIDO.accept();
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}
RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();OUVIDO.close();
Servidor com Threads
Este código se torna o run de uma Thread.
http://publicationslist.org/junio
• Servidor que repete o que o cliente envia:
ServerSocket OUVIDO = new ServerSocket(8008);
while (bEscutando) {Socket SERVIDOR_SOCKET = OUVIDO.accept();
EchoServerThread threadServidora = new EchoServerThread(SERVIDOR_SOCKET);
threadServidora.start();}OUVIDO.close();
Servidor com Threads
http://publicationslist.org/junio
public class EchoServerThread extends Thread {
private Socket SERVIDOR_SOCKET = null;
public EchoServerThread(Socket umCLIENTE) {this.SERVIDOR_SOCKET = umCLIENTE;
}public void run() {
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){
str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();
}}
Servidor com Threads
http://publicationslist.org/junio
public class EchoServerThread extends Thread {
private Socket SERVIDOR_SOCKET = null;
public EchoServerThread(Socket umCLIENTE) {this.SERVIDOR_SOCKET = umCLIENTE;
}public void run() {
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
SERVIDOR_SOCKET.getInputStream()));PrintWriter ENVIA = new PrintWriter(
new OutputStreamWriter(SERVIDOR_SOCKET.getOutputStream()));
String str = "";while(str.compareTo("BYE") != 0){
str = RECEBE.readLine();
ENVIA.println("O servidor repete: \"" + str + "\"");ENVIA.flush();
}RECEBE.close();ENVIA.close();SERVIDOR_SOCKET.close();
}}
Servidor com Threads
A Thread recebe um socket para se comunicar com o cliente, e passa a ser o servidor para aquele cliente.
http://publicationslist.org/junio
Servidor TCP para objetos
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
Servidor
SERVIDOR
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);
Servidor
ServerSocketOUVIDO
SERVIDOR
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
Servidor
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
Servidor
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Socket
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR CLIENTE
ENVIA
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR CLIENTE
RECEBE
ENVIA
ENVIA
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));Object oTemp = null;do{oTemp = RECEBE_OBJETO.readObject();
ENVIA.println(“Objeto recebido");ENVIA.flush();
}while(oTemp != null);
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR
ENVIA
CLIENTE
RECEBE
ENVIA
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));Object oTemp = null;do{oTemp = RECEBE_OBJETO.readObject();
ENVIA.println(“Objeto recebido");ENVIA.flush();
}while(oTemp != null);
Servidor
ServerSocketOUVIDO
RECEBE
SERVIDOR
ENVIA
CLIENTE
RECEBE
ENVIA
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));Object oTemp = null;do{oTemp = RECEBE_OBJETO.readObject();
ENVIA.println(“Objeto recebido");ENVIA.flush();
}while(oTemp != null);
RECEBE_OBJETO.close();
Servidor
ServerSocketOUVIDO
SERVIDOR
ENVIA
CLIENTE
RECEBE
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));Object oTemp = null;do{oTemp = RECEBE_OBJETO.readObject();
ENVIA.println(“Objeto recebido");ENVIA.flush();
}while(oTemp != null);
RECEBE_OBJETO.close();ENVIA.close();
Servidor
ServerSocketOUVIDO
SERVIDOR CLIENTE
http://publicationslist.org/junio
• Servidor que recebe objetos do cliente:
ServerSocket OUVIDO = new ServerSocket(8008);Socket SERVIDOR_SOCKET = OUVIDO.accept();
ObjectInputStream RECEBE_OBJETO = new ObjectInputStream(SERVIDOR_SOCKET.getInputStream());
PrintWriter ENVIA = new PrintWriter(new OutputStreamWriter(
SERVIDOR_SOCKET.getOutputStream()));Object oTemp = null;do{oTemp = RECEBE_OBJETO.readObject();
ENVIA.println(“Objeto recebido");ENVIA.flush();
}while(oTemp != null);
RECEBE_OBJETO.close();ENVIA.close();SERVIDOR_SOCKET.close();OUVIDO.close();
Servidor
SERVIDOR CLIENTE
http://publicationslist.org/junio
Cliente TCP para objetos
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Cliente
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
Cliente
ServerSocketOUVIDO
OUVIDO.accept( )
SERVIDOR CLIENTE
Socket
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE ENVIA
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
for(Object o : lista){ENVIA_OBJETO.writeObject(o);System.out.println(RECEBE.readLine());
}
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
for(Object o : lista){ENVIA_OBJETO.writeObject(o);System.out.println(RECEBE.readLine());
}ENVIA_OBJETO.writeObject(null);
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
RECEBE
ENVIA RECEBE
ENVIA
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
for(Object o : lista){ENVIA_OBJETO.writeObject(o);System.out.println(RECEBE.readLine());
}ENVIA_OBJETO.writeObject(null);
ENVIA_OBJETO.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
ENVIA RECEBE
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
for(Object o : lista){ENVIA_OBJETO.writeObject(o);System.out.println(RECEBE.readLine());
}ENVIA_OBJETO.writeObject(null);
ENVIA_OBJETO.close();RECEBE.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTESocket
http://publicationslist.org/junio
• Cliente que envia objetos ao servidor:Socket CLIENTE_SOCKET = new Socket("localhost", 8008);
ObjectOutputStream ENVIA_OBJETO = new ObjectOutputStream(CLIENTE_SOCKET.getOutputStream());
BufferedReader RECEBE = new BufferedReader(new InputStreamReader(
CLIENTE_SOCKET.getInputStream()));
lista.add(new Retangulo());lista.add(new Quadrado());lista.add(new Triangulo());
for(Object o : lista){ENVIA_OBJETO.writeObject(o);System.out.println(RECEBE.readLine());
}ENVIA_OBJETO.writeObject(null);
ENVIA_OBJETO.close();RECEBE.close();CLIENTE_SOCKET.close();
Cliente
ServerSocketOUVIDO
SERVIDOR CLIENTE
http://publicationslist.org/junio
Rede – conceitos básicos - UDP• Como vimos, o TCP provê a transmissão segura (com garantia de
entrega), ordenada, e com verificação de erro, de um stream debytes entre dois programas de computador, cada um em um computadordiferente
• No entanto, nem todas as aplicações tem estas necessidades, suponha,por exemplo, uma aplicação peer-to-peer de transferência dearquivos, como o BitTorrent
• Nesta aplicação, garantir entrega e ordem dos bytes podeimpedir seu uso, pois dificultará a gerência e a negociação demúltiplos peers de transferência de arquivo, ao mesmo tempo em quese recebem múltiplos arquivos – isto é, os dados não vem comostreams mas sim como torrentes (do dicionário: água rápida e impetuosaque provém de grandes chuvas)
http://publicationslist.org/junio
Rede – conceitos básicos - UDP• Em sistemas desta natureza são usados datagramas UDP, ao invés de
streamsTCP
• O protocolo UDP prevê a transmissão de pacotes de dadosindependentes uns dos outros, sem garantia de entrega, e semordem de chegada
• A API Java tem duas classes para o uso do UDP• DatagramPacket• DatagramSocket
http://publicationslist.org/junio
Servidor UDP simples
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
Servidor
UDP_SOCKET_SERVIDOR
SERVIDORip1:port1
CLIENTEip2:port2
UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“O poder se consegue pela mão esquerda, mas se dá pela mão direita”).getBytes();UDP_PACOTE = new DatagramPacket(A_ENVIAR,A_ENVIAR.length, REMETENTE_IP, REMETENTE_PORTA);
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“O poder se consegue pela mão esquerda, mas se dá pela mão direita”).getBytes();UDP_PACOTE = new DatagramPacket(A_ENVIAR,A_ENVIAR.length, REMETENTE_IP, REMETENTE_PORTA);
UDP_SOCKET_SERVIDOR.send(UDP_PACOTE);
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“O poder se consegue pela mão esquerda, mas se dá pela mão direita”).getBytes();UDP_PACOTE = new DatagramPacket(A_ENVIAR,A_ENVIAR.length, REMETENTE_IP, REMETENTE_PORTA);
UDP_SOCKET_SERVIDOR.send(UDP_PACOTE);
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Servidor que recebe e envia pacotes para o cliente:DatagramSocket UDP_SOCKET_SERVIDOR = new DatagramSocket(4445);byte[] CAIXA_CORREIO = new byte[256];
DatagramPacket UDP_PACOTE = new DatagramPacket(CAIXA_CORREIO, CAIXA_CORREIO.length);UDP_SOCKET_SERVIDOR.receive(CAIXA_CORREIO);
InetAddress REMETENTE_IP = UDP_PACOTE.getAddress();int REMETENTE_PORTA = UDP_PACOTE.getPort();
byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“O poder se consegue pela mão esquerda, mas se dá pela mão direita”).getBytes();UDP_PACOTE = new DatagramPacket(A_ENVIAR,A_ENVIAR.length, REMETENTE_IP, REMETENTE_PORTA);
UDP_SOCKET_SERVIDOR.send(UDP_PACOTE);
UDP_SOCKET_SERVIDOR.close();
Servidor
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
Cliente UDP simples
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
UDP_SOCKET_SERVIDOR
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
InternetInternet
UDP_SOCKET_CLIENTEUDP_SOCKET_SERVIDOR
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
InternetInternet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
InternetInternet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
InternetInternet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
byte[] A_RECEBER = new byte[256];UDP_PACOTE = new DatagramPacket(A_RECEBER, A_RECEBER.length);UDP_SOCKET_CLIENTE.receive(UDP_PACOTE);
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
byte[] A_RECEBER = new byte[256];UDP_PACOTE = new DatagramPacket(A_RECEBER, A_RECEBER.length);UDP_SOCKET_CLIENTE.receive(UDP_PACOTE);
System.out.println(new String(UDP_PACOTE.getData(),0,UDP_PACOTE.getLength());
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
O poder se consegue pela mão esquerda, mas se dá pela mão direita.
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
byte[] A_RECEBER = new byte[256];UDP_PACOTE = new DatagramPacket(A_RECEBER, A_RECEBER.length);UDP_SOCKET_CLIENTE.receive(UDP_PACOTE);
System.out.println(new String(UDP_PACOTE.getData(),0,UDP_PACOTE.getLength());
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR UDP_SOCKET_CLIENTE
http://publicationslist.org/junio
• Cliente que recebe e envia pacotes para o servidor:byte[] A_ENVIAR = new byte[256];A_ENVIAR = (“Me envie sabedoria”).getBytes();DatagramPacket UDP_PACOTE = new DatagramPacket(A_ENVIAR,IP1, PORT1);
DatagramSocket UDP_SOCKET_CLIENTE = new DatagramSocket();UDP_SOCKET_CLIENTE.send(UDP_PACOTE);
byte[] A_RECEBER = new byte[256];UDP_PACOTE = new DatagramPacket(A_RECEBER, A_RECEBER.length);UDP_SOCKET_CLIENTE.receive(UDP_PACOTE);
System.out.println(new String(UDP_PACOTE.getData(),0,UDP_PACOTE.getLength());
UDP_SOCKET_CLIENTE.close();
Cliente
SERVIDORip1:port1
CLIENTEip2:port2
Internet
UDP_SOCKET_SERVIDOR