Infra-Estrutura de Comunicação (IF678) Aula Prática 02 Programação de Sockets TCP e UDP Hugo Simões ([email protected]) Original por: Flávio Almeida ([email protected]) Professor: Paulo Gonçalves ([email protected]) CIn/UFPE Importante: Cadastro no grupo da disciplina: • http://groups.google.com.br/group/infracomunicao2008-1/subscribe Nosso objetivo: Revisão sobre Socket Programação de Sockets TCP e UDP Desenvolver um servidor Web 3 Agenda 1. 2. 3. 4. Comunicação entre processos Programação de Socket TCP Programação de Socket UDP Desenvolver um servidor Web... 4 Comunicação entre processos Processos em hosts distintos comunicam-se por meio de envio de mensagens... enviadas e recebidas através de seu socket Socket é a interface entre a camada de aplicação e a de transporte Analogia: Casa e porta (processo e socket) 5 Interação dos programas cliente e servidor (TCP) [1/2] 1.Cliente tem a tarefa de iniciar contato com o servidor. 2. Servidor deve está pronto: ativo, rodando antes do cliente tentar iniciar contato possuir alguma porta (socket) para acolher algum contato inicial de um processo cliente. 3. O processo cliente pode iniciar uma conexão TCP, o que é feito a partir da criação de um socket parâmetros do socket : Endereço IP do hospedeiro servidor e o número de porta do processo servidor Analogia: ‘bater à porta’ (contato inicial) Interação dos programas cliente e servidor (TCP) [2/2] 4. TCP cliente inicia uma apresentação de 3 vias e estabelece uma conexão TCP com Servidor cliente “bate” no socket de entrada do servidor servidor ‘ouve’ a batida e cria um novo socket dedicado àquele cliente Ao final da apresentação, existe uma conexão TCP entre o socket cliente e o novo socket do servidor Programação de Socket TCP - Client import java.io.*; import java.net.*; class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; BufferedReader inFromUser = // cria Stream de entrada (teclado) new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("hostname", 8000); // cria Socket Cliente, conecta ao servidor DataOutputStream outToServer = // cria Stream de saida(do cliente pro servidor) new DataOutputStream(clientSocket.getOutputStream()); // junto ao socket cliente BufferedReader inFromServer =new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // cria Stream de entrada (vindo servidor) // junto ao socket cliente sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\n'); // envia a string ao servidor modifiedSentence = inFromServer.readLine(); // ler string que veio do servidor System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close(); } } 8 Programação de Socket TCP - Server import java.io.*; import java.net.*; class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(8000); //cria porta de entrada de numero 8000 while(true) { Socket connectionSocket = welcomeSocket.accept(); // Aguardando no socket de entrada, um contato do cliente // para criar nova porta dedicada ao cliente especifico BufferedReader inFromClient = // cria Stream de entrada (vindo do Cliente) junto ao socket de conex new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = //cria Stream de saida (do Servidor pro cliente) junto ao socket de conx new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); //envia String para o cliente } } } 9 Programação de Socket UDP - Client import java.io.*; import java.net.*; 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(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9000); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } 10 Programação de Socket UDP - Server import java.io.*; import java.net.*; 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]; while(true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } } } 11 Desenvolver um servidor Web... Trata-se de um servidor Web, que responderá a requisições HTTP, bastante simples. Com as seguintes regras: Deve ser implementado utilizando-se a API de Java Ele deve manipular apenas uma requisição HTTP; Ele deve enviar uma mensagem de resposta ao cliente contendo linhas de cabeçalho e o objeto desejado, se existente; A única verificação necessária é quando o objeto não for encontrado, deve-se retornar: “HTTP/1.0 404 Not Found” Teste seu servidor utilizando um navegador qualquer! Mantenha os arquivos que serão baixados na mesma pasta do seu projeto Dicas: - utilize as classes ServerSocket, Socket, StringTokenizer e File - reveja a aula sobre HTTP - consulte o RFC[2616] - baixar código parcial em www.cin.ufpe.br/~ejgcs/comunicacao no link [Aulas] 12 Exemplo – O que deve ser feito Requisição (via browser ou telnet) Requisição (via browser ou telnet) GET /index.html HTTP/1.0 Host: localhost GET /img2.png HTTP/1.0 Host: localhost Resposta (seu servidor) Resposta (seu servidor) HTTP/1.0 200 OK Content-Language: pt-BR Content-Length: 53 Content-Type: text/html Connection: close CRLF “enter” dados ... HTTP/1.0 200 OK Content-Language: pt-BR Content-Length: 733 Content-Type: image/png Connection: close CRLF “enter” dados ... 13 Referências 1. 2. 3. 4. 5. James F. Kurose and Keith W. Ross, "Redes de Computadores e a Internet - Uma Nova Abordagem", 3a. edição - 2005 - Ed. Addison Wesley BRA http://www.rfc.net/ http://www.ietf.org/rfc.html http://java.sun.com/j2se/1.5.0/docs/api/java/net/packagesummary.html http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html 14