1. Sockets em Java
Elenils on Vieira
Embaixador de Campus da Sun
Universidade Federal da Paraíba
blogs.sun.com/elenilsonvieira
elenilson.vieira@sun.com
1
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.
Sun Confidential: Internal Only 7
8. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
8
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 11
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 12
13. Host#1 Host #n
Processo #1
… Processo #m Processo #1
… Processo #k
Porta #1 Porta #m Porta #1 Porta #k
Pilha de rede do sitema operacional
… Pilha de rede do Sistema operacional
Endereço IP#1 Endereço IP #n
Network
Sun Confidential: Internal Only 13
14. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
14
16. O que é um
Protocolo?
Sun Confidential: Internal Only 16
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 17
18. oi
envie os dados
soma 2 2
4
Multi 2 4
8
tchau
Sun Confidential: Internal Only 18
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.
Sun Confidential: Internal Only 19
20. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
20
22. O que é o Modelo
Cliente-Servidor?
Sun Confidential: Internal Only 22
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 23
28. Dois tipos de comunicação
• Com conexão
• Sem conexão
Sun Confidential: Internal Only 28
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 29
30. Sem Conexão
Sun Confidential: Internal Only 30
31. Com Conexão
• Deve ser estabelecida uma conexão para depois
poderem enviar e receber dados.
• Exemplo:
> Socket TCP
Sun Confidential: Internal Only 31
32. Com Conexão
Sun Confidential: Internal Only 32
34. Com Conexão
Sun Confidential: Internal Only 34
35. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
35
36. Estados de um Socket
Footnote position, 12 pts.
Sun Confidential: Internal Only 36
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 37
38. Estados de um Socket
• Socket Ativo: Inicia uma conexão
> Usado pelos Clientes
> Closed Established
Footnote position, 12 pts.
Sun Confidential: Internal Only 38
39. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
39
40. API Sockets - Primitivas
Footnote position, 12 pts.
Sun Confidential: Internal Only 40
41. Primitivas
Funçã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 41
42. API Socket
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.
Sun Confidential: Internal Only 42
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 43
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 44
48. Comunicação com Conexão
socket( ) servidor
cliente socket( ) bind( )
bind( )
TCP conn. request listen( )
connect( )
accept(
send( ) TCP ACK
)
recv( )
recv( )
send( )
close( ) close( )
Controlado pelo
desenvolvedor processo processo
da aplicação socket socket
Controlado pelo
sistema TCP internet TCP
operacional
Sun Confidential: Internal Only 48
49. Comunicação sem Conexão
cliente socket( ) socket( )
servidor
bind( ) bind( )
send() recv( )
recv( ) send( )
close( ) close( )
Controlado pelo
desenvolvedor processo processo
da aplicação
socket socket
Controlado pelo
UDP UDP
sistema internet
operacional
Sun Confidential: Internal Only 49
50. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
50
51. Cliente
em Java
Footnote position, 12 pts.
Sun Confidential: Internal Only 51
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 61
65. Relembrando Criação de Threads
• Implementando a Classe Runnable
Footnote position, 12 pts.
Sun Confidential: Internal Only 65
66. Relembrando Criação de Threads
• Extendendo a Classe Thread
Footnote position, 12 pts.
Sun Confidential: Internal Only 66
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 67
84. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
84
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 85
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 86
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 87
88. No Servidor
Sun Confidential: Internal Only 88
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 89
94. Implementar o envio de
dados com DatagramSocket
Sun Confidential: Internal Only 94
95. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
95
96. Observações
Sun Confidential: Internal Only 96
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 97
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 98
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!
Sun Confidential: Internal Only 99
100. Agenda
1 – Motivação
2 – Definição
3 – Protocolos
4 – Modelo Cliente-Servidor
5 – Formas de Comunicação
6 – Estados de um Socket
7 – API Socket - Primitivas
8 – Cliente em Java
9 – Servidor em Java
10 – Servidor Multi-thread
11 – Enviando Objetos
12 – DatagramSocket
13 – Observações
14 – RaceFX
100
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 102
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 104
117. Sockets em Java
Elenils on Vieira
Embaixador de Campus da Sun
Universidade Federal da Paraíba
blogs.sun.com/elenilsonvieira
elenilson.vieira@sun.com
117