Erste Einführung in das HTTP-Protokoll durch Schreiben des einfachsten Java-Webservers

Ich denke, es wäre keine Übertreibung zu sagen, dass das Wissen und Verstehen des Wesens des HTTP-Protokolls für jeden notwendig ist, der sich ernsthaft für einen der Bereiche der modernen Webentwicklung entschieden hat. Meine persönliche Erfahrung zeigt, dass das Verständnis nicht sofort kommt. Ich schäme mich zu sagen, dass es Zeiten gab, in denen die Wörter GET und POST für mich wie Zaubersprüche waren, und ich ahnte nicht einmal die Existenz von PUT, PATCH und DELETE.

Vor einigen Monaten begann ich neben der eigentlichen Entwicklung auch zu unterrichten, und es stellte sich die Frage, wie es einfacher und klarer ist, den zukünftigen Java-Entwicklern das Wesentliche des HTTP-Protokolls zu erklären. Nach mehreren Tagen der Aufregung und einer Reihe erfolgloser Versuche, eine Präsentation zu erstellen, kam die Idee auf, warum nicht einen einfachen HTTP-Server in Java schreiben, da er das Wesentliche des Protokolls nicht so gut erklärt wie seine einfachste, aber funktionierende Implementierung.

Wie sich herausstellte, ist dies überhaupt nicht schwierig. Unten finden Sie den Code, der für die korrekte Interaktion mit jedem Browser ausreicht! Wir benötigen lediglich einen ServerSocket und einige Standard-E / A.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) { //   Socket socket = serverSocket.accept(); System.out.println("Client connected!"); //      //    try (BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter output = new PrintWriter(socket.getOutputStream())) { //     while (!input.ready()) ; //         System.out.println(); while (input.ready()) { System.out.println(input.readLine()); } //   output.println("HTTP/1.1 200 OK"); output.println("Content-Type: text/html; charset=utf-8"); output.println(); output.println("<p> !</p>"); output.flush(); //     try-with-resources , //         System.out.println("Client disconnected!"); } } } catch (IOException ex) { ex.printStackTrace(); } } } 

Versuchen Sie, diesen Code auszuführen. Es ist zu beachten, dass der Port, für den ServerSocket erstellt wird, frei sein muss. Wenn der angegebene Port belegt ist, müssen Sie ihn entweder freigeben oder einen anderen freien Port verwenden.

Gehen Sie nach dem Ausführen dieses Codes zum Browserfenster und geben Sie die Adressleiste http://localhost:8080/ . Wenn alles gut gegangen ist, sehen wir im Browserfenster den Text "Hallo allerseits" und im Serverprotokolltext ähnlich dem folgenden:

 Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected! 

Jedes Mal, wenn wir etwas in die Adressleiste des Browsers eingeben und die Eingabetaste drücken, geschieht nichts anderes als das Senden von Text, der mit dem Wort GET beginnt und mit einem Zeilenvorschub endet. Nach dem Wort GET folgt ein Leerzeichen dem Pfad zum angeforderten Dokument auf dem Server. Geben Sie http://localhost:8080/something in den Browser ein und sehen Sie, wie sich der Anforderungstext im Protokoll ändert.

In den Abfragezeilen sind ab der zweiten die sogenannten Header, über die Informationen zu Client-Einstellungen an den Server übertragen werden. Jede Kopfzeile hat das Format [ ] : []; []; ... [] [ ] : []; []; ... [] [ ] : []; []; ... [] .

Nachdem der Anfragetext vom Server vollständig gelesen wurde, senden wir ihm die einfachste Antwort, deren Struktur recht einfach ist und der Struktur der Anfrage ähnelt. Die erste Zeile enthält die HTTP-Protokollversion und den 200-OK- Code, der dem Browser mitteilt, dass die Anforderung erfolgreich verarbeitet wurde (jeder kennt den 404-Code besser, nicht wahr;)). Darauf folgt nur eine Überschrift vom Typ Inhalt, in der Informationen über das Format des übertragenen Dokuments (Text / HTML) und dessen Codierung (Zeichensatz = utf-8) übertragen werden. Nach dem Header befindet sich ein Zeilenvorschub (eine obligatorische Anforderung des HTTP-Protokolls) und der tatsächliche Text, der im Browser angezeigt wird.

Das ist alles! Dies ist natürlich alles andere als alles, was Sie über das HTTP-Protokoll und die Prinzipien der Entwicklung von Webservern wissen müssen, aber ich möchte dieses Beispiel nicht komplizieren, weil Seine Hauptaufgabe ist es, die einfachste Kommunikation über das HTTP-Protokoll zu demonstrieren. In einem meiner nächsten Artikel werde ich versuchen, das Thema des Studierens des HTTP-Protokolls durch dessen Implementierung zu entwickeln.

UPD Ein viel fortgeschritteneres Beispiel für einen solchen Server finden Sie in Funktionsweise von Tomcat: Ein Handbuch zur Entwicklung Ihres eigenen Java-Servlet-Containers von Paul Deck, Budi Kurniawan , Kapitel 1 - Einfacher Webserver .

UPD1. Webinar basierend auf diesem Artikel www.youtube.com/watch?v=RBUFdFKg_rI

Source: https://habr.com/ru/post/de441150/


All Articles