Un servidor HTTP en cinco minutos

03:30PM mar 24, 2004 in category Programacion by Alberto Gimeno

Estaba el otro día haciendo el friki con la tarjeta inalámbrica de mi portátil en la cafetaría de la universidad y un compañero también tenía un portátil con wireless. Así que montamos una red de ordenador a ordenador. Una vez conectados y verificando que podemos acceder el uno al otro pienso... voy a pasarte unos archivos. ¿Pero cómo? Tengo un ibook desde hace poco y no sabía como compartir mis archivos, así que ni corto ni perezoso le dije a mi compañero: "¡Espera que hago un servidor web!". Y aquí está el código:

import java.io.*;
import java.net.*;

public class Servidor {
    public static void main(String args[]) throws Exception {
	int port = Integer.parseInt(args[0]);
	ServerSocket ss = new ServerSocket(port);
	Socket s = null;
	System.out.println("Servidor escuchando en: "+port);
	
	while((s = ss.accept()) != null){
	    System.out.println("Conexion recibida");
	    OutputStream os = s.getOutputStream();
	    InputStream in = s.getInputStream();
	    BufferedReader br = new BufferedReader(new InputStreamReader(in));
	    String line = br.readLine();
	    int espacio;
	    espacio = line.indexOf(" ");
	    String uri = line.substring(espacio+1, line.indexOf(" ", espacio+1));
	    uri = uri.substring(1, uri.length());
	    File f = new File(uri);
	    FileInputStream fis = new FileInputStream(f);
	    os.write("HTTP/1.1 200 OK\r\n".getBytes());
	    os.write("Content-length: ".getBytes());
	    os.write((fis.available()+"").getBytes());
	    os.write("\r\n".getBytes());
	    os.write("Content-type: text/plain\r\n".getBytes());
	    os.write("\r\n".getBytes());

	    int size = fis.available();
	    for(int i=0; i<size; i++)
		os.write(fis.read());

	    os.close();
	    fis.close();
	    s.close();
	    System.out.println("peticion finalizada");
	}
    }
}

Ejecutas por ejemplo

java Servidor 8080

Y escribes por ejemplo: http://localhost:8080/Servidor.java en el navegador. Verás el propio código fuente del programa.

Voy a añadir alguna cosilla, como que liste el contenido de un dirctorio y lo mandaré a la sección "Código útil" de javaHispano.

Comentarios[7]

Comentarios:

Decir freaky sería suficiente :D.<br>
Por cierto que tal funciona ese 'ibook', me gustan muchos los portátiles, y este que comentas sólo lo he visto en las tiendas, no he podido probarlo de ningún amigo, la verdad es que parece bastante ligero, ¿q tal la batería, tiene mucha autonomía? ¿y el rendimiento? ¿q tal con java? ¿y q te parece mac os? La verdad es que estuve viendo los precios del mercado hace unas semanas y ufff! mi economía no lo soporta :-).

Enviado por Jenaiz en marzo 24, 2004 a las 05:04 PM GMT+01:00 #

Yo estoy encantado con mi ibook de 12". Pesa muy poco (2kilos). Al principio temí que la pantalla se me hiciera pequeña (estaba acostumbrado a un portátil de 15") pero tiene buena resolución (1024x728) y no se nota mucho la diferencia de tamaño.

Sólo me costó 1.200 euros. La autonomía es de unas cinco horas. El rendimiento es bastante bueno, no vuela pero va muy bien. Java va muy, muy bien; las aplicaciones Swing van muy sueltas y tienen por defecto el look&feel aqua que es precioso. Bueno, en el jedit la barra de scroll va un poco a latigazos. Mac OS X es sencillamente genial. Tienes las ventajas de un Unix con una increíble interfaz gráfica que tiene muchas pijadillas muy atractivas y algunas muy útiles como el exposé que permite con un botón redimensionar todas las ventanas para verlas todas de vez.

Y por fuera es muy atractivo, es como un libro. el cargador de batería es muy pequeño, todos los cables van protegidos con un capuchón de plástico,... Está pensado al milímetro!

A mi me encanta y comparándolo con un centrino de similares características (atonomía, peso, rendimiento) te puedes ahorrar unos 300 euros.

Enviado por gimenete en marzo 24, 2004 a las 05:36 PM GMT+01:00 #

jeje Mola tu servidor. Una sujerencia: si cuando recibes la petición la gestionas en un nuevo hilo, aumentas la disponibilidad a cambio de 4 o 5 lineas más de código.
<br><br>
¿O pensabas que eres el único friki del lugar?? ;-)

Enviado por nacho en marzo 24, 2004 a las 06:42 PM GMT+01:00 #

Interesante clase :)
Por cierto, cómo haces para que el código entre <pre>...</pre> tenga una barra de desplazamiento? Nunca he sabido cómo solucionar el problema de los bloques pre's con la maquetación en CSS. :(

Enviado por vitxo. en marzo 24, 2004 a las 07:55 PM GMT+01:00 #

Hola vitxo.
<br/><br/>
Lo hago del siguiente modo: "overflow: auto;".
La propiedad "overflow" tiene cuatro posibles valores: visible, hidden, scroll, auto. Visible es el valor por defecto, lo que se salga de su sitio se muestra de todas formas. Con hidden como se puede adivinar hace lo que se salga no se muestre. Con scroll siempre se muestran barras de desplazamiento, y con auto sólo cuando sea necesario.
<br/><br/>
Hola nacho
<br/><br/>
Si, hacer que cada petición se procese en un hilo es una mejora importante y con poco código. También sería importante poner un try-catch(Throwable e) por cada petición, para que un error en una petición no tire el servidor. Pero bueno, el propósito era pasarle un archivo a mi compañero.
<br/><br/>
Un saludo!

Enviado por gimenete en marzo 24, 2004 a las 09:19 PM GMT+01:00 #

¿Cómo sería el código para que se procesara en un nuevo hijo?

Gracias.

Enviado por Álvaro en febrero 26, 2007 a las 06:36 PM GMT+01:00 #

Hola, buenas. Solo queria proponerte que la proxima vez que te aburras en la cafeteria intentes implementar un servidor http/1.1 que no cierre la conexion despues de responder a una request. Porque aunque se supone que en http/1.1 las conexiones son persistentes, llevo una semana en el trabajo intentando hacer 2 request bajo la misma conexion y no lo he conseguido aun.
Que te parece el reto???

Enviado por Gabriel en diciembre 27, 2007 a las 10:47 AM GMT+01:00 #

Enviar un comentario:
  • Sintaxis HTML: Deshabilitado