130 likes | 215 Views
Infra-Estrutura de Comunicação (IF678). Davi Duarte Denyson José Eduardo Souza Ivan França Rafael Lima. Aula Prática 02 – 2010.2. CIn/UFPE. Nosso objetivo: Revisão rápida sobre Socket Programação de Sockets TCP e UDP com Java Programação de Sockets TCP e UDP com C
E N D
Infra-Estrutura de Comunicação(IF678) Davi Duarte Denyson José Eduardo Souza Ivan França Rafael Lima Aula Prática 02 – 2010.2 CIn/UFPE
Nosso objetivo: • Revisão rápida sobre Socket • Programação de Sockets TCP e UDP com Java • Programação de Sockets TCP e UDP com C • Desenvolver um servidor Web • Desenvolverumacalculadora
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
Programação de Socket TCP - Client importjava.io.*; importjava.net.*; importjava.util.Scanner; publicclassTCPclient { publicstaticvoidmain(String[] args) throws Exception { //lendo do teclado String inFromUser = new Scanner(System.in).next(); //criando um socket TCP Socketsock = newSocket("localhost", 2000); //stream de saida DataOutputStreamsocketOut = newDataOutputStream(sock.getOutputStream()); socketOut.writeBytes(inFromUser + '\n'); //resposta do servidor BufferedReadersocketIn = newBufferedReader(newInputStreamReader(sock.getInputStream())); System.out.println(socketIn.readLine()); } }
Programação de Socket TCP - Server importjava.io.*; importjava.net.*; publicclassTCPserver { publicstaticvoidmain(String argv[]) throws Exception { String inFromClient; String outToClient; //socket de "boas vindas" ServerSocketwelcomeSocket = newServerSocket(2000); while(true) { //socket de conexão TCP Socketsock = welcomeSocket.accept(); //buffer de entrada, que recebe um stream BufferedReadersocketIn = newBufferedReader(newInputStreamReader(sock.getInputStream())); inFromClient = socketIn.readLine(); outToClient = inFromClient.toUpperCase() + '\n'; //stream de saida DataOutputStreamsocketOut = newDataOutputStream(sock.getOutputStream());//stream de saida //escrevendo no socket socketOut.writeBytes(outToClient); sock.close(); } } }
Exercício • Faça um “Hello [endereço IP do servidor]” e retorne do servidor um “HELLO [endereço IP do cliente]” • OBS: O cliente deve fechar a conexão após receber a resposta do servidor ou dar um timeout de 30 segundos.
Programação de Socket UDP - Client importjava.net.*; importjava.util.Scanner; classUDPclient { publicstaticvoidmain(String args[]) throws Exception { String inFromUser = new Scanner(System.in).next() + '\n'; //entrada do usuário DatagramSocketclientSocket = newDatagramSocket(); //socket UDP InetAddressIPServer = InetAddress.getByName("localhost"); //IP do servidor byte[] sendData = new byte[1024]; //dados a serem enviados sendData = inFromUser.getBytes(); //criando o pacote de envio DatagramPacketsendPacket = newDatagramPacket(sendData, sendData.length, IPServer, 5000); clientSocket.send(sendPacket); byte[] receiveData = new byte[1024]; //dados recebidos DatagramPacketreceivePacket = newDatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); //recebendo o pacote String inFromServer = new String(receivePacket.getData()); System.out.println("FROM SERVER: " + inFromServer); clientSocket.close(); } }
Programação de Socket UDP - Server importjava.net.*; classUDPserver { publicstaticvoidmain(String args[]) throws Exception { DatagramSocketserverSocket = newDatagramSocket(5000); byte[] receiveData = new byte[1024] ; byte[] sendData = new byte[1024]; String inFromClient, outToClient; InetAddressclientIP; intport; while(true) { //pacote a ser recebido DatagramPacketreceivePacket = newDatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); //recebendo o pacotes inFromClient = new String(receivePacket.getData()); //colocando na string os dados recebidos clientIP = receivePacket.getAddress(); //pegando o IP e porta do pacote que chegou port = receivePacket.getPort(); outToClient = inFromClient.toUpperCase(); sendData = outToClient.getBytes(); //enviandopacote de resposta DatagramPacketsendPacket = newDatagramPacket(sendData, sendData.length, clientIP, port); serverSocket.send(sendPacket); } } }
Exercício • Faça, por meio de uma conexão UDP, o cliente enviar dois números e o servidor responder com a soma deles. • OBS: O cliente deve encerrar após receber a resposta do servidor ou dar um timeout de 30 segundos.
Atividade 1: 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 NotFound” • 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/~ilfn
Exemplo – O que deve ser feito Requisição (via browser ou telnet) telnet: GET /index.html HTTP/1.0 Host: localhost Browser: http://ip:porta 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) telnet: GET /img2.png HTTP/1.0 Host: localhost Browser: http://ip:porta Resposta (seu servidor) HTTP/1.0 200 OK Content-Language: pt-BR Content-Length: 733 Content-Type: image/png Connection: close CRLF “enter” dados ... 12
Atividade 2:Calculadora • Criar uma calculadora que rode sobre UDP • O cliente deve enviar um pacote contendo 2 inteiros (em array de bytes) e 1 operador (também em byte). • O servidor deve realizar o cálculo desejado e retornar a resposta. O cálculo deve ser feito com os bytes que chegam do cliente (sem converter para inteiro) e a resposta enviada deve ser em bytes. • Se a resposta do servidor não chegar em 3 segundos, o cliente deverá encerrar a conexão