Redes de Computadores
Por: Evandro.2016 • 30/3/2018 • 1.653 Palavras (7 Páginas) • 295 Visualizações
...
3.3 Respostas HTTP.
Similar a uma requisição, uma resposta http (response) também é formada por um cabeçalho, pelo status do protocolo informado a descrição/código e pelo corpo da entidade (geralmente paginas html).
O status do protocolo serve para informa se a requisição foi um sucesso ou não, geralmente retorna o código 200 em caso de sucesso. Existem diversos códigos de retorno de sucesso, e de erro, sendo que o “404 not found” que significa que pagina não foi encontrada, se tornou o código de erro mais comum. Por fim a linha seguinte da resposta contém algumas informações pertinentes ao navegador seguida da página html solicitada, veja que o conteúdo é concatenado com a resposta.
[pic 3]
Figura 3: Resposta http
-
Implementação Proposta.
Partindo para pratica, iremos implementar um servidor http local, com funções básicas, limitado a requests e response de paginas html simples e que aceite múltiplas requisições.
Escolhemos desenvolver o servidor na linguagem de programação Java, como cliente usaremos o browser Chrome (versão 52.0.2743.116), e o sistema operacional Windows.
Através dos métodos descritos neste artigo será possível implementa-lo em qualquer linguagem de programação. é possível também utilizar qualquer browser ou sistema operacional compatível com o protocolo http.
- Sockets e portas.
Servidor e cliente, normalmente são computadores com navegadores e sistemas operacionais distintos, onde simultaneamente estão rodando diversas aplicações, nesse sentido é preciso algo para identificar de onde vem e para onde vão as requsições, no nosso contexto essa solução se chama socket, que nada mais que um ponto de identificação para comunicação em uma rede. Para receber uma conexão, o Socket precisa de uma abertura, essa abertura é o que chamamos de porta.
Resumindo, um Socket é o ponto final da conexão, onde uma porta é aberta para que a aplicação possa enviar ou receber dados, cada porta é identificada por um número que é única no computador, sendo que se tentar abrir uma porta que já estiver sendo usado por outra aplicação, o sistema operacional irá barrar e retornar um erro de acesso negado ou informa que a porta está em uso.
[pic 4]
Figura 4:Funcionamento de um socket.
-
Threads
Para que nosso servidor aceitasse múltiplas conexões foi necessário explorar o conceito de thread, estes são trechos de códigos que são executados paralelamente por n vezes.
O servidor recebe várias conexões simultâneas, onde por essas conexões passarão as requisições. Praticamente, todas essas requisições são processadas da mesma maneira, logo, para cada conexão que esse servidor recebe, ele cria uma nova thread, permitindo tratar as requisições de um cliente, e permitindo existir varias conexões.
No Java a estrutura de um thread é bem simples: uma classe que implementa a interface Runnable. Essa interface possui um único método a ser implementado, o método run(). Esse método é o nosso segmento de código que queremos que seja executado em paralelo, no nosso caso ele executará a criação de novas conexões. Utilizaremos também os “ThreadPools” , que é um funcionalidade que permite
controlar o número de threads criadas, afim de limitar o numero de conexão para não sobrecarregar o servidor.
-
O servidor.
No caso do nosso servidor, iremos criar um socket e associar a uma porta especifica(bind) para que todos os clientes saibam onde conectar, e aguardar por solicitações (listen), se algum cliente fizer a requisição, iremos aceitar (acept), devolvendo o conteúdo solicitado.
Em java temos a classe ServerSocket, que ao ser instanciada cria um socket para aguardar novas conexões.
Criamos uma classe Servidor, onde instanciamos o socket setando para a porta 8000, afim de não ter conflito entre portas com o SO. Utilizaremos o objeto InputStream para ler os dados enviados pelo cliente.
Optamos por utilizar um BufferedReader para ler o ImputStream ao invés de um Scanner pois com o Buffer podemos verificar se a linha for vazia, se for, o programa é encerrado sem ter que aguardar que a conexão seja encerrada. (Caso seja necessário continuar lendo a entrada antes da conexão encerras é so pegar o InputReader novamente e continuar lendo. Adicionamos a pasta do projeto os arquivos “index.html” e “404.html” para testarmos nossas requisições.
Para enviar a resposta precisaremos do OutputStream e montar uma string com a estrutura básica da resposta, vamos escrever esses dados no stream, retornando a página solicitada ao usuário.
Para fazer requisições ao nosso servidor é necessário seguir o padrão “\nome_pagima.html”, sendo que por default ao solicitar “\” sem especificar a página é retornado a página inicial, e caso seja solicitado uma página inexistente é retornado a página 404.html.
[pic 5]
Figura 5: Ilustração Servidor Http
- Conclusões.
Este projeto buscou apresentar uma breve introdução de um servidor HTTP e mostrar o quão simples é a implementação do mesmo. O servidor implementado ainda é deficiente de funções, servindo apenas para fins didáticos, afinal existem diversas implementações bem mais completas, entre elas o Apache que atualmente é um dos mais utilizado devido a sua versatilidade e por ser de código aberto o que facilita seu desenvolvimento e aperfeiçoamento. Entretanto foi possível entender como funciona essa ferramenta simples, porém extremamente importante que é considerada um dos motores da internet.
- Trabalhos Futuros.
Como planos futuros, pós implementação do projeto pretendemos aperfeiçoar o servidor adicionando outras funções, como aceitar arquivos de scripts dos mais diversos
...