InfraEstrutura de Comunicao IF 678 Bruno Gentilini Anlia
Infra-Estrutura de Comunicação (IF 678) Bruno Gentilini Anália Lima Eduardo Souza Cleivson Siqueira Amora Albuquerque Ivan França Aula Prática 02 Programação de Sockets TCP e UDP CIn/UFPE
Nosso objetivo: q Revisão rápida sobre Socket q Programação de Sockets TCP e UDP q Desenvolver um servidor Web 2
Agenda 1. 2. 3. 4. Comunicação entre processos Programação de Socket TCP Programação de Socket UDP Desenvolver um servidor Web. . . 3
Comunicação entre processos q Processos em hosts distintos comunicam-se por meio de envio de mensagens. . . q enviadas e recebidas através de seu socket Socket é a interface entre a camada de aplicação e a de transporte 4
Programação de Socket TCP - Client import java. io. *; import java. net. *; import java. util. Scanner; public class TCPclient { public static void main(String[] args) throws Exception { //lendo do teclado String in. From. User = new Scanner(System. in). next(); //criando um socket TCP Socket sock = new Socket("localhost", 2000); //stream de saida Data. Output. Stream socket. Out = new Data. Output. Stream(sock. get. Output. Stream()); socket. Out. write. Bytes(in. From. User + 'n'); //resposta do servidor Buffered. Reader socket. In = new Buffered. Reader(new Input. Stream. Reader(sock. get. Input. Stream())); System. out. println(socket. In. read. Line()); } } 5
Programação de Socket TCP - Server import java. io. *; import java. net. *; public class TCPserver { public static void main(String argv[]) throws Exception { String in. From. Client; String out. To. Client; //socket de "boas vindas" Server. Socket welcome. Socket = new Server. Socket(2000); while(true) { //socket de conexão TCP Socket sock = welcome. Socket. accept(); //buffer de entrada, que recebe um stream Buffered. Reader socket. In = new Buffered. Reader(new Input. Stream. Reader(sock. get. Input. Stream())); in. From. Client = socket. In. read. Line(); out. To. Client = in. From. Client. to. Upper. Case() + 'n'; //stream de saida Data. Output. Stream socket. Out = new Data. Output. Stream(sock. get. Output. Stream()); //stream de saida //escrevendo no socket. Out. write. Bytes(out. To. Client); sock. close(); } } } 6
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 import java. net. *; import java. util. Scanner; class UDPclient { public static void main(String args[]) throws Exception { String in. From. User = new Scanner(System. in). next() + 'n'; //entrada do usuário Datagram. Socket client. Socket = new Datagram. Socket(); //socket UDP Inet. Address IPServer = Inet. Address. get. By. Name("localhost"); //IP do servidor byte[] send. Data = new byte[1024]; //dados a serem enviados send. Data = in. From. User. get. Bytes(); //criando o pacote de envio Datagram. Packet send. Packet = new Datagram. Packet(send. Data, send. Data. length, IPServer, 5000); client. Socket. send(send. Packet); byte[] receive. Data = new byte[1024]; //dados recebidos Datagram. Packet receive. Packet = new Datagram. Packet(receive. Data, receive. Data. length); client. Socket. receive(receive. Packet); //recebendo o pacote String in. From. Server = new String(receive. Packet. get. Data()); System. out. println("FROM SERVER: " + in. From. Server); client. Socket. close(); } } 8
Programação de Socket UDP - Server import java. net. *; class UDPserver { public static void main(String args[]) throws Exception { Datagram. Socket server. Socket = new Datagram. Socket(5000); byte[] receive. Data = new byte[1024] , send. Data = new byte[1024]; String in. From. Client, out. To. Client; Inet. Address client. IP; int port; while(true) { //pacote a ser recebido Datagram. Packet receive. Packet = new Datagram. Packet(receive. Data, receive. Data. length); server. Socket. receive(receive. Packet); //recebendo o pacotes in. From. Client = new String(receive. Packet. get. Data()); //colocando na string os dados recebidos client. IP = receive. Packet. get. Address(); //pegando o IP e porta do pacote que chegou port = receive. Packet. get. Port(); out. To. Client = in. From. Client. to. Upper. Case(); send. Data = out. To. Client. get. Bytes(); //enviando pacote de resposta Datagram. Packet send. Packet = new Datagram. Packet(send. Data, send. Data. length, client. IP, port); server. Socket. send(send. Packet); } } } 9
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. 10
Desenvolver um servidor Web. . . q Trata-se de um servidor Web, que responderá a requisições HTTP, bastante simples. Com as seguintes regras: q Deve ser implementado utilizando-se a API de Java q Ele deve manipular apenas uma requisição HTTP; q Ele deve enviar uma mensagem de resposta ao cliente contendo linhas de cabeçalho e o objeto desejado, se existente; q A única verificação necessária é quando o objeto não for encontrado, deve-se retornar: “HTTP/1. 0 404 Not Found” q Teste seu servidor utilizando um navegador qualquer! q Mantenha os arquivos que serão baixados na mesma pasta do seu projeto ØDicas: - utilize as classes Server. Socket, String. Tokenizer e File - reveja a aula sobre HTTP - consulte o RFC[2616] - baixar código parcial em www. cin. ufpe. br/~cfmi/comunicacao no link [Aulas] 11
Exemplo – O que deve ser feito Requisição (via browser ou telnet) telnet: GET /index. html HTTP/1. 0 Host: localhost telnet: GET /img 2. png 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. . . HTTP/1. 0 200 OK Content-Language: pt-BR Content-Length: 733 Content-Type: image/png Connection: close CRLF “enter” dados. . . 12
Exercício do Temporizador O exercício deverá ser apresentado (pessoalmente) aos monitores. A data máxima para apresentar será definida Obs: Não mandar emails individualmente para um monitor, pois a dúvida de um pode ser a dúvida de muitos 13
Exercício do Temporizador(cont. ) Deverá ser desenvolvido um programa que rode em duas máquinas distintas. O programa terá as seguintes funcionalidades: 1. Os dois hosts (A e B) devem estabelecer uma conexão TCP 2. O host A deve enviar ao host B um pacote realizando uma solicitação ara a hora do sistema em B 3. O host A deve receber um pacote do host B com a hora do sistema em B 4. O host A deve mostrar na tela a hora do sistema em B, e também, o RTT calculado em relação a solicitação ◦ A hora mostrada na tela deve seguir o formato “dd/MM/yyyy hh: mm” IMPORTANTE: O lado B irá enviar a informação para A na forma de bytes. Não pode transformar a hora do sistema em um Objeto (como String), e utilizar a função writebytes para escrever no pacote O lado B deve enviar um pacote com tamanho de 52 bytes, suficiente para enviar os 13 inteiros relativos à hora do sistema 14
- Slides: 14