¿Hay alguna manera de crear un servidor HTTP muy básico (compatible solo con GET / POST) en Java usando solo la API Java SE, sin escribir código para analizar manualmente las solicitudes HTTP y formatear manualmente las respuestas HTTP? La API Java SE encapsula muy bien la funcionalidad del cliente HTTP en HttpURLConnection, pero ¿hay un análogo para la funcionalidad del servidor HTTP?
Para ser claros, el problema que tengo con muchos ejemplos de ServerSocket que he visto en línea es que hacen su propio formato de análisis / respuesta de solicitudes y manejo de errores, que es tedioso, propenso a errores y no es probable que sea completo, y estoy tratando de evitarlo por esas razones.
Como ejemplo de la manipulación manual de HTTP que estoy tratando de evitar:
http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html
fuente
Respuestas:
Desde Java SE 6, hay un servidor HTTP incorporado en
SunOracle JRE. Elcom.sun.net.httpserver
resumen del paquete describe las clases involucradas y contiene ejemplos.Aquí hay un ejemplo de inicio copiado de sus documentos (para todas las personas que intentan editarlo, ya que es un código feo, no lo hagas, esta es una copia pegada, no la mía, además nunca deberías editar citas a menos que hayan cambiado) en la fuente original). Puede copiarlo y pegarlo y ejecutarlo en Java 6+.
Se debe tener en cuenta que la
response.length()
parte de su ejemplo es mala, debería haberlo sidoresponse.getBytes().length
. Incluso entonces, elgetBytes()
método debe especificar explícitamente el conjunto de caracteres que luego especifique en el encabezado de respuesta. Por desgracia, aunque es un error para los principiantes, después de todo es solo un ejemplo básico de lanzamiento.Ejecútelo y vaya a http: // localhost: 8000 / test y verá la siguiente respuesta:
En cuanto al uso de
com.sun.*
clases, tenga en cuenta que esto, al contrario de lo que piensan algunos desarrolladores, no está absolutamente prohibido por las conocidas preguntas frecuentes Por qué los desarrolladores no deben escribir programas que llamen paquetes 'sun' . Las preguntas frecuentes se refieren alsun.*
paquete (comosun.misc.BASE64Encoder
) para uso interno de Oracle JRE (lo que mataría su aplicación cuando la ejecute en un JRE diferente), no elcom.sun.*
paquete. Sun / Oracle también acaba de desarrollar software sobre la API Java SE, como todas las demás empresas, como Apache, etc. El uso decom.sun.*
clases solo se desaconseja (pero no está prohibido) cuando se trata de una implementación de una determinada API de Java, como GlassFish (Java EE impl), Mojarra (JSF impl), Jersey (JAX-RS impl), etc.fuente
sun.*
concom.sun.*
. Por ejemplo, ¿ves alguna documentación desun.*
API? Mire aquí: java.sun.com/products/jdk/faq/faq-sun-packages.html ¿Cuenta algo sobre estocom.sun.*
? Elcom.sun.*
solo se utiliza para su propio software público que no es parte de la API de Java. También desarrollan software sobre la API de Java, como cualquier otra empresa.@jdk.Exported
en el código fuente de OpenJDK, lo que significa que la API se considera pública y estará disponible en Java 9 (algunos otroscom.sun.*
paquetes no estarán disponibles debido a Project Jigsaw).Echa un vistazo a NanoHttpd
"NanoHTTPD es un servidor HTTP liviano diseñado para integrarse en otras aplicaciones, lanzado bajo una licencia BSD modificada.
Se está desarrollando en Github y utiliza Apache Maven para compilaciones y pruebas unitarias "
fuente
GET /../../blahblah http/1.1
se emite una solicitud como y el servidor camina por encima de la raíz del sitio web y en la tierra de archivos del sistema, sirviendo archivos que pueden utilizarse para comprometer o atacar remotamente el sistema, como un archivo de contraseña.La solución com.sun.net.httpserver no es portátil en todos los JRE. Es mejor usar la API oficial de servicios web en javax.xml.ws para arrancar un servidor HTTP mínimo ...
EDITAR: esto realmente funciona! El código anterior se parece a Groovy o algo así. Aquí hay una traducción a Java que probé:
fuente
text/xml
.Me gusta esta pregunta porque esta es un área donde hay innovación continua y siempre es necesario tener un servidor ligero, especialmente cuando se habla de servidores integrados en dispositivos pequeños (er). Creo que las respuestas se dividen en dos grandes grupos.
Si bien podría considerar que las bibliotecas HTTP como: Jetty , Apache Http Components , Netty y otras se parecen más a las instalaciones de procesamiento HTTP sin procesar. El etiquetado es muy subjetivo y depende de los tipos de cosas que ha sido llamado a entregar para sitios pequeños. Hago esta distinción en el espíritu de la pregunta, particularmente el comentario sobre ...
Estas herramientas en bruto le permiten hacer eso (como se describe en otras respuestas). Realmente no se prestan a un estilo listo para usar de hacer un servidor ligero, incrustado o mini-servidor. Un mini servidor es algo que puede brindarle una funcionalidad similar a un servidor web con todas las funciones (como, por ejemplo, Tomcat ) sin campanas y silbatos, bajo volumen, buen rendimiento el 99% del tiempo. Un servidor delgado parece estar más cerca de la redacción original solo un poco más que en bruto, tal vez con una funcionalidad de subconjunto limitada, suficiente para que te veas bien el 90% del tiempo. Mi idea de raw sería hacerme quedar bien del 75% al 89% del tiempo sin diseño y codificación adicionales. Creo que si / cuando alcanzas el nivel de archivos WAR, dejamos el "pequeño" para servidores bonsi que parece todo lo que un servidor grande hace más pequeño.
Opciones de servidor delgado
Opciones de miniservidor:
Entre las otras cosas a considerar, incluiría autenticación, validación, internacionalización, usando algo como FreeMaker u otra herramienta de plantilla para representar la salida de la página. De lo contrario, es probable que administrar la edición y la parametrización HTML haga que trabajar con HTTP parezca noughts-n-Cross Naturalmente, todo depende de cuán flexible necesite ser. Si se trata de una máquina de fax controlada por menús, puede ser muy simple. Cuantas más interacciones, más ' grueso ' debe ser tu marco. Buena pregunta, buena suerte!
fuente
Echa un vistazo al servidor web "Jetty" Jetty . Excelente pieza de software de código abierto que parece cumplir con todos sus requisitos.
Si insiste en lanzar el suyo propio, eche un vistazo a la clase "httpMessage".
fuente
Érase una vez que estaba buscando algo similar: un servidor HTTP liviano pero totalmente funcional que pudiera incrustar y personalizar fácilmente. Encontré dos tipos de posibles soluciones:
Entonces ... me propuse escribir JLHTTP - El servidor HTTP ligero de Java .
Puede incrustarlo en cualquier proyecto como un único archivo fuente (si es bastante largo), o como un jar de ~ 50K (~ 35K despojado) sin dependencias. Se esfuerza por cumplir con RFC e incluye una amplia documentación y muchas características útiles, manteniendo la hinchazón al mínimo.
Las características incluyen: hosts virtuales, servicio de archivos desde el disco, asignaciones de tipo mime a través del archivo mime.types estándar, generación de índice de directorio, archivos de bienvenida, soporte para todos los métodos HTTP, ETags condicionales y soporte de encabezado If- *, codificación de transferencia fragmentada, gzip / deflate compresión, HTTPS básico (como lo proporciona la JVM), contenido parcial (continuación de descarga), manejo de datos multiparte / formulario para cargas de archivos, manejadores de contexto múltiples a través de API o anotaciones, análisis de parámetros (cadena de consulta o x-www-form-urlencoded cuerpo), etc.
Espero que otros lo encuentren útil :-)
fuente
Puede encontrar un servidor web muy básico escrito en Java aquí http://library.sourcerabbit.com/v/?id=19
fuente
Spark es el más simple, aquí hay una guía de inicio rápido: http://sparkjava.com/
fuente
Es posible crear un httpserver que brinde soporte básico para servlets J2EE con solo el JDK y la API de servlet en solo unas pocas líneas de código.
He encontrado esto muy útil para los servlets de prueba de unidades, ya que comienza mucho más rápido que otros contenedores livianos (utilizamos el embarcadero para la producción).
La mayoría de los httpservers muy livianos no brindan soporte para servlets, pero los necesitamos, así que pensé en compartirlos.
El siguiente ejemplo proporciona soporte básico de servlet, o throws y UnsupportedOperationException para cosas que aún no están implementadas. Utiliza com.sun.net.httpserver.HttpServer para soporte básico de http.
fuente
Puedo recomendar encarecidamente buscar en Simple , especialmente si no necesita las capacidades de Servlet, sino simplemente acceder a los objetos de solicitud / respuesta. Si necesita REST puede poner Jersey encima, si necesita generar HTML o similar, hay Freemarker. Realmente me encanta lo que puedes hacer con esta combinación, y hay relativamente poca API para aprender.
fuente
Este código es mejor que el nuestro, solo necesita agregar 2 libs: javax.servelet.jar y org.mortbay.jetty.jar .
Embarcadero de clase:
Clase de servlet:
fuente
*.Servlet.jar
y*.jetty.jar
obviamente no son parte de Java SE.También puede echar un vistazo a algunos marcos de aplicaciones NIO como:
fuente
Todo lo anterior responde a detalles sobre el controlador de solicitud de subproceso principal único.
ajuste:
Permite el servicio de múltiples solicitudes a través de múltiples hilos utilizando el servicio ejecutor.
Entonces el código final será algo como a continuación:
fuente
Pago simple . es un servidor incrustable bastante simple con soporte integrado para una gran variedad de operaciones. Particularmente me encanta su modelo de roscado.
¡Asombroso!
fuente
Echa un vistazo
takes
. Mire https://github.com/yegor256/takes para obtener información rápidafuente
¿Qué hay del proyecto Apache Commons HttpCore ?
Desde el sitio web: ... Objetivos HttpCore
fuente
Pruebe esto https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md
Esta API ha creado un servidor HTTP utilizando sockets.
Por ejemplo, así es como el constructor de la
Response.java
clase convierte una respuesta sin formato en una respuesta http:fuente
Puede escribir un servidor Jetty Java incrustado bastante simple .
Embedded Jetty significa que el servidor (Jetty) se envió junto con la aplicación en lugar de implementar la aplicación en un servidor Jetty externo.
Entonces, si en un enfoque no integrado, su aplicación web incorporada en el archivo WAR que se implementó en un servidor externo ( Tomcat / Jetty / etc.), en Jetty integrado, usted escribe la aplicación web y crea una instancia del servidor de muelle en la misma base de código.
Un ejemplo para el servidor Jetty Java embebido puede clonar y usar: https://github.com/stas-slu/embedded-jetty-java-server-example
fuente