com sockets (em Java) Prof. Dr. Julio Arakaki Depto. Ciência da 1 Comunicação entre processos // aplicações - é um dos mecanismos mais utilizados - Java oferece modos de utilização:. TCP ( Transmission Control Protocol ) orientado a conexão. UDP ( User Datagram Protocol ) orientado a datagrama. Entre outros Funcionam sobre o protocolo IP ( Internet Protocol ) 2 1
Principais protocolos (Rede/Internet) Camadas HTTP FTP DNS RPC... Aplicação Usuários TCP UDP Transporte SOs ICMP IP IGMP Rede Hardware Enlace 3 Identificação na na rede 20345 20348 TCP 15398 10340 UDP 6970 protocolo = 6 protocolo = 17 Internet ssh.cin.ufpe.br 150.161.2.106 procololo = 6 = 22 host-0-13.re.apartnet.br.inter.net 200.199.75.13 www.uol.com.br 200.221.8.18 procololo = 6 = 80 www.bbc.co.uk 212.58.224.61 protocolo = 17 = 44585 servidor DNS 200.185.56.49 protocol = 17 = 53 4 2
(em Rede/Internet) Sockets envia/recebe (send/receive) Característica: eficiência RPC ( Remote Procedure Call ) Chamada remota de procedimento Característica: transparência e facilidade de programação Objetos distribuídos Características: transparência, facilidade e todos os benefícios da programação orientada a objetos, execução mais lenta Exemplos: DCOM, CORBA, Java RMI, EJB, Servlets, Frameworks (Struts, Spring,...), Web Services, etc. 5 Sockets BSD Unix Interface padrão para comunicação entre processos em redes TCP/IP Implementação no SO: Unix de Berkeley A maioria dos SOs implementam os sockets Programar com sockets pode ser visto como: Desenvolver um protocolo de Comunicação 6 3
Serviço com conexão Principais tipos de de sockets Implementa um stream de dados (SOCK_STREAM) Protocolo TCP (tipicamente) Serviço sem conexão Implementa um serviço de datagramas (SOCK_DGRAM) Protocolo UDP (tipicamente) Acessa diretamente a camada de rede (SOCK_RAW) Serviço de baixo nível Protocolo IP (tipicamente) 7 socket connect write read close bind listen accept Principais funções da da API de de Sockets Cria um novo descritor para comunicação Iniciar conexão com servidor Escreve dados em uma conexão Lê dados de uma conexão Fecha a conexão Atribui um endereço IP e uma a um socket Coloca o socket em modo passivo, para escutar s Bloqueia o servidor até chegada de requisição de conexão recvfrom Recebe um datagrama e guarda o endereço do emissor sendto Envia um datagrama especificando o endereço 8 4
Server socket () bind () Serviço com conexão (TCP) listen () accept () blocked read () write () close () Conexão Solicitação Resposta Client socket () connect () write () read () close () 9 Serviço sem conexão (UDP) Server socket () Baseado em troca de mensagens (datagrama): [sender.maq1, receiver.maq2, content: mensagem ] bind () recvfrom () blocked Client socket () Solicitação sendto () sendto () close () Resposta recvfrom () close () 10 5
Servidor (estrutura típica) 11 Codificação de de s Codificação (valores/significado/utilização) de de s 1-255 256-1023 1-1023 1024-4999 5000 - reservadas para serviços padrão s bem conhecidas reservado para serviços Unix Somente podem ser usadas por usuários privilegiados (super-usuário) Usadas por processos de sistema e de usuário Usadas somente por processos de usuário 12 6
Sockets em Java Em Java, algumas chamadas (de funções) são automáticas Exemplos: Socket: equivalente a socket e bind ServerSocket: equivalente a socket, bind e listen Sockets são implementados no pacote java.net O envio e a recepção dos dados são realizados através de classes do pacote java.io de maneira semelhante à escrita e leitura em arquivos DataInputStream, DataOutputStream, etc. 13 Servidor TCP... public static void main(string[] args) { try { ServerSocket s = new ServerSocket(9999); String str; while (true) { Socket c = s.accept(); InputStream i = c.getinputstream(); OutputStream o = c.getoutputstream(); do { byte[] line = new byte[100]; i.read(line); o.write(line); str = new String(line); while (!str.trim().equals("bye") ); c.close(); catch (Exception err){ System.err.println(err);... 14 7
Cliente TCP public static void main(string[] args) { try { Socket s = new Socket("127.0.0.1", 9999); InputStream i = s.getinputstream(); OutputStream o = s.getoutputstream(); String str; do { byte[] line = new byte[100]; System.in.read(line); o.write(line); i.read(line); str = new String(line); System.out.println(str.trim()); while (!str.trim().equals("bye") ); s.close(); catch (Exception err) { System.err.println(err); 15 Servidor UDP import java.net.*; import java.util.*; class ServidorUDP { public static void main( String args[] ) throws Exception { DatagramSocket socket = new DatagramSocket(7); DatagramPacket packet = new DatagramPacket(new byte[512],512); while ( true ) { socket.receive( packet ); System.out.println( ""+new Date()+""+packet.getAddress()+ ":"+packet.getport()+" mensagem = "+ new String(packet.getData(),0,packet.getLength()) ); socket.send( packet ); 16 8
import java.net.*; import java.util.*; class ClienteUDP { Cliente UDP public static void main( String args[] ) throws Exception { DatagramSocket socket = new DatagramSocket(); socket.setsotimeout( 5000 ); String mens = "12314315145125231523535"; byte[] buffer = mens.getbytes(); DatagramPacket packet = new DatagramPacket( buffer,buffer.length,inetaddress.getbyname("localhost"),7); socket.send( packet ); Date timesent = new Date(); socket.receive( packet ); Date timereceived = new Date(); System.out.println( ""+ (timereceived.gettime()-timesent.gettime())+" ms "+ new String(packet.getData(),0,packet.getLength()) ); 17 9