140 likes | 244 Views
Infra-Estrutura de Comunicação (IF678). Aula Prática 02 Programação de Sockets TCP e UDP. Hugo Simões ( hsms87@gmail.com ) Original por: Flávio Almeida ( faas@cin.ufpe.br ). Professor: Paulo Gonçalves ( pasg@cin.ufpe.br ). CIn/UFPE. Importante:. Cadastro no grupo da disciplina:
E N D
Infra-Estrutura de Comunicação(IF678) Aula Prática 02 Programação de Sockets TCP e UDP Hugo Simões (hsms87@gmail.com) Original por: Flávio Almeida (faas@cin.ufpe.br) Professor: Paulo Gonçalves (pasg@cin.ufpe.br) CIn/UFPE
Importante: Cadastro no grupo da disciplina: • http://groups.google.com.br/group/infra-comunicao2008-1/subscribe
Nosso objetivo: Revisão sobre Socket Programação de Sockets TCP e UDP Desenvolver um servidor Web
Agenda Comunicação entre processos Programação de Socket TCP Programação de Socket UDP Desenvolver um servidor Web...
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)
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 socketdedicado àquele cliente Ao final da apresentação, existe uma conexão TCP entre o socket cliente e o novo socket do servidor
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(); } } Programação de Socket TCP - Client
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 } } } Programação de Socket TCP - Server
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(); } } Programação de Socket UDP - Client
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); } } } Programação de Socket UDP - Server
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]
Requisição (via browser ou telnet) GET /index.html HTTP/1.0 Host: localhost Resposta (seu servidor) HTTP/1.0 200 OK Content-Language: pt-BR Content-Length: 53 Content-Type: text/html Connection: close CRLF “enter” dados ... Requisição (via browser ou telnet) GET /img2.png HTTP/1.0 Host: localhost Resposta (seu servidor) HTTP/1.0 200 OK Content-Language: pt-BR Content-Length: 733 Content-Type: image/png Connection: close CRLF “enter” dados ... Exemplo – O que deve ser feito 13
Referências 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/package-summary.html http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html 14