Article updated on

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:

img/0/11/sc2.jpeg

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.