sockets java

26
Implementando comunicação em JAVA via Sockets Alcides Calsavara - [email protected] Leonardo R. Nunes - [email protected]

Upload: thiago-matos

Post on 20-Nov-2014

1.382 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Sockets java

Implementando comunicação em JAVA via Sockets

Alcides Calsavara - [email protected] R. Nunes - [email protected]

Page 2: Sockets java

Sockets

Utilizado para comunicação entre processos;

Compreendendo Sockets - diagramas: sockets.pdf socketsgeral.pdf

Page 3: Sockets java

Sockets

Mecanismo básico de comunicação sobre IP Fornece três modos de acesso:

Modo orientado a conexão (connection-oriented): Socket, ServerSocket;

Modo orientado a datagrama (datagram-oriented): DatagramSocket, MulticastSocket;

Acesso a dados IP de baixo nível (raw ip data): SocketImpl

Page 4: Sockets java

Modo orientado a conexão (connection-oriented)

Funciona sobre o protocolo TCP/IP Serviços confiáveis:

Sem perdas de dados na rede; Garantia de ordem dos pacotes;

“Data streams” podem ser utilizados Desvantagens:

É mais lento que o modo orientado a datagrama; Comportamento servidor diferente do comportamento cliente;

Page 5: Sockets java

Ações para implementar um socket cliente

1 - Abrir a conexão:

import java.io.* ; // streams

import java.net.* ; // sockets

Socket clientSocket = new Socket

(“www.javasoft.com”, 80);

Page 6: Sockets java

Ações para implementar um socket cliente

2 - Pegando os streams de entrada e saída:

DataInputStream inbound = new DataInputStream

( clientSocket.getInputStream( ) );

DataOutputStream outbound = new DataOutputStream

( clientSocket.getOutputStream( ) );

Page 7: Sockets java

Ações para implementar um socket cliente

3 - Utilizando os streams de entrada e saída:

outbound.writeInt( 3 );

outbound.writeUTF( “Hello” );

int k = inbound.readInt( );

String s = inbound.readUTF() ;

Page 8: Sockets java

Ações para implementar um socket cliente

4 – Fechando os streams de entrada e saída:

inbound.close () ;

outbound.close () ;

5 – Fechando o socket:

clientSocket.close() ;

Page 9: Sockets java

Ações para implementar um socket servidor

1 - Criar o server socket:ServerSocket serverSocket =

new ServerSocket (80, 5);

2 - Aguardar conexoes de clientes:Socket clientSocket =

serverSocket.accept ();

Page 10: Sockets java

Ações para implementar um socket servidor

3 - Criar streams de entrada e saída do cliente:

DataInputStream inbound = new DataInputStream

( clientSocket.getInputStream( ) ) ;

DataOutputStream outbound = new DataOutputStream

( clientSocket.getOutputStream( ) ) ;

Page 11: Sockets java

Ações para implementar um socket servidor

4 - Conversando com o cliente:

int k = inbound.readInt( );

String s = inbound.readUTF() ;

outbound.writeInt( 3 );

outbound.writeUTF( “Hello” );

Page 12: Sockets java

Ações para implementar um socket servidor

5 - Fechando streams e socket cliente:inbound.close () ;

outbound.close () ;

clientSocket.close() ;

6 - Fechando o socket servidor:serverSocket.close() ;

Page 13: Sockets java

Modo orientado a conexão - features

Possibilidade de sockets unidirecional: socket.shutdownInput(); socket.shutdownOutput();

Implementações de alto nível para protocolos como http, etc...

Page 14: Sockets java

Modo orientado a datagrama (datagram-oriented)

Funciona sobre o protocolo UDP/IP Serviços não confiáveis:

Mensagens podem ser perdidas; Ordem das mensagens não garantida;

Cada mensagem é um datagrama: [sender, receiver, contents]

Vantagem: É muito mais rápido que o modo orientado a conexão;

Page 15: Sockets java

Utilizando datagramas (sender side)

1 - Criação do socket cliente:

// sender socket doesn’t need

// a special port number

DatagramSocket clientSocket =

new DatagramSocket () ;

Page 16: Sockets java

Utilizando datagramas (sender side)

2 - Criando e enviando o datagrama:

InetAddress addr=InetAddress.getByName

(“www.javasoft.com”) ;

String toSend = “That’s my question!” ;

byte[] buffer = toSend.getBytes() ;

// datagram to receiver’s port 4545

DatagramPacket question = new DatagramPacket (buffer, buffer.length, addr, 4545) ;

clientSocket.send (question) ;

Page 17: Sockets java

Utilizando datagramas (sender side)

3 - Recebendo e abrindo uma resposta:

DatagramPacket answer = new

DatagramPacket (new byte[512], 512);

clientSocket.receive (answer) ;

System.out.println (answer.getData()

+ “\n” + answer.getLength()

+ “\n” + answer.getAddress()

+ “\n” + answer.getPort() ) ;

Page 18: Sockets java

Utilizando datagramas (sender side)

4 - Fechando o socket

clientSocket.close() ;

Page 19: Sockets java

Utilizando datagramas (receiver side)

1 - Criando um socket servidor:

// listens on port 4545

DatagramSocket serverSocket =

new DatagramSocket (4545) ;

Page 20: Sockets java

Utilizando datagramas (receiver side)

2 - Recebendo um datagrama:

DatagramPacket question = new

DatagramPacket (new byte[512], 512) ;

serverSocket.receive (question) ;

Page 21: Sockets java

Utilizando datagramas (receiver side)

3 - Enviando o datagrama resposta:

String toSend = “That’s the answer !” ;

byte[] buffer = toSend.getBytes() ;

DatagramPacket answer = new

DatagramPacket (buffer, buffer.length,

question.getAddress()/*sender info*/,

question.getPort()/*sender info*/);

serverSocket.send (answer) ;

Page 22: Sockets java

Utilizando datagramas (receiver side)

4 - Fechando o socket servidor:

serverSocket.close() ;

Page 23: Sockets java

Modo orientado a datagama – Multicast

Um grupo “Multicast” é especificado por um endereço IP de classe “D” (224.0.0.0 até 239.255.255.255, inclusive) e uma porta UDP.

O endereço 224.0.0.0 é reservado e não deve ser usado.

MulticastSocket: InetAddress group = InetAddress.getByName("228.5.6.7");

MulticastSocket s = new MulticastSocket(6789);

s.joinGroup(group);

// Envia e recebe mensagens.

s.leaveGroup(group);

Page 24: Sockets java

Sockets sobre IP - TCP e UDP

Algumas configurações: Timeout do Sistema Operacional; Utilização de buffers; KeepAlive; etc ...

Page 25: Sockets java

Acesso a dados IP de baixo nível

Java possibilita acesso a algumas configurações ip, mas não permite raw sockets. SocketImplFactory SocketImpl SocketOptions

Page 26: Sockets java

Principais novidades do J2SE v1.4

Suporte à IPv6 SocketChannel

Stream-oriented connecting sockets. Operações assíncronas Maior controle de execução e recursos (possibilidade de accept

não bloqueante)

Suporte a Secure Socket Layer Maiores detalhes:

%JAVA_HOME%/docs/guide/net/enhancements14.html