Una simple implementación del servidor web Java, relativamente simple, basada en java.net.socket y java.net.serversocket;
1. Pasos de ejecución del programa
1. Cree un objeto Serversocket;
2. Llame al método de aceptación del objeto Serversocket y espere la conexión. Si la conexión es exitosa, se devolverá un objeto de socket, de lo contrario se bloqueará y esperará;
3. Obtenga las secuencias de byte InputStream y OutputStream desde el objeto Socket, y estas dos secuencias corresponden a la solicitud de solicitud y respuesta de respuesta respectivamente;
4. Procese la solicitud: lea la información de secuencia de bytes de entrada de InputStream, conviértala en un formulario de cadena y análisis. El análisis aquí es relativamente simple, y solo obtiene la información URI (identificador de recursos uniformes);
5. Respuesta de procesamiento: según la información de URI analizada, busque el archivo de recursos de recursos solicitado desde el directorio web_root, lea el archivo de recursos y escríbelo a la transmisión de byte de salida de salida;
6. Cierre el objeto Socket;
7. Vaya al paso 2 y continúe esperando la solicitud de conexión;
2. Implementación del código
Implementación del servidor:
paquete ex01.pyrmont; import java.net.socket; import java.net.serversocket; import java.net.inetaddress; import java.io.inputstream; import java.io.outputStream; import java.io.ioException; import java.io.file; public class HttpServer { /*** Web de WEB se almacenan otros archivos. Web_root aquí es el directorio de Webroot en el directorio de trabajo*/ public static final String web_root = system.getProperty ("user.dir") + file.separator + "webroot"; // Comando de servicio Cerrar String Final String stAWDOWN_COMMAND = "/SHUTDOW"; public static void main (string [] args) {httpserver server = new httpserver (); // Espere la solicitud de conexión Server.Await (); } public void await () {Serversocket Serversocket = null; Int Port = 8080; Pruebe {// Servidor Socket Object Serversocket = New Serversocket (puerto, 1, inetaddress.getByName ("127.0.0.1")); } catch (ioException e) {E.PrintStackTrace (); System.exit (1); } // bucle para esperar una solicitud mientras (verdadero) {socket socket = null; InputStream Input = NULL; OutputStream output = null; Pruebe {// Esperando la conexión, después de que la conexión sea exitosa, devuelva un objeto Socket Socket = Serversocket.accept (); input = Socket.getInputStream (); output = Socket.getOutputStream (); // Crear objeto de solicitud y solicitud de solicitud de solicitud = nueva solicitud (entrada); request.Parse (); // Verifique si es un comando de servicio cerrado if (request.geturi (). Equals (shutdown_command)) {break; } // Crear respuesta del objeto Respuesta de respuesta = nueva respuesta (salida); respuesta.setRequest (solicitud); respuesta.sendstaticResource (); // Cerrar objeto de socket Socket.close (); } catch (Exception e) {E.PrintStackTrace (); continuar; }}}}Clase de solicitud:
paquete ex01.pyrmont; import java.io.inputstream; import java.io.ioException; solicitud de clase pública {entrada privada de entrada de entrada; Uri de cadena privada; Solicitud pública (entrada InputStream) {this.input = input; } // Lea la información de solicitud de InputStream y obtenga el valor URI de la solicitud public void parse () {StringBuffer request = new StringBuffer (2048); int i; byte [] buffer = new Byte [2048]; intente {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 ()); } /** * * The form of requestString is as follows: * GET /index.html HTTP/1.1 * Host: localhost:8080 * Connection: keep-alive * Cache-Control: max-age=0 * ... * The purpose of this function is to obtain /index.html string*/ private String parseUri(String requestString) { int index1, index2; index1 = requestString.IndexOf (''); if (index1! = -1) {index2 = requestString.IndexOf ('', index1 + 1); if (index2> index1) return requitstring.substring (index1 + 1, index2); } return null; } public String geturi () {return uri; }} Clase de respuesta:
paquete ex01.pyrmont; import java.io.outputstream; import java.io.ioexception; import java.io.fileInputStream; import java.io.file;/ * http respuesta = status-line * ((General-Header | Respuesta-Header | entidad-Header) CRLF) CRLF [MENSAJE] Razón-frase CRLF*/Respuesta de clase pública {Private static final int buffer_size = 1024; Solicitud de solicitud; Salida de salida de salida; Respuesta pública (salida de salida) {this.output = output; } public void setRequest (solicitud de solicitud) {this.request = request; } public void sendstaticResource () lanza ioexception {byte [] bytes = new byte [buffer_size]; FileInputStream fis = null; Pruebe {// Escriba el archivo web en el archivo de transmisión de byte OutputStream Byte Archivo = nuevo archivo (httpserver.web_root, request.geturi ()); if (file.exists ()) {fis = new FileInputStream (archivo); int ch = fis.read (bytes, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (bytes, 0, buffer_size); }} else {// archivo no encontrado string errorMessage = "http/1.1 404 archivo no encontrado/r/n" + "contenido-type: text/html/r/n" + "contenido-longitud: 23/r/n" + "/r/n" + "<h1> Archivo no encontrado </h1>"; output.write (errorMessage.getBytes ()); }} catch (Exception e) {// lanzado si no puede instanciar un objeto de archivo System.out.println (e.ToString ()); } finalmente {if (fis! = null) fis.close (); }}} 3. Prueba de resultados
Acceda a los archivos de recursos existentes (tenga en cuenta que se almacenan en la carpeta Webroot en el directorio del proyecto):
Acceso a archivos de recursos inexistentes:
Cierre el servidor:
Referencia: "Análisis en profundidad de Tomcat"
@Author un codificador de viento
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.