410 Stimmen

Einfacher HTTP-Server in Java, der nur die Java SE API verwendet

Gibt es eine Möglichkeit, einen sehr einfachen HTTP-Server (der nur GET/POST unterstützt) in Java zu erstellen, indem man nur die Java SE API verwendet, ohne Code zu schreiben, um HTTP-Anfragen manuell zu parsen und HTTP-Antworten manuell zu formatieren? Die Java SE API kapselt die HTTP-Client-Funktionalität sehr gut in HttpURLConnection aber gibt es ein Analogon für die HTTP-Server-Funktionalität?

Nur um das klarzustellen: Das Problem, das ich mit einer Menge von ServerSocket Die Beispiele, die ich online gesehen habe, zeigen, dass sie ihre eigene Anfrageanalyse/Antwortformatierung und Fehlerbehandlung durchführen, was mühsam, fehleranfällig und wahrscheinlich nicht umfassend ist, und aus diesen Gründen versuche ich, es zu vermeiden.

3voto

George Punkte 6676

Überprüfen Sie takes . Blick auf https://github.com/yegor256/takes für schnelle Informationen

3voto

お試しください https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md

Diese API erstellt einen HTTP-Server unter Verwendung von Sockets.

  1. Es erhält eine Anfrage vom Browser als Text
  2. Analysiert sie, um URL-Informationen, Methode, Attribute usw. abzurufen.
  3. Erstellt eine dynamische Antwort unter Verwendung der definierten URL-Zuordnung
  4. Sendet die Antwort an den Browser.

So wird zum Beispiel der Konstruktor in der Datei Response.java Klasse wandelt eine rohe Antwort in eine http-Antwort um:

public Response(String resp){
    Date date = new Date();
    String start = "HTTP/1.1 200 OK\r\n";
    String header = "Date: "+date.toString()+"\r\n";
    header+= "Content-Type: text/html\r\n";
    header+= "Content-length: "+resp.length()+"\r\n";
    header+="\r\n";
    this.resp=start+header+resp;
}

2voto

Iqbal Punkte 570

Wie wäre es mit Apache Commons HttpCore Projekt?

Von der Website:... HttpCore-Ziele

  • Implementierung der grundlegendsten HTTP-Transportaspekte
  • Gleichgewicht zwischen guter Leistung und der Klarheit und Ausdruckskraft von API
  • Kleiner (vorhersehbarer) Speicherplatzbedarf
  • Eigenständige Bibliothek (keine externen Abhängigkeiten außer JRE)

1voto

Johnny Punkte 12351

Sie können eine ziemlich einfache eingebetteter Steg Java-Server.

Eingebettetes Jetty bedeutet, dass der Server (Jetty) zusammen mit der Anwendung ausgeliefert wird, im Gegensatz zur Bereitstellung der Anwendung auf einem externen Jetty-Server.

Wenn also bei einem nicht eingebetteten Ansatz Ihre Webanwendung in eine WAR-Datei eingebaut wird, die auf einem externen Server bereitgestellt wird ( Tomcat / Jetty / etc), in embedded Jetty, schreiben Sie die Webapp und instanziieren den Jetty-Server in der gleichen Codebasis.

Ein Beispiel für einen eingebetteten Jetty-Java-Server können Sie Git-Klon und verwenden: https://github.com/stas-slu/embedded-jetty-java-server-example

1voto

coterobarros Punkte 544

Die alte com.sun.net.httpserver ist seit Java 11 wieder eine öffentliche und akzeptierte API. Sie können es bekommen als HttpServer Klasse, verfügbar als Teil von jdk.httpserver Modul. Siehe https://docs.oracle.com/en/java/javase/11/docs/api/jdk.httpserver/com/sun/net/httpserver/HttpServer.html

Diese Klasse implementiert einen einfachen HTTP-Server. Ein HttpServer ist an eine IP-Adresse und eine Portnummer gebunden und lauscht auf eingehende TCP-Verbindungen von Clients an dieser Adresse. Die Unterklasse HttpsServer implementiert einen Server, der HTTPS-Anfragen bearbeitet.

Abgesehen von seinen Einschränkungen gibt es also keinen Grund mehr, auf seine Verwendung zu verzichten.

Ich verwende es, um eine Steuerungsschnittstelle in Serveranwendungen zu veröffentlichen. Das Lesen der User-agent Kopfzeile einer Client-Anfrage antworte ich sogar in text/plain zu CLI-Tools wie curl oder in eleganterer HTML-Form an jeden anderen Browser.

Cool und einfach.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X