Es ist bekannt, dass die Kommunikation zwischen einem Webserver und einem Client das HTTP -Protokoll verwendet. HTTP ist ein Standard für Client- und Serveranforderungen und Antworten (TCP). Da das HTTP -Protokoll auf dem TCP -Protokoll basiert, werde ich Socket in Java verwenden, um diesen einfachen Webserver zu vervollständigen. Für detailliertere HTTP -Informationen können Sie die relevanten Informationen konsultieren, um darüber zu erfahren.
Bevor Sie den Server schreiben, schauen wir uns die Kommunikationsregeln zwischen dem Browser und dem Server an.
Zunächst verwenden wir ServerSocket, um einen Server zu simulieren, über den Browser darauf zugreifen und den vom Browser angeforderten Inhalt anzeigen:
import Java.io.BuffenWriter; import Java.io.inputstream; Import Java.io.outputStreamwriter; importieren Sie Java.net.inetaddress; @Author Jiandgujin * * */public class hqhttpproTocoltest {@test public void server () löst Ausnahme aus {ServerSocket ServerSocket = new ServerSocket (80); Socket Socket = ServerSocket.accept (); InputStream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Führen Sie es mit Junit aus und greifen Sie über den Browser zu: http://127.0.0.1 können wir sehen, dass der Anforderungsinhalt des Browsers auf der Konsole wie folgt ist:
GET/HTTP/1.1HOST: 127.0.0.1Connection: Keep-Aliveaccept: Text/HTML, Anwendung/xhtml+xml, application/xml; Q = 0,9, Bild/Webp,*/*; Gecko) Chrom/31.0.1650.63 Safari/537.36ACcept-Codierung: Gzip, Deflate, Sdchaccept-Sprache: ZH-CN, ZH; Q = 0,8
Um den Anforderungsinhalt besser zu analysieren, schreiben wir eine HTML -Seite, um einige Daten einzureichen und den Anforderungsinhalt erneut anzeigen:
<! DocType html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> <form methode = "post" action = "http://127.0.0.1?test=123"> <Eingabe type = "name" name " Typ = "Senden"/> </form> </body> </html>
Geben Sie Bob in das Eingabefeld ein, klicken Sie auf die Schaltfläche, um zu senden, und beobachten Sie die Konsolenausgabe:
Post/? Test = 123 http/1.1HOST: 127.0.0.1Connection: Keep-AliveContent-Länge: 8Cache-Kontroll: max-altern = 0Accept: text/html, application/xhtml+xml, application/xml; (Windows Nt 5.1) Applewebkit/537,36 (KHTML, wie Gecko) Chrom/31.0.1650.63 Safari/537.36Content-Typ: Anwendung/x-www-form-urlencodedaccept-coding: gzip, deverpulat, sdchaccece-lanage: Zh-cn, zh.
Lassen Sie uns den Inhalt dieser Anfrage analysieren:
Die erste Zeile: besteht aus drei Teilen, die durch Leerzeichen in der Mitte getrennt sind. Der erste Teil ist die Anforderungsmethode (GET, post), der zweite Teil ist der Anforderungsweg und die Abfrageparameter, und der dritte Teil ist die HTTP -Protokollversion (HTTP/1.1)
Zeile 2 zu Zeile 10: Die Header -Informationen der Anfrage, der Name und der Wert des Anforderungsheaders werden übergeben: Trennen Sie die elfte Zeile: leere Zeile 12. Zeile: Sendete Formularinhalte, wir können die folgende Schlussfolgerung erhalten: Das erste Verhalten der Anforderungsinformationen ist die Anforderungsmethode, der Anforderungspfad, die Abfrageparameter und die HTTP -Protokollversion. Nach dem Zeilenumbruch /r /n folgen die Anforderungsheaderinformationen sofort von dem Zeilenumbruch /r /n, auf die Anforderungs -Header -Informationen folgen eine leere Zeile, nachdem die Anforderungs -Header -Informationen abgeschlossen sind und die Anforderungsdaten sofort von einer leeren Linie folgen. Es ist zu beachten, dass dies nur simuliert ist. In Bezug auf komplexe Dateieinreichungen usw. wird es hier nicht erörtert und das Anforderungsinhaltsformat ist geringfügig unterschiedlich.
Zu diesem Zeitpunkt haben wir bereits den vom Client angeforderten Inhalt gekannt. Schauen wir uns nach Erhalt der Anforderung das Format der Antwortdaten des Servers an. Wir erstellen ein neues Webprojekt zum Testen und Bearbeiten des Inhalts der HTML -Seite wie folgt:
<! DocType html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> Dies ist die Testseite. </Body> </html>
Starten Sie den Server und schreiben Sie dann den Client -Testcode, um die Server -Rückgabedaten zu erhalten:
import Java.io.buffenedWriter; import Java.io.inputstream; Import Java.io.outputStreamwriter; Import Java.net.Serversocket; Import Java.net.socket; void server () löst Ausnahme aus {ServerSocket ServerSocket = new ServerSocket (80); Socket Socket = ServerSocket.accept (); InputStream stream = socket.getInputStream (); // BufferedInputStream InputStream = New BufferedInputStream (Stream); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @Test public void Client () löst Ausnahme aus {Socket Socket = New Socket ("127.0.0.1", 80); BufferedWriter writer = neuer bufferedWriter (neuer 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 ("Verbindung: Keep-Alive/R/N"); writer.write ("Akzeptieren: text/html, application/xhtml+xml, application/xml; q = 0,9, Bild/webp,*/*; q = 0,8/r/n"); Writer.Write ("Benutzer-Agent: Mozilla/5.0 (Windows NT 5.1) Applewebkit/537.36 (KHTML, wie Gecko) Chrome/31.0.1650.63 Safari/537.36/r/n"); writer.write ("Akzeptieren: Gzip, Deflate, SDCH/r/n"); writer.write ("Akzeptieren Sie Sprache: 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); }}}Ausführen des Programms, um den Server zu erhalten, gibt den folgenden Inhalt zurück:
HTTP/1.1 200 OKServer: Apache-Coyote/1.1Accept-Ranges: bytesETag: W/"129-1456125361109"Last-Modified: Mon, 22 Feb 2016 07:16:01 GMTContent-Type: text/htmlContent-Length: 129Date: Mon, 22 Feb 2016 08:08:32 Gmt <! DocType html> <html> <kopf> <kopf> <meta charset = "utf-8"> <title> test </title> </head> <body> Dies ist eine Testseite. </Body> </html>
In ähnlicher Weise analysieren wir diese Rückgabenachricht:
Die erste Zeile besteht aus drei Teilen, die durch Leerzeichen in der Mitte getrennt sind. Der erste Teil ist die HTTP -Protokollversion (HTTP/1.1), der zweite Teil der Antwortstatuscode und der dritte Teil der Antwortstatusbeschreibung der zweiten Zeile der zweiten Zeile in die siebte Zeile, die Antwort -Header -Information wird zwischen dem Wert und dem Wert, der den Wert ist. Schlussfolgerung: Als erstes ist die Anfrageinformationen HTTP -Protokollversion, der Antwortstatuscode und die Beschreibung des Antwortstatus, und auf die Antwort -Header -Informationen folgen der Zeilenumbruch /R /N, und die Informationen zur Antwortheader werden von /r /n -Zeilenpause übergeben, und die Antwort -Header -Informationen folgen von einer leeren Linie, nach der die Antwort der Antwort abgeschlossen ist, und die Antwortdaten werden sofort von den Antwortdaten gefolgt. Es ist zu beachten, dass es zusätzlich zu dieser Antwort tatsächlich andere entsprechende Methoden wie Chunk gibt, die hier nicht besprochen werden, und Sie können die relevanten Informationen überprüfen.
Bisher haben wir das Anforderungsinhaltsformat des Clients und das entsprechende Inhaltsformat des Servers analysiert. Dieser Artikel endet hier. Ich hoffe, es wird für das Lernen aller hilfreich sein.