Uma implementação simples do servidor da web java, relativamente simples, baseada em java.net.socket e java.net.serversocket;
1. Etapas de execução do programa
1. Crie um objeto ServerSocket;
2. Chame o método de aceitação do objeto ServerSocket e aguarde a conexão. Se a conexão for bem -sucedida, um objeto de soquete será retornado, caso contrário, será bloqueado e esperado;
3. Obtenha os fluxos de bytes de entrada e saída do objeto de soquete, e esses dois fluxos correspondem à solicitação de solicitação e resposta à resposta, respectivamente;
4. Processe a solicitação: leia as informações do fluxo de byte inputStream, converta -as em um formulário de string e analise -o. A análise aqui é relativamente simples e obtém apenas as informações do URI (Identificador de Recursos Uniformes);
5. Resposta de processamento: Com base nas informações de URI analisado, encontre o arquivo de recursos de recursos solicitado no diretório web_root, leia o arquivo de recursos e escreva -o no fluxo de byte de saída;
6. Feche o objeto de soquete;
7. Vá para a etapa 2 e continue esperando a solicitação de conexão;
2. Implementação de código
Implementação do servidor:
pacote ex01.pyrmont; importar java.net.socket; importar java.net.erversocket; importar java.net.inetaddress; importar java.io.inputStream; import java.io.OutputStream; import java.io.ioException; importar java.io.io.IlE.Ill Class. HTML e outros arquivos são armazenados. O web_root aqui é o diretório Webroot no diretório de trabalho*/ public static final string web_root = system.getProperty ("user.dir") + file.separator + "webroot"; // Fechar o comando de serviço privado estático final string Shutdown_Command = "/Shutdown"; public static void main (string [] args) {httpServer server = new httpServer (); // Aguarda pela solicitação de conexão server.await (); } public void Await () {ServerSocket ServerSocket = null; int porta = 8080; tente {// servidor de soquete de servidor serversocket = new ServerSocket (porta, 1, inetaddress.getByName ("127.0.0.1")); } catch (ioexception e) {e.printStackTrace (); System.Exit (1); } // loop para aguardar uma solicitação while (true) {soquete soket = null; InputStream input = null; OutputStream Output = NULL; tente {// aguardando a conexão, depois que a conexão for bem -sucedida, retorne um soquete de soquete soquete = serversocket.accept (); input = soket.getInputStream (); output = Socket.getOutputStream (); // Criar objeto de solicitação e solicitação de análise Pedida = nova solicitação (entrada); request.parse (); // Verifique se é um comando de serviço fechado se (request.geturi (). Igual (Shutdown_Command)) {break; } // Crie resposta de resposta de objeto de resposta = nova resposta (saída); Response.setRequest (solicitação); Response.SendStaticResource (); // Fechar soquete do objeto de soquete.close (); } catch (Exceção e) {e.printStackTrace (); continuar; }}}}Classe de solicitação:
pacote ex01.pyrmont; importar java.io.inputStream; importar java.io.ioException; Public Class Request {private inputStream entrada; URI de cordas privadas; solicitação pública (entrada inputStream) {this.input = input; } // Leia as informações da solicitação do InputStream e obtenha o valor URI do pedido público Void Parse () {StringBuffer request = new StringBuffer (2048); int i; byte [] buffer = novo byte [2048]; tente {i = input.read (buffer); } catch (ioexception e) {e.printStackTrace (); i = -1; } para (int j = 0; j <i; j ++) {request.append ((char) buffer [j]); } System.out.print (request.toString ()); uri = parseuri (request.toString ()); } /** * * A forma do requeststring é a seguinte: * get /index.html http /1.1 * host: localhost: 8080 * conexão: keep-alive * cache-control: max-Arane = 0 * ... * O objetivo desta função é obtenção /indentr /html string * /private string parseury (string stringi; index1 = requestString.indexof (''); if (index1! = -1) {index2 = requestString.indexof ('', index1 + 1); if (index2> index1) retornar requeststring.substring (index1 + 1, index2); } retornar nulo; } public string geturi () {return uri; }} Classe de resposta:
pacote ex01.pyrmont; importar java.io.OutputStream; importar java.io.ioException; importar java.io.fileInputStream; importar java.io.file;/ * http sprlf [line de status * ((cabeçalho de resposta do cabeçalho da resposta) sprlfrt [swort] sprlfrt) status [sdoTer) sPllfrt) status do status do status do status * (headers-header | CRLF*/public classe Response {private static final int buffer_size = 1024; Solicitação de solicitação; Saída de saída de saída; Resposta pública (saída de outputStream) {this.output = output; } public void setRequest (solicitação de solicitação) {this.request = request; } public void sendStaticResource () lança ioexception {byte [] bytes = new byte [buffer_size]; FileInputStream fis = null; tente {// Escreva o arquivo da web no arquivo de fluxo de fluxo de outputStream byte = novo arquivo (httpServer.web_root, request.geturi ()); if (file.exists ()) {fis = new FileInputStream (arquivo); int ch = fis.read (bytes, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (bytes, 0, buffer_size); }} else {// arquivo não encontrado string errorMessage = "http/1.1 404 arquivo não encontrado/r/n" + "time de conteúdo: text/html/r/n" + "comprimento de conteúdo: 23/r/n" + "/r/n" + "<h1> arquivo não encontrado </h1>";; output.Write (errorMessage.getBytes ()); }} Catch (Exceção e) {// jogado se não puder instanciar um arquivo de arquivo system.out.println (e.toString ()); } finalmente {if (fis! = null) fis.close (); }}} 3. Teste de resultados
Acesse os arquivos de recursos existentes (observe que eles são armazenados na pasta Webroot no diretório do projeto):
Acessando arquivos de recursos inexistentes:
Feche o servidor:
Referência: "Análise aprofundada do tomcat"
@Author um codificador semelhante ao vento
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.