Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Implementando comunicação em JAVA via Sockets Alcides Calsavara - alcides@ppgia.pucpr.br Leonardo R. Nunes - leonardo@sume...
Sockets <ul><li>Utilizado para comunicação entre processos; </li></ul><ul><li>Compreendendo Sockets - diagramas: </li></ul...
Sockets <ul><li>Mecanismo básico de comunicação sobre IP </li></ul><ul><li>Fornece três modos de acesso: </li></ul><ul><ul...
Modo orientado a conexão (connection-oriented) <ul><li>Funciona sobre o protocolo TCP/IP </li></ul><ul><li>Serviços confiá...
Ações para implementar um  socket cliente <ul><li>1 - Abrir a conexão: </li></ul><ul><ul><li>import java.io.* ;  // stream...
Ações para implementar um  socket cliente <ul><li>2 - Pegando os streams de entrada e saída: </li></ul><ul><li>DataInputSt...
Ações para implementar um  socket cliente <ul><li>3 - Utilizando os streams de entrada e saída: </li></ul><ul><ul><li>outb...
Ações para implementar um  socket cliente <ul><li>4 – Fechando os streams de entrada e saída: </li></ul><ul><ul><li>inboun...
Ações para implementar um  socket servidor <ul><li>1 - Criar o server socket: </li></ul><ul><ul><li>ServerSocket  serverSo...
Ações para implementar um  socket servidor <ul><li>3 - Criar streams de entrada e saída do cliente: </li></ul><ul><li>Data...
Ações para implementar um  socket servidor <ul><li>4 - Conversando com o cliente: </li></ul><ul><ul><li>int k =    inbound...
Ações para implementar um  socket servidor <ul><li>5 - Fechando streams e socket cliente: </li></ul><ul><ul><li>inbound .c...
Modo orientado a conexão - features <ul><li>Possibilidade de sockets unidirecional: </li></ul><ul><ul><li>socket.shutdownI...
Modo orientado a datagrama (datagram-oriented) <ul><li>Funciona sobre o protocolo UDP/IP </li></ul><ul><li>Serviços não co...
Utilizando datagramas (sender side) <ul><li>1 - Criação do socket cliente: </li></ul><ul><ul><li>// sender socket doesn’t ...
Utilizando datagramas (sender side) <ul><li>2 - Criando e enviando o datagrama: </li></ul><ul><ul><li>InetAddress addr=Ine...
Utilizando datagramas (sender side) <ul><li>3 - Recebendo e abrindo uma resposta: </li></ul><ul><ul><li>DatagramPacket  an...
Utilizando datagramas (sender side) <ul><li>4 - Fechando  o socket </li></ul><ul><ul><li>clientSocket .close() ; </li></ul...
Utilizando datagramas (receiver side) <ul><li>1 - Criando um socket servidor: </li></ul><ul><ul><li>// listens on port 454...
Utilizando datagramas (receiver side) <ul><li>2 - Recebendo um datagrama: </li></ul><ul><ul><li>DatagramPacket  question  ...
Utilizando datagramas (receiver side) <ul><li>3 - Enviando o datagrama resposta: </li></ul><ul><ul><li>String toSend = “ T...
Utilizando datagramas (receiver side) <ul><li>4 - Fechando o socket servidor: </li></ul><ul><ul><li>serverSocket .close() ...
Modo orientado a datagama – Multicast <ul><li>Um grupo “Multicast” é especificado por um endereço IP de classe “D” (224.0....
Sockets sobre IP - TCP e UDP <ul><li>Algumas configurações: </li></ul><ul><ul><li>Timeout do Sistema Operacional; </li></u...
Acesso a dados IP de baixo nível <ul><li>Java possibilita acesso a algumas configurações ip, mas não permite raw sockets. ...
Principais novidades do J2SE v1.4 <ul><li>Suporte à IPv6 </li></ul><ul><li>SocketChannel </li></ul><ul><ul><li>Stream-orie...
Upcoming SlideShare
Loading in …5
×

Sockets java

1,316 views

Published on

  • Be the first to comment

  • Be the first to like this

Sockets java

  1. 1. Implementando comunicação em JAVA via Sockets Alcides Calsavara - alcides@ppgia.pucpr.br Leonardo R. Nunes - leonardo@sumersoft.com
  2. 2. Sockets <ul><li>Utilizado para comunicação entre processos; </li></ul><ul><li>Compreendendo Sockets - diagramas: </li></ul><ul><ul><li>sockets.pdf </li></ul></ul><ul><ul><li>socketsgeral.pdf </li></ul></ul>
  3. 3. Sockets <ul><li>Mecanismo básico de comunicação sobre IP </li></ul><ul><li>Fornece três modos de acesso: </li></ul><ul><ul><li>Modo orientado a conexão (connection-oriented): </li></ul></ul><ul><ul><ul><li>Socket, ServerSocket; </li></ul></ul></ul><ul><ul><li>Modo orientado a datagrama (datagram-oriented): </li></ul></ul><ul><ul><ul><li>DatagramSocket, MulticastSocket; </li></ul></ul></ul><ul><ul><li>Acesso a dados IP de baixo nível (raw ip data): </li></ul></ul><ul><ul><ul><li>SocketImpl </li></ul></ul></ul>
  4. 4. Modo orientado a conexão (connection-oriented) <ul><li>Funciona sobre o protocolo TCP/IP </li></ul><ul><li>Serviços confiáveis: </li></ul><ul><ul><li>Sem perdas de dados na rede; </li></ul></ul><ul><ul><li>Garantia de ordem dos pacotes; </li></ul></ul><ul><li>“ Data streams” podem ser utilizados </li></ul><ul><li>Desvantagens: </li></ul><ul><ul><li>É mais lento que o modo orientado a datagrama; </li></ul></ul><ul><ul><li>Comportamento servidor diferente do comportamento cliente; </li></ul></ul>
  5. 5. Ações para implementar um socket cliente <ul><li>1 - Abrir a conexão: </li></ul><ul><ul><li>import java.io.* ; // streams </li></ul></ul><ul><ul><li>import java.net.* ; // sockets </li></ul></ul><ul><ul><li>Socket clientSocket = new Socket </li></ul></ul><ul><ul><ul><li>(“www.javasoft.com”, 80); </li></ul></ul></ul>
  6. 6. Ações para implementar um socket cliente <ul><li>2 - Pegando os streams de entrada e saída: </li></ul><ul><li>DataInputStream inbound = new DataInputStream </li></ul><ul><li>( clientSocket .getInputStream( ) ); </li></ul><ul><li>DataOutputStream outbound = new DataOutputStream </li></ul><ul><li>( clientSocket .getOutputStream( ) ); </li></ul>
  7. 7. Ações para implementar um socket cliente <ul><li>3 - Utilizando os streams de entrada e saída: </li></ul><ul><ul><li>outbound .writeInt( 3 ); </li></ul></ul><ul><ul><li>outbound .writeUTF( “Hello” ); </li></ul></ul><ul><ul><li>int k = inbound .readInt( ); </li></ul></ul><ul><ul><li>String s = inbound .readUTF() ; </li></ul></ul>
  8. 8. Ações para implementar um socket cliente <ul><li>4 – Fechando os streams de entrada e saída: </li></ul><ul><ul><li>inbound .close () ; </li></ul></ul><ul><ul><li>outbound .close () ; </li></ul></ul><ul><li>5 – Fechando o socket: </li></ul><ul><ul><li>clientSocket .close() ; </li></ul></ul>
  9. 9. Ações para implementar um socket servidor <ul><li>1 - Criar o server socket: </li></ul><ul><ul><li>ServerSocket serverSocket = </li></ul></ul><ul><ul><li>new ServerSocket (80, 5); </li></ul></ul><ul><li>2 - Aguardar conexoes de clientes: </li></ul><ul><ul><li>Socket clientSocket = </li></ul></ul><ul><ul><li>serverSocket .accept (); </li></ul></ul>
  10. 10. Ações para implementar um socket servidor <ul><li>3 - Criar streams de entrada e saída do cliente: </li></ul><ul><li>DataInputStream inbound = new DataInputStream </li></ul><ul><li>( clientSocket .getInputStream( ) ) ; </li></ul><ul><li>DataOutputStream outbound = new DataOutputStream </li></ul><ul><li>( clientSocket .getOutputStream( ) ) ; </li></ul>
  11. 11. Ações para implementar um socket servidor <ul><li>4 - Conversando com o cliente: </li></ul><ul><ul><li>int k = inbound .readInt( ); </li></ul></ul><ul><ul><li>String s = inbound .readUTF() ; </li></ul></ul><ul><ul><li>outbound .writeInt( 3 ); </li></ul></ul><ul><ul><li>outbound .writeUTF( “Hello” ); </li></ul></ul>
  12. 12. Ações para implementar um socket servidor <ul><li>5 - Fechando streams e socket cliente: </li></ul><ul><ul><li>inbound .close () ; </li></ul></ul><ul><ul><li>outbound .close () ; </li></ul></ul><ul><ul><li>clientSocket .close() ; </li></ul></ul><ul><li>6 - Fechando o socket servidor: </li></ul><ul><ul><li>serverSocket .close() ; </li></ul></ul>
  13. 13. Modo orientado a conexão - features <ul><li>Possibilidade de sockets unidirecional: </li></ul><ul><ul><li>socket.shutdownInput(); </li></ul></ul><ul><ul><li>socket.shutdownOutput(); </li></ul></ul><ul><li>Implementações de alto nível para protocolos como http, etc... </li></ul>
  14. 14. Modo orientado a datagrama (datagram-oriented) <ul><li>Funciona sobre o protocolo UDP/IP </li></ul><ul><li>Serviços não confiáveis: </li></ul><ul><ul><li>Mensagens podem ser perdidas; </li></ul></ul><ul><ul><li>Ordem das mensagens não garantida; </li></ul></ul><ul><li>Cada mensagem é um datagrama: </li></ul><ul><ul><li>[sender, receiver, contents] </li></ul></ul><ul><li>Vantagem: </li></ul><ul><ul><li>É muito mais rápido que o modo orientado a conexão; </li></ul></ul>
  15. 15. Utilizando datagramas (sender side) <ul><li>1 - Criação do socket cliente: </li></ul><ul><ul><li>// sender socket doesn’t need </li></ul></ul><ul><ul><li>// a special port number </li></ul></ul><ul><ul><li>DatagramSocket clientSocket = </li></ul></ul><ul><ul><li>new DatagramSocket () ; </li></ul></ul>
  16. 16. Utilizando datagramas (sender side) <ul><li>2 - Criando e enviando o datagrama: </li></ul><ul><ul><li>InetAddress addr=InetAddress.getByName </li></ul></ul><ul><ul><li>(“www.javasoft.com”) ; </li></ul></ul><ul><ul><li>String toSend = “ That’s my question! ” ; </li></ul></ul><ul><ul><li>byte[] buffer = toSend.getBytes() ; </li></ul></ul><ul><ul><li>// datagram to receiver’s port 4545 </li></ul></ul><ul><ul><li>DatagramPacket question = new DatagramPacket (buffer, buffer.length, addr, 4545) ; </li></ul></ul><ul><ul><li>clientSocket .send ( question ) ; </li></ul></ul>
  17. 17. Utilizando datagramas (sender side) <ul><li>3 - Recebendo e abrindo uma resposta: </li></ul><ul><ul><li>DatagramPacket answer = new </li></ul></ul><ul><ul><li>DatagramPacket (new byte[512], 512); </li></ul></ul><ul><ul><li>clientSocket .receive ( answer ) ; </li></ul></ul><ul><ul><li>System.out.println ( answer .getData() </li></ul></ul><ul><ul><li>+ “n” + answer .getLength() </li></ul></ul><ul><ul><li>+ “n” + answer .getAddress() </li></ul></ul><ul><ul><li>+ “n” + answer .getPort() ) ; </li></ul></ul>
  18. 18. Utilizando datagramas (sender side) <ul><li>4 - Fechando o socket </li></ul><ul><ul><li>clientSocket .close() ; </li></ul></ul>
  19. 19. Utilizando datagramas (receiver side) <ul><li>1 - Criando um socket servidor: </li></ul><ul><ul><li>// listens on port 4545 </li></ul></ul><ul><ul><li>DatagramSocket serverSocket = </li></ul></ul><ul><ul><li>new DatagramSocket (4545) ; </li></ul></ul>
  20. 20. Utilizando datagramas (receiver side) <ul><li>2 - Recebendo um datagrama: </li></ul><ul><ul><li>DatagramPacket question = new </li></ul></ul><ul><ul><li>DatagramPacket (new byte[512], 512) ; </li></ul></ul><ul><ul><li>serverSocket .receive ( question ) ; </li></ul></ul>
  21. 21. Utilizando datagramas (receiver side) <ul><li>3 - Enviando o datagrama resposta: </li></ul><ul><ul><li>String toSend = “ That’s the answer ! ” ; </li></ul></ul><ul><ul><li>byte[] buffer = toSend.getBytes() ; </li></ul></ul><ul><ul><li>DatagramPacket answer = new </li></ul></ul><ul><ul><li>DatagramPacket (buffer, buffer.length, </li></ul></ul><ul><ul><li>question .getAddress()/*sender info*/, </li></ul></ul><ul><ul><li>question .getPort()/*sender info*/); </li></ul></ul><ul><ul><li>serverSocket .send ( answer ) ; </li></ul></ul>
  22. 22. Utilizando datagramas (receiver side) <ul><li>4 - Fechando o socket servidor: </li></ul><ul><ul><li>serverSocket .close() ; </li></ul></ul>
  23. 23. Modo orientado a datagama – Multicast <ul><li>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. </li></ul><ul><li>O endereço 224.0.0.0 é reservado e não deve ser usado. </li></ul><ul><li>MulticastSocket: </li></ul><ul><li>InetAddress group = InetAddress.getByName(&quot;228.5.6.7&quot;); </li></ul><ul><li>MulticastSocket s = new MulticastSocket(6789); </li></ul><ul><li>s. joinGroup (group); </li></ul><ul><li>// Envia e recebe mensagens. </li></ul><ul><li>s. leaveGroup (group); </li></ul>
  24. 24. Sockets sobre IP - TCP e UDP <ul><li>Algumas configurações: </li></ul><ul><ul><li>Timeout do Sistema Operacional; </li></ul></ul><ul><ul><li>Utilização de buffers; </li></ul></ul><ul><ul><li>KeepAlive; </li></ul></ul><ul><ul><li>etc ... </li></ul></ul>
  25. 25. Acesso a dados IP de baixo nível <ul><li>Java possibilita acesso a algumas configurações ip, mas não permite raw sockets. </li></ul><ul><ul><li>SocketImplFactory </li></ul></ul><ul><ul><li>SocketImpl </li></ul></ul><ul><ul><li>SocketOptions </li></ul></ul>
  26. 26. Principais novidades do J2SE v1.4 <ul><li>Suporte à IPv6 </li></ul><ul><li>SocketChannel </li></ul><ul><ul><li>Stream-oriented connecting sockets. </li></ul></ul><ul><ul><li>Operações assíncronas </li></ul></ul><ul><ul><li>Maior controle de execução e recursos (possibilidade de accept não bloqueante) </li></ul></ul><ul><li>Suporte a Secure Socket Layer </li></ul><ul><li>Maiores detalhes: </li></ul><ul><ul><li>%JAVA_HOME%/docs/guide/net/enhancements14.html </li></ul></ul>

×