Ejemplo de Mini Java Socket Server
Este ejemplo explica como crear un pequeño servidor HTTP usando solamente Java Sockets. Puede ser útil para comunicarse con Cron jobs o para probar si java esta funcionando, si las comunicaciones con un puerto específico funcionan, para ver todos los headers enviados por un navegador web, o para comprobar si se está enviando datos post en un puerto específico.
También puede ser útil cuando necesitas un interfaz Web y no puedes instalar un servidor de aplicaciones.
Tiene las siguientes características.
- No necesita ninguna otra librería aparte de las que vienen en la JRE.
- Toma los datos post de la request.
- Usa un hilo por petición.
- Toma el post data en un array de Chars.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MiniServerSocketExample { private static final int PORT = 8080; public static void main(String[] args) { try { ServerSocket server = new ServerSocket(PORT); System.out.println("MiniServer active " + PORT); while (true) { new ThreadSocket(server.accept()); } } catch (Exception e) { } } } class ThreadSocket extends Thread { private Socket insocket; ThreadSocket(Socket insocket) { this.insocket = insocket; this.start(); } @Override public void run() { try { InputStream is = insocket.getInputStream(); PrintWriter out = new PrintWriter(insocket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(is)); String line; line = in.readLine(); String request_method = line; System.out.println("HTTP-HEADER: " + line); line = ""; // busca post data int postDataI = -1; while ((line = in.readLine()) != null && (line.length() != 0)) { System.out.println("HTTP-HEADER: " + line); if (line.indexOf("Content-Length:") > -1) { postDataI = new Integer( line.substring( line.indexOf("Content-Length:") + 16, line.length())).intValue(); } } String postData = ""; // lee el post data if (postDataI > 0) { char[] charArray = new char[postDataI]; in.read(charArray, 0, postDataI); postData = new String(charArray); } out.println("HTTP/1.0 200 OK"); out.println("Content-Type: text/html; charset=utf-8"); out.println("Server: MINISERVER"); // este linea en blanco marca el final de los headers de la response out.println(""); // Envía el HTML out.println("<H1>Bienvenido al Mini Server</H1>"); out.println("<H2>Request Method->" + request_method + "</H2>"); out.println("<H2>Post->" + postData + "</H2>"); out.println("<form name=\"input\" action=\"form_submited\" method=\"post\">"); out.println("Usuario: <input type=\"text\" name=\"user\"><input type=\"submit\"></form>"); out.close(); insocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Para Comprobar que Funciona.
Escribe http://localhost:8080 en tu navegador:
Errores Posibles
- Si el puerto ya está en uno(en el ejemplo el 808) saldrá una excepción java.net.BindException: Address already in use
- Si no tienes suficientes permisos para abrir el puerto especificado con el usuario con el que as arrancado el java o si está cortado por un firewall saldrá la excepción java.net.BindException: Permission denied
Notes
- Lo he probado con más de 2 millones de peticiones en 5 meses sin problemas.
- Cambia el Content type header si quieres servir otro tipo de contenidos como JSON, MP3, JPEGs, etc. ej. para mp3 "Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3". Necesitarás leer el archivo y sacarlo por el PrintWriter out.