Mini-Curso de Sockets no Unipê
-
Upload
elenilson-vieira -
Category
Documents
-
view
3.567 -
download
1
description
Transcript of Mini-Curso de Sockets no Unipê
1
Sockets em Java
Elenilson VieiraEmbaixador de Campus da SunUniversidade Federal da Paraíbablogs.sun.com/[email protected]
1
22
3
Agenda
3
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 4
Footnote position, 12 pts.
Sun Confidential: Internal Only 5
Quem conhece Programação Distribuída?
Sun Confidential: Internal Only 6
Footnote position, 12 pts.
Sun Confidential: Internal Only 7
Por que aprender a programar com sockets?
• Programar para Internet• Programar para rede local• Comunicação inter-processos• A interface socket tornou-se quase tão popular
entre os programadores quanto a própria Internet.
8
Agenda
8
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 9
Definição
Sun Confidential: Internal Only 10
Sun Confidential: Internal Only 11
O que é um Socket?
• Representação interna do sistema operacional para um ponto de comunicação
• Cada endpoint é representado por um par (endereço_ip,porta)
Sun Confidential: Internal Only 12
O que é Socket?• Uma porta serve para identificar processos
comunicantes • A interface padronizada de soquetes surgiu
originalmente no sistema operacional Unix BSD (Berkeley Software Distribution); por isso, eles são muitas vezes chamados de Berkeley Sockets.
Sun Confidential: Internal Only 13
Pilha de rede do sitema operacional
Processo #m
Porta #m
Processo #1
Porta #1
…
Host#1
Pilha de rede do Sistema operacional
Processo #k
Porta #k
Processo #1
Porta #1
…
Host #n
…
NetworkEndereço IP#1 Endereço IP #n
14
Agenda
14
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 15
Protocolos
Sun Confidential: Internal Only 16
O que é um Protocolo?
Sun Confidential: Internal Only 17
Protocolos• São regras para a comunicação entre duas
aplicações, computadores, dispositivos, etc.• Em programação, protocolos são funções que
implementam serviços de comunicação
Sun Confidential: Internal Only 18
oi
envie os dados
soma 2 2
4
Multi 2 4
8
tchau
Sun Confidential: Internal Only 19
Protocolos• São a interface de um módulo ou de uma camada
de rede• Exemplo : TCP/IP, Telnet, HTTP, SMTP, FTP,
NNTP, SNMP, ARP, RARP, BOOTP, ICMP, IGMP, etc.
20
Agenda
20
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 21
Modelo Cliente-Servidor
Sun Confidential: Internal Only 22
O que é o Modelo Cliente-Servidor?
Sun Confidential: Internal Only 23
Modelo Cliente-Servidor• Sockets se baseia no modelo cliente/servidor
> O cliente é um processo ou aplicação que requisita um serviço oferecido por um servidor.
> O servidor aceita as requisições dos clientes, realiza o processamento delas
Sun Confidential: Internal Only 24
Modelo Cliente-Servidor• Interação
> paradigma requisição-resposta
Footnote position, 12 pts.
Sun Confidential: Internal Only 25
Modelo Cliente-Servidor
Footnote position, 12 pts.
26
Agenda
26
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 27
Footnote position, 12 pts.
Formas de Comunicação
Sun Confidential: Internal Only 28
Dois tipos de comunicação• Com conexão• Sem conexão
Sun Confidential: Internal Only 29
Sem Conexão• Cliente e servidor não precisam estabelecer
nenhuma conexão, isto é, a qualquer momento um processo pode enviar ou receber dados
• Exemplos desse tipo de comunicação: > Socket UDP
Footnote position, 12 pts.
Sun Confidential: Internal Only 30
Sem Conexão
Sun Confidential: Internal Only 31
Com Conexão• Deve ser estabelecida uma conexão para depois
poderem enviar e receber dados. • Exemplo:
> Socket TCP
Sun Confidential: Internal Only 32
Com Conexão
Sun Confidential: Internal Only 33
Sun Confidential: Internal Only 34
Com Conexão
35
Agenda
35
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 36
Footnote position, 12 pts.
Estados de um Socket
Sun Confidential: Internal Only 37
Estados de um Socket• Socket Passivo: espera por uma conexão
> Usado por Servidores> Closed listen established> Obs. O socket TCP também possui outros estados
Footnote position, 12 pts.
Sun Confidential: Internal Only 38
Estados de um Socket• Socket Ativo: Inicia uma conexão
> Usado pelos Clientes> Closed Established
Footnote position, 12 pts.
39
Agenda
39
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 40
Footnote position, 12 pts.
API Sockets - Primitivas
Sun Confidential: Internal Only 41
PrimitivasFunção Descrição
Socket Cria um novo ponto de comunicação
Bind Associa o enrederço IP e a porta ao endpoint local do socket
Listen Indica que o socket esta pronto para aceitar requisição de conexões
Accept Bloqueia o processo até a chegada de uma requisição de conexão
Connect Estabelece uma conexão com um endpoint remoto
Read Ler dados de um socket conectado (TCP)
Recvfrom Ler dados de um socket não conectado (UDP)
Write Envia dados ao endpoint remoto conectado (TCP)
Sendto Envia dados ao endpoint remoto informado no parâmetro (UDP)
Close Fecha o socket
Sun Confidential: Internal Only 42
Classe Descrição
Socket Construtor Socket(InetAddress,int), cria o socket e realiza o bind e connect
Construtor Socket(String,int), cria o socket e realiza o bind e connect
DatagramSocket Construtor DatagramSocket(int) cria o socket e realiza o bind
ServerSocket Construtor ServerSocket(int), cria o socket e realiza o bind e listen
Método close Comum às três classes. Realiza o close, fecha o socket e libera a porta.
API Socket
Sun Confidential: Internal Only 43
E o Read e o Write?• Em Java você precisa usar extensões das classes
abstratas InputStream e OutputStream.• Os métodos getInputStream e getOutputStream de
Socket e ServerSocket retornam um InputStream e output stream
Footnote position, 12 pts.
Sun Confidential: Internal Only 44
E o Read e o Write?• A escolha do InputStream/OutputStream depende
da aplicação, consulte a API.• Pode-se usar diretamente objetos
InputStream/OutputStream com as classes Scanner/PrintWriter respectivamente para ler e escrever nos sockets
Sun Confidential: Internal Only 45
Hora de Programar!!!
Sun Confidential: Internal Only 46
Interagir com Socket de Java
Sun Confidential: Internal Only 47
Interagir com Socket de Java
Sun Confidential: Internal Only 48
Comunicação com Conexão
processo
TCPsocket
Controlado pelo
desenvolvedor
da aplicação
Controlado pelo
sistema
operacional
processo
TCPsocket
internet
cliente servidorsocket( )bind( )connect( )
socket( )bind( )listen( )
accept( )send( )recv( )
close( ) close( )
recv( ) send( )
TCP conn. request
TCP ACK
Sun Confidential: Internal Only 49
Comunicação sem Conexão
processo
UDPsocket
Controlado pelo
desenvolvedor
da aplicação
Controlado pelo
sistema
operacional
processo
UDPsocket
internet
cliente servidorsocket( )bind( )
socket( )bind( )
send() recv( )
close( ) close( )
recv( ) send( )
50
Agenda
50
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 51
Footnote position, 12 pts.
Cliente em Java
Sun Confidential: Internal Only 52
Cliente em Java
53
Agenda
53
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 54
Servidor em Java
Sun Confidential: Internal Only 55
Servidor em Java
Sun Confidential: Internal Only 56
Hora de Programar!!!
Sun Confidential: Internal Only 57
Implementar uma calculadora utilizando Sockets
Sun Confidential: Internal Only 60
Hora de Programar!!!
Sun Confidential: Internal Only 61
• Nos exemplos anteriores, o servidor é capaz de responder apenas a uma requisição por vez
• A primitiva accept é bloqueante! Ela bloqueia o processo até que seja recebida uma requisição
• Precisamos atender a vários clientes
Footnote position, 12 pts.
Sun Confidential: Internal Only 62
Servidor Monothread
63
Agenda
63
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 64
Servidor Multithread
Sun Confidential: Internal Only 65
Relembrando Criação de Threads• Implementando a Classe Runnable
Footnote position, 12 pts.
Sun Confidential: Internal Only 66
Relembrando Criação de Threads• Extendendo a Classe Thread
Footnote position, 12 pts.
Sun Confidential: Internal Only 67
Servidor Multithread• Podemos criar uma classe para o tratamento da
requisição implementando a interface Runnable• Então basta criarmos uma thread a cada chamada
do accept
Sun Confidential: Internal Only 68
Servidor Multithread
Sun Confidential: Internal Only 69
Servidor Multithread
Sun Confidential: Internal Only 70
Falamos de servidor multithreaded, mas e quanto ao cliente?
Sun Confidential: Internal Only 71
Servidor Multithread
Sun Confidential: Internal Only 72
Hora de Programar!!!
Sun Confidential: Internal Only 73
Implementar o servidor Multithread
Sun Confidential: Internal Only 74
Como ficaria a calculadora MultiThread?
Sun Confidential: Internal Only 75
Hora de Programar!!!
Sun Confidential: Internal Only 76
Implementar a calculadora Multithread
77
Agenda
77
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 78
Enviando Objetos• Utilizamos as classes
> ObjectOutputStream– writeObject(objeto)
> ObjectInputStream– readObject()
• O objeto precisa implemente Serializable
Sun Confidential: Internal Only 79
Sun Confidential: Internal Only 80
Sun Confidential: Internal Only 81
Sun Confidential: Internal Only 82
Hora de Programar!!!
Sun Confidential: Internal Only 83
Implementar o envio de Objetos
84
Agenda
84
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 85
DatagramSocket• Podemos enviar e receber pacotes sem a
necessidade de uma conexão• São raros, mas alguns problemas podem acontecer
> Pacotes podem não chegar> Pacotes podem chegar fora de ordem> Pacotes podem chegar duplicados
Sun Confidential: Internal Only 86
DatagramSocket• Utilizamos essa classe para criar o Socket
> DatagramSocket(porta)
• Utilizamos essa classe para criar o pacote> DatagramPacket(dados, tamanho_dos_dados)
Sun Confidential: Internal Only 87
No Servidor• Cria um DatagramSocket e indica em qual porta
estará a escuta> DatagramSocket ds = new DatagramSocket(5000);
• Cria um DatagramPacket e chama o método receive do socket
Sun Confidential: Internal Only 88
No Servidor
Sun Confidential: Internal Only 89
No Cliente
• Utilizamos essa classe para criar o Socket> DatagramSocket()
• Utilizamos essa classe para criar o pacote> DatagramPacket(dados, tamanho_dos_dados,
endereco_servidor, porta_servidor)
Sun Confidential: Internal Only 90
No Cliente
Sun Confidential: Internal Only 91
No Cliente
Sun Confidential: Internal Only 92
No Cliente
Sun Confidential: Internal Only 93
Hora de Programar!!!
Sun Confidential: Internal Only 94
Implementar o envio de dados com DatagramSocket
95
Agenda
95
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 96
Observações
Sun Confidential: Internal Only 97
Observações
• Muitas coisas podem dar errado na comunicação em rede> Não é possível resolver o nome> O host não pode ser encontrado - offline> A conexão pode ser encerrada abruptamente> O servidor pode demorar demais para responder> Inundação de requisições – quantas threads criar?
Sun Confidential: Internal Only 98
Observações• Fique atento!
> Trate as exceções> Defina um timeout com o objeto socket:
– Socket s = new Socket(“www.google.com”,80);– s.setSoTimeout(60000); //às próximas requisições serão aplicadas um
timeout
Footnote position, 12 pts.
Sun Confidential: Internal Only 99
Como eu faria para meu servidor executar então alguma operação como uma requisição do cliente?
• Vocês observaram o comando “Tchau” ?• Lembram do “protocolo”?
> Você define as regras para interpretar os dados na sua aplicação!
100
Agenda
100
1 – Motivação2 – Definição3 – Protocolos4 – Modelo Cliente-Servidor5 – Formas de Comunicação6 – Estados de um Socket7 – API Socket - Primitivas8 – Cliente em Java9 – Servidor em Java10 – Servidor Multi-thread11 – Enviando Objetos12 – DatagramSocket13 – Observações14 – RaceFX
Sun Confidential: Internal Only 101
RaceFX
Sun Confidential: Internal Only 102
RaceFX• Jogo desenvolvidor em JavaFX por Raphael
Marques (raphaelmarques.wordpress.com/)
• Utiliza Sockets para a comunicação entre duas máquinas
Footnote position, 12 pts.
Sun Confidential: Internal Only 103
Hora de Programar!!!
Sun Confidential: Internal Only 104
RaceFX – Trabalho Final do Mini-Curso• Implementar a comunicação entre o cliente e o
servidor> Classes: Server e Client
• Objetivo> Criar ServerSocket e Socket ou DatagramSocket> Definir Protocolo> Enviar e Receber Dados
Sun Confidential: Internal Only 105
Classe Client.java
Sun Confidential: Internal Only 106
Construtor
Sun Confidential: Internal Only 107
RaceFX – Trabalho Final do Mini-Curso
Sun Confidential: Internal Only 108
Método send(SenderCar)
Sun Confidential: Internal Only 109
Classe Server.java
Sun Confidential: Internal Only 110
Construtor
Sun Confidential: Internal Only 111
Sun Confidential: Internal Only 112
Método send(SenderCar)
Sun Confidential: Internal Only 113
E o que eu tenho que enviar?
Sun Confidential: Internal Only 114
Classe SenderCar.java
Sun Confidential: Internal Only 115
Sun Confidential: Internal Only 116
Footnote position, 12 pts.
Perguntas
117
Sockets em Java
Elenilson VieiraEmbaixador de Campus da SunUniversidade Federal da Paraíbablogs.sun.com/[email protected]
117