Title: Implementando comunica
1Implementando comunicação em JAVA via Sockets
- Alcides Calsavara - alcides_at_ppgia.pucpr.br
- Leonardo R. Nunes - leonardo_at_sumersoft.com
2Sockets
- Utilizado para comunicação entre processos
- Compreendendo Sockets - diagramas
- sockets.pdf
- socketsgeral.pdf
3Sockets
- 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
4Modo 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
5Açõ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)
6Açõ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( ) )
7Açõ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()
8Açõ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()
9Açõ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 ()
10Açõ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( ) )
11Açõ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 )
12Açõ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()
13Modo orientado a conexão - features
- Possibilidade de sockets unidirecional
- socket.shutdownInput()
- socket.shutdownOutput()
- Implementações de alto nível para protocolos como
http, etc...
14Modo 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
15Utilizando datagramas (sender side)
- 1 - Criação do socket cliente
- // sender socket doesnt need
- // a special port number
- DatagramSocket clientSocket
- new DatagramSocket ()
16Utilizando datagramas (sender side)
- 2 - Criando e enviando o datagrama
- InetAddress addrInetAddress.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)
17Utilizando datagramas (sender side)
- 3 - Recebendo e abrindo uma resposta
- DatagramPacket answer new
- DatagramPacket (new byte512, 512)
- clientSocket.receive (answer)
- System.out.println (answer.getData()
- \n answer.getLength()
- \n answer.getAddress()
- \n answer.getPort() )
18Utilizando datagramas (sender side)
- 4 - Fechando o socket
- clientSocket.close()
19Utilizando datagramas (receiver side)
- 1 - Criando um socket servidor
- // listens on port 4545
- DatagramSocket serverSocket
- new DatagramSocket (4545)
20Utilizando datagramas (receiver side)
- 2 - Recebendo um datagrama
- DatagramPacket question new
- DatagramPacket (new byte512, 512)
- serverSocket.receive (question)
21Utilizando 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)
22Utilizando datagramas (receiver side)
- 4 - Fechando o socket servidor
- serverSocket.close()
23Modo 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)
24Sockets sobre IP - TCP e UDP
- Algumas configurações
- Timeout do Sistema Operacional
- Utilização de buffers
- KeepAlive
- etc ...
25Acesso a dados IP de baixo nível
- Java possibilita acesso a algumas configurações
ip, mas não permite raw sockets. - SocketImplFactory
- SocketImpl
- SocketOptions
26Principais 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