====== 05 - Servidor HTTP del JDK ======
===== HttpServer del JDK =====
A partir de **Java 6**, el JDK incluye un servidor HTTP muy sencillo de usar:
* Se encuentra en el paquete `com.sun.net.httpserver`.\\ \\
* Permite crear un servidor HTTP sin librerías externas.\\ \\
* Gestiona **múltiples clientes** automáticamente mediante hilos.\\ \\
* Se pueden definir **handlers** para distintas rutas.\\ \\
===== Código básico =====
**HttpServerJdk**
package es.cesguiro.socket;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
public class HttpServerJdk {
private final int port = 8080;
public void start() throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
System.out.println("HTTP server started on port " + port);
// Un único handler que sirve archivos desde resources/www
server.createContext("/", new FileHandler());
server.setExecutor(null); // usa el executor por defecto
server.start();
}
static class FileHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
String path = exchange.getRequestURI().getPath();
// Mapear "/" a index.html
if (path.equals("/")) {
path = "/index.html";
}
// Leer el archivo desde resources/www
InputStream is = getClass().getResourceAsStream("/www" + path);
if (is == null) {
String notFound = "404 Not Found
";
exchange.sendResponseHeaders(404, notFound.getBytes().length);
OutputStream os = exchange.getResponseBody();
os.write(notFound.getBytes());
os.close();
return;
}
// Leer el contenido del archivo
byte[] content = is.readAllBytes();
exchange.sendResponseHeaders(200, content.length);
OutputStream os = exchange.getResponseBody();
os.write(content);
os.close();
}
}
}
**Main**
package es.cesguiro.socket;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
HttpServerJdk server = new HttpServerJdk();
try {
server.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
===== Ventajas frente a nuestro mini servidor =====
* No hay que gestionar sockets ni hilos manualmente.\\ \\
* Permite definir rutas específicas con handlers.\\ \\
* Se puede extender para servir **ficheros estáticos** o crear **APIs REST**.\\ \\
* Ideal para pruebas y prototipos antes de usar un contenedor como Tomcat.\\ \\
===== Ejecución =====
- Arranca `Main.java`.\\ \\
- Accede en el navegador:
* http://localhost:8080/ → ruta `/`
* http://localhost:8080/about → ruta `/about`