Gibt es eine Möglichkeit, einen sehr einfachen HTTP-Server (der nur GET / POST unterstützt) in Java nur mit der Java SE-API zu erstellen, ohne Code zu schreiben, um HTTP-Anforderungen manuell zu analysieren und HTTP-Antworten manuell zu formatieren? Die Java SE-API kapselt die HTTP-Client-Funktionalität in HttpURLConnection gut, aber gibt es ein Analogon für die HTTP-Server-Funktionalität?
Um ganz klar zu sein, das Problem, das ich mit vielen ServerSocket-Beispielen habe, die ich online gesehen habe, ist, dass sie ihre eigenen Anforderungsanalyse- / Antwortformatierungen und Fehlerbehandlungen durchführen, was mühsam, fehleranfällig und wahrscheinlich nicht umfassend ist. und ich versuche es aus diesen Gründen zu vermeiden.
Als Beispiel für die manuelle HTTP-Manipulation, die ich vermeiden möchte:
http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html
quelle
Antworten:
Seit Java SE 6 gibt es in
SunOracle JRE einen integrierten HTTP-Server . Diecom.sun.net.httpserver
Paketzusammenfassung beschreibt die beteiligten Klassen und enthält Beispiele.Hier ist ein Kickoff-Beispiel, das aus ihren Dokumenten kopiert wurde (für alle Leute, die dennoch versuchen, es zu bearbeiten, da es sich um einen hässlichen Code handelt, bitte nicht, dies ist eine Kopierpaste, nicht meine, außerdem sollten Sie Zitate niemals bearbeiten, es sei denn, sie haben sich geändert in der Originalquelle). Sie können es einfach auf Java 6+ kopieren und einfügen.
Es sollte angemerkt werden, dass der
response.length()
Teil in ihrem Beispiel schlecht ist, es hätte sein sollenresponse.getBytes().length
. Auch dann ist diegetBytes()
Methode den Zeichensatz explizit angeben, den Sie dann im Antwortheader angeben. Leider ist es, obwohl es für Anfänger falsch ist, immerhin nur ein einfaches Kickoff-Beispiel.Führen Sie es aus und gehen Sie zu http: // localhost: 8000 / test. Die folgende Antwort wird angezeigt:
com.sun.*
Beachten Sie bei der Verwendung von Klassen, dass dies entgegen der Meinung einiger Entwickler in den bekannten FAQs, warum Entwickler keine Programme schreiben sollten, die "Sun" -Pakete aufrufen , absolut nicht verboten ist . Diese FAQ betrifft dassun.*
Paket (z. B.sun.misc.BASE64Encoder
) für die interne Verwendung durch die Oracle-JRE (wodurch Ihre Anwendung beendet wird, wenn Sie sie auf einer anderen JRE ausführen) und nicht dascom.sun.*
Paket. Sun / Oracle entwickelt wie jedes andere Unternehmen wie Apache usw. auch nur Software auf der Java SE-API. Die Verwendung voncom.sun.*
Klassen wird nur empfohlen (aber nicht verboten), wenn es sich um eine Implementierung einer bestimmten Java-API handelt, z. B. GlassFish (Java EE impl), Mojarra (JSF impl), Jersey (JAX-RS impl) usw.quelle
sun.*
mitcom.sun.*
. Sehen Sie beispielsweise eine Dokumentation dersun.*
API? Schauen Sie hier: java.sun.com/products/jdk/faq/faq-sun-packages.html Erzählt es etwas darübercom.sun.*
? Dascom.sun.*
wird nur für ihre eigene öffentliche Software verwendet, die nicht Teil der Java-API ist. Wie jedes andere Unternehmen entwickeln sie auch Software über die Java-API.@jdk.Exported
im OpenJDK-Quellcode markiert. Dies bedeutet, dass die API als öffentlich betrachtet wird und unter Java 9 verfügbar ist (einige anderecom.sun.*
Pakete sind aufgrund von Project Jigsaw nicht mehr verfügbar).Schauen Sie sich NanoHttpd an
"NanoHTTPD ist ein leichter HTTP-Server, der zum Einbetten in andere Anwendungen entwickelt wurde und unter einer modifizierten BSD-Lizenz veröffentlicht wurde.
Es wird bei Github entwickelt und verwendet Apache Maven für Builds und Unit-Tests. "
quelle
GET /../../blahblah http/1.1
ausgegeben wird und der Server über das Stammverzeichnis der Website in das Systemdateiland gelangt und Dateien bereitstellt, mit denen das System kompromittiert oder remote angegriffen werden kann, z. B. eine Kennwortdatei.Die Lösung com.sun.net.httpserver ist nicht über JREs portierbar. Es ist besser, die offizielle Webservices-API in javax.xml.ws zu verwenden, um einen minimalen HTTP-Server zu booten ...
EDIT: das funktioniert tatsächlich! Der obige Code sieht aus wie Groovy oder so. Hier ist eine Übersetzung nach Java, die ich getestet habe:
quelle
text/xml
.Ich mag diese Frage, weil dies ein Bereich ist, in dem es kontinuierliche Innovationen gibt und immer ein leichter Server erforderlich ist, insbesondere wenn es um eingebettete Server in kleinen (er) Geräten geht. Ich denke, die Antworten fallen in zwei große Gruppen.
Während ich HTTP-Bibliotheken wie Jetty , Apache Http Components , Netty und andere eher als rohe HTTP-Verarbeitungsfunktionen betrachten könnte. Die Kennzeichnung ist sehr subjektiv und hängt von der Art der Dinge ab, die Sie für kleine Websites geliefert haben. Ich mache diese Unterscheidung im Geiste der Frage, insbesondere der Bemerkung über ...
Mit diesen Rohwerkzeugen können Sie dies tun (wie in anderen Antworten beschrieben). Sie eignen sich nicht wirklich für einen sofort einsatzbereiten Stil, um einen leichten, eingebetteten oder Mini-Server herzustellen. Ein Mini-Server bietet Ihnen ähnliche Funktionen wie ein voll funktionsfähiger Webserver (z. B. Tomcat ) ohne Schnickschnack, mit geringem Volumen und 99% der Zeit mit guter Leistung. Ein Thin-Server scheint der ursprünglichen Formulierung nur ein bisschen mehr als roh zu sein, vielleicht mit einer eingeschränkten Teilmengenfunktionalität, die ausreicht, um Sie in 90% der Fälle gut aussehen zu lassen. Meine Vorstellung von roh würde mich 75% - 89% der Zeit ohne zusätzliches Design und Codierung gut aussehen lassen. Ich denke, wenn Sie das Niveau der WAR-Dateien erreichen, haben wir das "kleine" für Bonsi-Server belassen, das aussieht wie alles, was ein großer Server kleiner macht.
Thin-Server-Optionen
Mini-Server-Optionen:
Unter anderem würde ich Authentifizierung, Validierung, Internationalisierung und die Verwendung von FreeMaker oder einem anderen Vorlagentool zum Rendern der Seitenausgabe einschließen . Andernfalls sieht die Verwaltung der HTML-Bearbeitung und -Parametrisierung wahrscheinlich so aus, als würde die Arbeit mit HTTP wie Nullen und Kreuze aussehen. Natürlich hängt alles davon ab, wie flexibel Sie sein müssen. Wenn es sich um eine menügesteuerte Faxmaschine handelt, kann dies sehr einfach sein. Je mehr Interaktionen, desto " dicker " muss Ihr Framework sein. Gute Frage, viel Glück!
quelle
Werfen Sie einen Blick auf die „Jetty“ Webserver Jetty . Hervorragende Open Source-Software, die alle Ihre Anforderungen zu erfüllen scheint.
Wenn Sie darauf bestehen, Ihre eigenen zu rollen, schauen Sie sich die Klasse "httpMessage" an.
quelle
Es war einmal, als ich nach etwas Ähnlichem suchte - einem leichten, aber voll funktionsfähigen HTTP-Server, den ich einfach einbetten und anpassen konnte. Ich habe zwei Arten möglicher Lösungen gefunden:
Also ... machte ich mich daran, JLHTTP - The Java Lightweight HTTP Server zu schreiben .
Sie können es in jedes Projekt als einzelne (wenn auch ziemlich lange) Quelldatei oder als ~ 50K-JAR (~ 35K entfernt) ohne Abhängigkeiten einbetten. Es ist bestrebt, RFC-konform zu sein und enthält eine umfangreiche Dokumentation sowie viele nützliche Funktionen, während das Aufblähen auf ein Minimum beschränkt bleibt.
Zu den Funktionen gehören: virtuelle Hosts, Dateien, die von der Festplatte bereitgestellt werden, MIME-Typzuordnungen über die Standarddatei mime.types, Verzeichnisindexgenerierung, Begrüßungsdateien, Unterstützung für alle HTTP-Methoden, Unterstützung für bedingte ETags und If- * -Header, Chunked-Transfer-Codierung, gzip / deflate Komprimierung, grundlegendes HTTPS (wie von der JVM bereitgestellt), Teilinhalt (Fortsetzung des Downloads), mehrteilige / Formulardatenverarbeitung für Datei-Uploads, mehrere Kontext-Handler über API oder Anmerkungen, Parameteranalyse (Abfragezeichenfolge oder x-www-form-urlencoded) Körper) usw.
Ich hoffe andere finden es nützlich :-)
quelle
Einen sehr einfachen, in Java geschriebenen Webserver finden Sie hier http://library.sourcerabbit.com/v/?id=19
quelle
Spark ist am einfachsten. Hier ist eine Kurzanleitung: http://sparkjava.com/
quelle
Es ist möglich, einen http-Server zu erstellen, der grundlegende Unterstützung für J2EE-Servlets mit nur dem JDK und der Servlet-API in nur wenigen Codezeilen bietet.
Ich fand dies sehr nützlich für Unit-Test-Servlets, da es viel schneller startet als andere leichte Container (wir verwenden Steg für die Produktion).
Die meisten sehr leichten http-Server bieten keine Unterstützung für Servlets, aber wir brauchen sie, also dachte ich, ich würde sie teilen.
Das folgende Beispiel bietet grundlegende Servlet-Unterstützung oder Throws und UnsupportedOperationException für noch nicht implementierte Inhalte. Es verwendet den com.sun.net.httpserver.HttpServer für die grundlegende http-Unterstützung.
quelle
Ich kann dringend empfehlen, sich mit Simple zu befassen, insbesondere wenn Sie keine Servlet-Funktionen benötigen, sondern einfach auf die Anforderungs- / Antwortobjekte zugreifen. Wenn Sie REST benötigen, können Sie Jersey darüber legen. Wenn Sie HTML oder ähnliches ausgeben müssen, gibt es Freemarker. Ich finde es wirklich toll, was man mit dieser Kombination machen kann, und es gibt relativ wenig API zu lernen.
quelle
Dieser Code ist besser als unser Code. Sie müssen nur zwei Bibliotheken hinzufügen: javax.servelet.jar und org.mortbay.jetty.jar .
Klassensteg:
Servlet-Klasse:
quelle
*.Servlet.jar
und*.jetty.jar
sind offensichtlich nicht Teil von Java SE.Sie können sich auch einige NIO-Anwendungsframeworks ansehen, z.
quelle
Alle oben genannten Antworten enthalten Details zum Anforderungshandler mit einem Haupt-Thread.
Rahmen:
Ermöglicht die Bearbeitung mehrerer Anforderungen über mehrere Threads mithilfe des Executor-Dienstes.
Der Endcode lautet also wie folgt:
quelle
Kasse Einfach . Es ist ein ziemlich einfacher einbettbarer Server mit integrierter Unterstützung für eine Vielzahl von Vorgängen. Ich liebe besonders das Einfädelmodell.
Tolle!
quelle
Auschecken
takes
. Unter https://github.com/yegor256/takes finden Sie schnelle Informationenquelle
Wie wäre es mit Apache Commons HttpCore- Projekt?
Von der Website: ... HttpCore-Ziele
quelle
Versuchen Sie dies unter https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md
Diese API hat einen HTTP-Server mithilfe von Sockets erstellt.
So
Response.java
konvertiert der Konstruktor in der Klasse beispielsweise eine unformatierte Antwort in eine http-Antwort:quelle
Sie können einen ziemlich einfachen eingebetteten Jetty Java-Server schreiben .
Embedded Jetty bedeutet, dass der Server (Jetty) zusammen mit der Anwendung ausgeliefert wird, anstatt die Anwendung auf einem externen Jetty-Server bereitzustellen.
Wenn Ihre Webanwendung im nicht eingebetteten Ansatz in eine WAR-Datei integriert ist, die auf einem externen Server ( Tomcat / Jetty / etc) bereitgestellt wurde, schreiben Sie in Embedded Jetty die Webanwendung und instanziieren den Jetty-Server in derselben Codebasis.
Ein Beispiel für einen eingebetteten Jetty Java-Server, den Sie klonen und verwenden können: https://github.com/stas-slu/embedded-jetty-java-server-example
quelle