Eine einfache Implementierung von Java Web Server, relativ einfach, basierend auf java.net.socket und java.net.serversocket;
1. Programmausführungsschritte
1. Erstellen Sie ein ServerSocket -Objekt;
2. Rufen Sie die Akzeptanzmethode des ServerSocket -Objekts auf und warten Sie auf die Verbindung. Wenn die Verbindung erfolgreich ist, wird ein Socket -Objekt zurückgegeben, sonst wird es blockiert und gewartet.
3.. Rufen Sie den InputStream- und OutputStream -Byte -Streams aus dem Socket -Objekt ab, und diese beiden Streams entsprechen der Anforderungsanforderung bzw. Antwortantwort.
4. Verarbeiten Sie die Anforderung: Lesen Sie die InputStream -Byte -Stream -Informationen, konvertieren Sie sie in ein Zeichenfolgenformular und analysieren Sie sie. Die Analyse hier ist relativ einfach und erhält nur die Informationen zur URI -Informationen (einheitliche Ressourcenkennung).
5. Verarbeitungsantwort: Basierend auf den analysierten URI -Informationen finden Sie die angeforderte Ressourcenressourcendatei aus dem Verzeichnis web_root, lesen Sie die Ressourcendatei und schreiben Sie sie in den Ausgabestream -Byte -Stream.
6. Schließen Sie das Sockelobjekt;
7. Gehen Sie zu Schritt 2 und warten Sie weiter auf die Verbindungsanfrage.
2. Code -Implementierung
Server -Implementierung:
package 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_ROOT is the directory where HTML und andere Dateien werden gespeichert. Das web_root hier ist das Webroot -Verzeichnis im Arbeitsverzeichnis*/ public static Final String web_root = system.getProperty ("user.dir") + Datei.Separator + "Webroot"; // Service Command für private statische String -String -String -STRINDDOWN_COMMAND = "/Shutdown" schließen; public static void main (String [] args) {httpserver server = new httpServer (); // Warten Sie auf den Verbindungsanforderungserver. } public void Await () {ServerSocket ServerSocket = null; int port = 8080; try {// Server -Socket -Objekt ServersSocket = new ServerSocket (Port, 1, inetaddress.getByName ("127.0.1")); } catch (ioException e) {e.printstacktrace (); System.exit (1); } // Looping auf eine Anfrage warten, während (true) {Socket Socket = null; InputStream input = null; OutputStream output = null; Versuchen Sie {// Warten auf die Verbindung, nachdem die Verbindung erfolgreich ist, geben Sie einen Socket -Objekt -Socket = serversocket.accept () zurück; input = socket.getInputStream (); output = socket.getOutputStream (); // Anforderungsobjekt erstellen und analysieren request request = new request (Eingabe); Request.Parse (); // Überprüfen Sie, ob es sich um einen Befehl geschlossener Dienst handelt, wenn (request.geturi (). Equals (stilldown_command)) {break; } // Reaktionsobjekte Antwort erstellen Antwort = Neue Antwort (Ausgabe); Antwort.SetRequest (Anfrage); Antwort.SendStaticResource (); // Socket -Objekt -Socket schließen.CLOSE (); } catch (Ausnahme e) {e.printstacktrace (); weitermachen; }}}}Anfrageklasse:
Paket ex01.pyrmont; import Java.io.inputStream; Import Java.io.ioException; öffentliche Klasse Anfrage {private InputStream -Eingabe; private String uri; public request (InputStream Input) {this.input = input; } // Die Anforderungsinformationen aus dem InputStream lesen und den URI -Wert aus der Anforderung public void Parse () {StringBuffer Request = new StringBuffer (2048) abrufen; int i; byte [] buffer = neues byte [2048]; try {i = input.read (puffer); } catch (ioException e) {e.printstacktrace (); i = -1; } für (int j = 0; j <i; j ++) {request.Append ((char) puffer [j]); } System.out.print (request.toString ()); Uri = Parseuri (Request.ToString ()); } /** * * Die Form des RequestString lautet wie folgt: * Get /index.html http /1.1 * Host: localhost: 8080 * Verbindung: Keep-Alive * cache-control: max-AGE = 0 * ... * Der Zweck dieser Funktion ist, /index.html String zu erhalten. index1 = requestString.indexof (''); if (index1! = -1) {index2 = requestString.indexof ('', index1 + 1); if (index2> index1) return requestString.substring (Index1 + 1, Index2); } return null; } public String geturi () {return Uri; }} Antwortklasse:
Paket ex01.pyrmont; import Java.io.outputStream; Import Java.io.ioxception; Import Java.io.fileInputStream; Import Java.io.file;/ * http reaktion = Status-line * ((General-Hea-Line | Response-Header) crlf. Vernunft-Phrase CRLF*/Public Class Response {private statische endgültige int buffer_size = 1024; Anfrage anfordern; Ausgangsausgang; public response (outputStream output) {this.output = output; } public void setRequest (Anfrageanforderung) {this.Request = request; } public void sendStaticResource () löscht ioException {byte [] bytes = new byte [buffer_size]; FileInputStream fis = null; Versuchen Sie {// Schreiben Sie die Webdatei in die Ausgabestream -Byte -Stream -Datei = neue Datei (httpserver.web_root, Request.geturi ()); if (file.exists ()) {fis = new FileInputStream (Datei); int ch = fis.read (bytes, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (bytes, 0, buffer_size); }} else {// Datei nicht gefunden String errorMessage = "http/1.1 404 Datei nicht gefunden/r/n" + "Inhaltstyp: text/html/r/n" + "Inhaltslänge: 23/r/n" + "/r/n" + "<H1> nicht gefunden </H1>"; output.write (errormessage.getBytes ()); }} catch (Ausnahme e) {// geworfen, wenn kein Dateiobjektsystem system.out.println (e.toString ())); } endlich {if (fis! = null) fis.close (); }}} 3. Ergebnistest
Greifen Sie auf die vorhandenen Ressourcendateien zu (Beachten Sie, dass sie im Webroot -Ordner im Projektverzeichnis gespeichert werden):
Zugriff auf nicht existierende Ressourcendateien:
Schließen Sie den Server:
Referenz: "Eingehende Analyse von Tomcat"
@Author ein windartiger Coder
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.