You are on page 1of 26

Implementando comunicao em JAVA via Sockets

Alcides Calsavara - alcides@ppgia.pucpr.br Leonardo R. Nunes - leonardo@sumersoft.com

Sockets
Utilizado para comunicao entre processos; Compreendendo Sockets - diagramas:
sockets.pdf socketsgeral.pdf

Sockets
Mecanismo bsico de comunicao sobre IP Fornece trs modos de acesso:
Modo orientado a conexo (connection-oriented):
Socket, ServerSocket;

Modo orientado a datagrama (datagram-oriented):


DatagramSocket, MulticastSocket;

Acesso a dados IP de baixo nvel (raw ip data):


SocketImpl

Modo orientado a conexo (connection-oriented)


Funciona sobre o protocolo TCP/IP Servios confiveis:
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;

Aes para implementar um socket cliente


1 - Abrir a conexo:
import java.io.* ; import java.net.* ; // streams // sockets

Socket clientSocket = new Socket (www.javasoft.com, 80);

Aes para implementar um socket cliente


2 - Pegando os streams de entrada e sada:
DataInputStream inbound = new DataInputStream ( clientSocket.getInputStream( ) ); DataOutputStream outbound = new DataOutputStream ( clientSocket.getOutputStream( ) );

Aes para implementar um socket cliente


3 - Utilizando os streams de entrada e sada:
outbound.writeInt( 3 ); outbound.writeUTF( Hello ); int k = inbound.readInt( );

String s = inbound.readUTF() ;

Aes para implementar um socket cliente


4 Fechando os streams de entrada e sada:
inbound.close () ; outbound.close () ;

5 Fechando o socket:
clientSocket.close() ;

Aes 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 ();

Aes para implementar um socket servidor


3 - Criar streams de entrada e sada do cliente:
DataInputStream inbound = new DataInputStream ( clientSocket.getInputStream( ) ) ; DataOutputStream outbound = new DataOutputStream ( clientSocket.getOutputStream( ) ) ;

Aes para implementar um socket servidor


4 - Conversando com o cliente:
int k = inbound.readInt( );

String s = inbound.readUTF() ; outbound.writeInt( 3 ); outbound.writeUTF( Hello );

Aes para implementar um socket servidor


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

6 - Fechando o socket servidor:


serverSocket.close() ;

Modo orientado a conexo - features


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

Implementaes de alto nvel para protocolos como http, etc...

Modo orientado a datagrama (datagram-oriented)


Funciona sobre o protocolo UDP/IP Servios no confiveis:
Mensagens podem ser perdidas; Ordem das mensagens no garantida;

Cada mensagem um datagrama:


[sender, receiver, contents]

Vantagem:
muito mais rpido que o modo orientado a conexo;

Utilizando datagramas (sender side)


1 - Criao do socket cliente:
// sender socket doesnt need // a special port number DatagramSocket clientSocket = new DatagramSocket () ;

Utilizando datagramas (sender side)


2 - Criando e enviando o datagrama:
InetAddress addr=InetAddress.getByName (www.javasoft.com) ; String toSend = Thats my question! ; byte[] buffer = toSend.getBytes() ; // datagram to receivers port 4545 DatagramPacket question = new DatagramPacket (buffer, buffer.length, addr, 4545) ; clientSocket.send (question) ;

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() ) ;

Utilizando datagramas (sender side)


4 - Fechando o socket
clientSocket.close() ;

Utilizando datagramas (receiver side)


1 - Criando um socket servidor:
// listens on port 4545 DatagramSocket serverSocket = new DatagramSocket (4545) ;

Utilizando datagramas (receiver side)


2 - Recebendo um datagrama:
DatagramPacket question = new DatagramPacket (new byte[512], 512) ; serverSocket.receive (question) ;

Utilizando datagramas (receiver side)


3 - Enviando o datagrama resposta:
String toSend = Thats the answer ! ; byte[] buffer = toSend.getBytes() ; DatagramPacket answer = new DatagramPacket (buffer, buffer.length, question.getAddress()/*sender info*/, question.getPort()/*sender info*/); serverSocket.send (answer) ;

Utilizando datagramas (receiver side)


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

Modo orientado a datagama Multicast


Um grupo Multicast especificado por um endereo IP de classe D (224.0.0.0 at 239.255.255.255, inclusive) e uma porta UDP. O endereo 224.0.0.0 reservado e no 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);

Sockets sobre IP - TCP e UDP


Algumas configuraes:
Timeout do Sistema Operacional; Utilizao de buffers; KeepAlive; etc ...

Acesso a dados IP de baixo nvel


Java possibilita acesso a algumas configuraes ip, mas no permite raw sockets. SocketImplFactory SocketImpl SocketOptions

Principais novidades do J2SE v1.4


Suporte IPv6 SocketChannel
Stream-oriented connecting sockets. Operaes assncronas Maior controle de execuo e recursos (possibilidade de accept no bloqueante)

Suporte a Secure Socket Layer Maiores detalhes:


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

You might also like