É sabido que a comunicação entre um servidor da Web e um cliente usa o protocolo HTTP. O HTTP é um padrão para solicitações e respostas ao cliente e do servidor (TCP). Como o protocolo HTTP é baseado no protocolo TCP, usarei o soquete em Java para concluir este servidor web simples. Para obter informações mais detalhadas para HTTP, você pode consultar as informações relevantes para aprender sobre isso.
Antes de escrever o servidor, vamos dar uma olhada nas regras de comunicação entre o navegador e o servidor.
Primeiro de tudo, usamos o ServerSocket para simular um servidor, acessá -lo através do navegador e visualizar o conteúdo solicitado pelo navegador:
importar java.io.bufferedwriter; importar java.io.inputStream; importar java.io.OutputStreamWriter; importar java.net.inetaddress; import java.net.inetsocketaddress; import java.net.sertsocket; import java.net.socket; @Author jianggujin * */public classe HQHTTPProtocoltest {@Test public void Server () lança exceção {serverSocket ServerSocket = new ServerSocket (80); Soquete soquete = serversocket.accept (); InputStream Stream = Socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Execute -o com Junit e acesse -o através do navegador: http://127.0.0.1 , podemos ver que a saída de conteúdo de solicitação do navegador no console é a seguinte:
Get/http/1.1host: 127.0.0.1Connection: Keep-aliveAccept: text/html, aplicação/xhtml+xml, aplicativo/xml; q = 0.9, imagem/webp,*/*; Gecko) Chrome/31.0.1650.63 Safari/537.36Cept-coding: gzip, deflate, sdchacecept-linguagem: zh-cn, zh; q = 0,8
Para analisar melhor o conteúdo da solicitação, escrevemos uma página HTML para enviar alguns dados e visualizar o conteúdo da solicitação novamente:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> <form method = "post" action = "http://127.0.0.1?test=123"> <input type = "text" "" "") type = "submeter"/> </morm> </body> </html>
Digite Bob na caixa de entrada, clique no botão para enviar e observe a saída do console:
POST/? TESTE = 123 HTTP/1.1HOST: 127.0.0.1Connection: Keep-aliveContent-comprimento: 8cache-control: max-AGE = 0CECT: texto/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0,9, imagem/webp,*/*; (Windows NT 5.1) Applewebkit/537.36 (Khtml, como Gecko) Chrome/31.0.1650.63 Safari/537.36Content-Type: Application/X-WWW-Form-Urlencoded-Igom-Igom-IGEN: Zip, Zip, SDCHACT-LOG-LECT-LECTEM;
Vamos analisar o conteúdo desta solicitação:
A primeira linha: consiste em três partes, separadas por espaços no meio, a primeira parte é o método de solicitação (get, post), a segunda parte é o caminho de solicitação e os parâmetros de consulta e a terceira parte é a versão do protocolo HTTP (http/1.1)
Linha 2 à linha 10: As informações do cabeçalho da solicitação, o nome e o valor do cabeçalho da solicitação são aprovadas: Separe a décima primeira linha: linha vazia 12ª linha: conteúdo do formulário enviado, podemos obter a seguinte conclusão: o primeiro comportamento da informação de solicitação é o método de solicitação, o caminho da solicitação, os parâmetros de consulta e a versão HTTP. Após a quebra da linha /R /N, as informações do cabeçalho da solicitação são imediatamente seguidas pela quebra da linha /R /N, as informações do cabeçalho da solicitação são seguidas por uma linha em branco após a conclusão das informações do cabeçalho da solicitação e os dados da solicitação são imediatamente seguidos por uma linha em branco. Deve -se notar que isso é simulado apenas. Quanto aos envios complexos de arquivos, etc., ele não é discutido aqui e o formato de conteúdo de solicitação é um pouco diferente.
Neste ponto, já conhecemos o conteúdo solicitado pelo cliente. Vamos dar uma olhada no formato dos dados de resposta do servidor após receber a solicitação. Criamos um novo projeto da Web para testar e editar o conteúdo da página HTML da seguinte forma:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> teste </title> </head> <body> Esta é a página de teste. </body> </html>
Inicie o servidor e escreva o código de teste do cliente para obter os dados de retornar do servidor:
importar java.io.bufferedwriter; importar java.io.inputStream; importar java.io.outputStreamWriter; importar java.net.serversocket; importar java.net.socket; importpptppppujang.junit.test/** * http protocol Test * @athor jiangin void server () lança exceção {serverSocket ServerSocket = new ServerSocket (80); Soquete soquete = serversocket.accept (); InputStream Stream = Socket.getInputStream (); // bufferInputStream inputStream = new bufferInputStream (fluxo); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @Test public void client () lança exceção {soquete soquete = new Socket ("127.0.0.1", 80); Bufferwriter writer = new bufferwriter (new outputStreamWriter (socket.getOutputStream ())); writer.write ("get /servlet/test.html http/1.1/r/n"); writer.write ("Host: 127.0.0.1/r/n"); writer.write ("Conexão: Keep-Alive/R/N"); writer.write ("Aceitar: text/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0,9, imagem/webp,*/*; q = 0,8/r/n"); Writer.Write ("User-Agent: Mozilla/5.0 (Windows NT 5.1) Applewebkit/537.36 (Khtml, como Gecko) Chrome/31.0.1650.63 Safari/537.36/r/n"); writer.write ("aceitar-codificação: gzip, deflate, sdch/r/n"); writer.Write ("Aceitar-Language: ZH-CN, ZH; Q = 0,8/R/N"); writer.write ("/r/n"); writer.flush (); InputStream Stream = Socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Executando o programa para obter o servidor retorna o seguinte conteúdo:
HTTP/1.1 200 OkServer: Apache-cooyote/1.1CEcept Ranges: bytesetag: w/"129-1456125361109" Último modificado: seg, 22 de fevereiro de 2016 07:16:01 GMTContent-Type Mon: TEXT/HTMLCONTENT: 129DATE: 1201: 12: GMT <! Doctype html> <html> <head> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> Esta é a página de teste. </body> </html>
Da mesma forma, vamos analisar esta mensagem de retorno:
The first line consists of three parts, separated by spaces in the middle, the first part is the HTTP protocol version (HTTP/1.1), the second part is the response status code, and the third part is the response status description of the second line to the seventh line, the response header information is passed between the response header name and the value: Separate the eighth line: the ninth line to the end of the response content: In summary, we can get the following Conclusão: A primeira coisa é a versão do protocolo HTTP de informações de solicitação, o código de status da resposta e a descrição do status da resposta e as informações do cabeçalho da resposta são seguidas pela quebra da linha /R /N, e as informações do cabeçalho da resposta são passadas por /R /N quebra de linha, e as informações do cabeçalho de resposta são seguidas por uma resposta em branco após a linha de resposta. Deve -se notar que, além dessa resposta, existem outros métodos correspondentes, como o Chunk, que não é discutido aqui, e você pode verificar as informações relevantes.
Até agora, analisamos o formato de conteúdo de solicitação do cliente e o formato de conteúdo correspondente do servidor. Este artigo termina aqui. Espero que seja útil para o aprendizado de todos.