Mini-Curso de Sockets no Unipê

Post on 18-Nov-2014

3.568 views 1 download

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/elenilsonvieiraelenilson.vieira@sun.com

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/elenilsonvieiraelenilson.vieira@sun.com

117