Comunicação entre processos Processo: um programa em execução num sistema terminal (host) Processos em sistemas distintos comunicam trocando mensagens Processo Cliente: processo que inicia a comunicação Processo Servidor: processo que espera passivamente até ser contactado por um cliente Nota: As aplicações P2P usam simultaneamente processos cliente e processos servidor 4/28/09 Universidade do Minho 1
SOCKETS Processos enviam e recebem mensagens através de um socket O socket é equivalente a uma porta O processo que envia faz sair as mensagens pela porta (socket) e confia na infra-estrtutura de transporte que está do outro lado da porta para levar a mensagem até ao processo que recebe O processo que recebe as mensagens também o faz através de uma porta (socket) 4/28/09 Universidade do Minho 2
Endereçamento Para receber ou enviar mensagens os processos precisam de um identificador Os sistemas já possuem endereços IP Mas serão suficientes para endereçar os processos? Obviamente que não: correm múltiplos processos em simultâneo em cada sistema! 4/28/09 Universidade do Minho 3 identificador inclui endereço IP e número de porta associado ao processo. Exemplos de portas bem conhecidas: Servidor HTTP: 80 Servidor de Mail: 25 Para enviar uma mensagem a um servidor Web é preciso: IP: 128.119.245.12 Porta: 80
Aplicações definem Tipos de mensagens que trocam, Ex: request, response Sintaxe das mensagens: Que campos vai ter cada mensagem e como são delimitados Semântica das mensagens Significado da informação contida em cada campo Regras temporais que definem quando e como deve um processo responder às mensagens que recebe 4/28/09 Universidade do Minho 4
Que serviço de transporte usar? Tolerância a perdas Algumas aplicações (ex: audio) toleram algumas perdas Outras (ex: transferência de ficheiros, telnet) requerem que a transferência seja Sensibilidade 100% fiável aos atrasos Algumas aplicações (ex: telefonia IP) requerem que os atrasos sejam baixos Consumo de Largura de Banda Algumas aplicações (ex: multimedia) exigem uma largura de banda mínima para poderem funcionar Outras ( aplicações elásticas ) utilizam a largura e banda que houver disponível 4/28/09 Universidade do Minho 5
Serviços de transporte na Internet Serviço de transporte TCP: Orientado à conexão Transporte fiável Controlo de fluxo Controlo de congestão Não assegura atrasos nem largura de banda mínimos Serviço de transporte UDP: Transferência não fiável Não oferece mais nada 4/28/09 Universidade do Minho 6
Programação com Sockets Objectivo: construir aplicações cliente/servidor que usam sockets Socket API Introduzida no UNIX BSD4.1 em 1981 Os sockets devem ser explicitamente criadosm usados e livbertados pelas aplicações Paradigma cliente/servidor Dois tipos de serviço de transporte: Datagrama não fiável Stream fiável socket Uma interface local a um sistema, criado pelas aplicações, controlado pelo sistema operativo (uma porta ) na qual um processo de aplicação pode simultaneamente enviar e receber mensagens de outros processos 4/28/09 Universidade do Minho 7
Programação usando Sockets TCP Socket: uma porta entre o processo que executa a aplicação e o protocolo de transporte fim-a-fim (UCP or TCP) TCP service: serviço de transferência de bytes fiável de um processo para outro Controlado pelo programador da aplicação Controlado pelo Sistema Operativo processo socket TCP com buffers e variáveis internet processo socket TCP com buffers e variáveis Controlado pelo programador da aplicação Controlado pelo Sistema Operativo Cliente ou servidor Cliente ou servidor 4/28/09 Universidade do Minho 8
Programação usando Sockets TCP O Cliente deve contactar o servidor O processo servidor deve estar a correr O Servidor deve ter criado um socketc que aguarda pedidos de clientes Os Clientes contactam o servidor da seguinte forma: Criam um socket TCP local ao cliente. Especificam o endereço IP e o número da porta do processo servidor Estabelecem a ligação com o processo servidor. 4/28/09 Universidade do Minho 9 Quando contactado pelo cliente o servidor TCP cria um socket para que o processo servidor comunique com o cliente: Permite que o servidor contacte com múltiplos clientes O número da porta origem Ponto é de usado vista para da aplicação distinguir os diferentes clientes. O TCP disponibiliza um serviço de transferência fiável de bytes entre cliente e servidor
Programação usando Sockets TCP Streams Uma stream é uma sequência de caracteres que flui para dentro ou fora de um processo Uma input stream está associada a uma fonte de input do processo, por exemplo o teclado (standard input) ou um socket Uma output stream está associada a uma fonte de saída, por exemplo o monitor (standard output) ou um socket 4/28/09 Universidade do Minho 10
Programação usando Sockets TCP Exemplo de uma aplicação cliente-servidor 1) O cliente lé uma linha do standard input (infromuser stream),e envia a linha lida para o servidor via socket (outtoserver stream) 2) O servidor lê a linha do socket 3) Converte tudo para maiúsculas, e envia a linha de volta para o cliente 4) O cliente lê a linha modificada do socket (infromserver stream) e imprimi-a. Client process client TCP socket 4/28/09 Universidade do Minho 11
Interacção Cliente/Servidor usando sockets TCP Servidor (em execução no hostid) create socket, port=x, for incoming request: welcomesocket = ServerSocket() wait for incoming connection request connectionsocket = welcomesocket.accept() read request from connectionsocket write reply to connectionsocket close connectionsocket TCP Estabelecimento da ligação Cliente create socket, connect to hostid, port=x clientsocket = Socket() send request using clientsocket read reply from clientsocket close clientsocket 4/28/09 Universidade do Minho 12
Exemplo de um Cliente Java import java.io.*; import java.net.*; class TCPClient { Cria input stream Cria Socket cliente, ligado ao servidor Cria output stream associada ao socket public static void main(string argv[]) throws Exception { String sentence; String modifiedsentence; BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); Socket clientsocket = new Socket("hostname", 6789); PrintWriter outtoserver = new PrintWriter(clientSocket.getOutputStream(), true); 4/28/09 Universidade do Minho 13
Exemplo de um Cliente Java TCP (2) Cria input stream associada ao socket BufferedReader infromserver = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = infromuser.readline(); Envia linha para o servidor Lê linha do servidor outtoserver.println(sentence + '\n'); modifiedsentence = infromserver.readline(); System.out.println("FROM SERVER: " + modifiedsentence); clientsocket.close(); } } 4/28/09 Universidade do Minho 14
Exemplo de um Servidor Java (TCP) import java.io.*; import java.net.*; class TCPServer { Cria um socket à escuta na porta 6789 Espera por qualquer contacto por parte de um cliente Cria input stream, associada ao socket public static void main(string argv[]) throws Exception { String clientsentence; String capitalizedsentence; ServerSocket welcomesocket = new ServerSocket(6789); while(true) { Socket connectionsocket = welcomesocket.accept(); BufferedReader infromclient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 4/28/09 Universidade do Minho 15
Exemplo de um Servidor Java TCP (2) Cria output stream, associada ao socket PrintWriter outtoclient = new PrintWriter(connectionSocket.getOutputStream(), true); Lê uma linha do socket Escreve uma linha no socket } } } clientsentence = infromclient.readline(); capitalizedsentence = clientsentence.touppercase() + '\n'; outtoclient.println(capitalizedsentence); Fim do ciclo while, volta ao início e espera novo pedido de outro cilente 4/28/09 Universidade do Minho 16
Programação usando Sockets UDP UDP: não existe uma ligação estabelecida entre o cliente e o servidor sem handshaking o emissor (cliente) associa explicitamente a cada pacote o endereço IP e porta do receptor o receptor (servidor) deve extrair de cada pacoete recebido o endereço IP e a porta do emissor Ponto de vista da aplicação O UDP disponibiliza um serviço de transferência não fiável de datagramas (grupos de bytes) entre o cliente e o servidor UDP: os dados transmitidos podem ser recebidos fora de ordem 4/28/09 Universidade do Minho 17
Interacção Cliente/Servidor usando sockets UDP Servidor (em execução no hostid) create socket, port=x, for incoming request: serversocket = DatagramSocket() read request from serversocket Cliente create socket, clientsocket = DatagramSocket() Create, address (hostid, port=x, send datagram request using clientsocket write reply to serversocket specifying client host address, port number read reply from clientsocket close clientsocket 4/28/09 Universidade do Minho 18
Exemplo: Cliente JAVA (UDP) Client process Output: envia datagrama (TCP envia stream de bytes ) Input: recebe datagrama (TCP recebe stream de bytes ) client UDP socket 4/28/09 Universidade do Minho 19
Exemplo: Cliente JAVA (UDP) import java.io.*; import java.net.*; Cria input stream Cria socket cliente Traduz o nome do host onde está o servidor para endereço usando o DNS class UDPClient { public static void main(string args[]) throws Exception { BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientsocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName ("hostname"); byte[] senddata = new byte[1024]; byte[] receivedata = new byte[1024]; String sentence = infromuser.readline(); senddata = sentence.getbytes(); 4/28/09 Universidade do Minho 20
Exemplo: Cliente JAVA(UDP), cont. Cria o datagrama com os dados a enviar, tamanho, endereço e porta do servidor Envia datagrama para o servidor Lê datagrama do servidor DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, 9876); clientsocket.send(sendpacket); DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length); clientsocket.receive(receivepacket); String modifiedsentence = new String(receivePacket.getData(),0, receivepacket.getlength()); } System.out.println("FROM SERVER:" + modifiedsentence); clientsocket.close(); } 4/28/09 Universidade do Minho 21
Exemplo: Servidor Java (UDP) import java.io.*; import java.net.*; Cria um socket datagrama à escuta na porta 9876 class UDPServer { public static void main(string args[]) throws Exception { DatagramSocket serversocket = new DatagramSocket(9876); byte[] receivedata = new byte[1024]; byte[] senddata = new byte[1024]; Cria espaço para um datagrama Recebe datagrama while(true) { DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length); serversocket.receive(receivepacket); 4/28/09 Universidade do Minho 22
Exemplo: Servidor Java (UDP), cont Descobre end. IP e port # do emissor String sentence = new String(receivePacket.getData(), 0, receivepacket.getlength()); InetAddress IPAddress = receivepacket.getaddress(); int port = receivepacket.getport(); Cria datagrama para enviar para o cliente Escreve datagrama no socket } } String capitalizedsentence = sentence.touppercase(); senddata = capitalizedsentence.getbytes(); DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, port); serversocket.send(sendpacket); } Fim do ciclo while, volta ao início e espera por novo datagrama 4/28/09 Universidade do Minho 23