0% encontró este documento útil (0 votos)
7 vistas5 páginas

Sockets

El documento describe cómo crear un servidor web en Java de menos de 10K, explicando el uso de protocolos como HTTP para la transferencia de archivos. Se detalla la estructura de las peticiones y respuestas entre el navegador y el servidor, así como la implementación de clases como ServerSocket y Request para manejar conexiones. Además, se proporcionan instrucciones para compilar y ejecutar el servidor utilizando el Java Development Kit.

Cargado por

carlos riveros
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas5 páginas

Sockets

El documento describe cómo crear un servidor web en Java de menos de 10K, explicando el uso de protocolos como HTTP para la transferencia de archivos. Se detalla la estructura de las peticiones y respuestas entre el navegador y el servidor, así como la implementación de clases como ServerSocket y Request para manejar conexiones. Además, se proporcionan instrucciones para compilar y ejecutar el servidor utilizando el Java Development Kit.

Cargado por

carlos riveros
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

CURSOS

Taller de Java
do estándar de transferencia de archivos. Telnet es
SI LE GUSTAN LOS GRANDES RETOS, ¿POR QUÉ NO el modo estándar de realizar una conexión de ter-
ESCRIBIR EL SOFTWARE DE UN SERVIDOR WEB EN minal. SMTP y POP3 son las formas más comunes de
enviar y recibir correo electrónico, etc. Pero sea cual
MENOS DE 10K? DAVID GRIFFITHS LE MUESTRA sea el protocolo, todos hacen más o menos lo mismo:
CÓMO HACERLO. el software servidor tendrá una conversación estruc-
turada con otra máquina de la red durante la cual
s curioso las cosas que llegamos a recordar: la tendrá lugar una transferencia de información.
E Declaración de Independencia, el discurso I La Web utiliza un protocolo denominado HTTP ( Hy-
have a dream de Martin Luther King, el tercer verso pertext Transfer Protocol) y normalmente está al tan-
del Agadoo. En ciertas personas, las letras de una can- to del puerto número 80. En determinadas máquinas,
ción o el pasaje inicial de un libro en particular per- al servidor web se le dará una extensión diferente.
manecen con ellos durante años y en cierta manera Si esto es así, tendrá que hacer que su navegador
capturan el espíritu de un tiempo y de un lugar. Pa - «marque» un número diferente, por ejemplo:
ra mí fue el capítulo del manual del ZX81 que em - http://www.bigco.com:8000, donde 8000 es el nú-
pezaba con «El chip de 16 K de RAM, aparte de pro - mero de conexión.
porcionarnos memoria virtualmente ilimitada…» Al contrario de los protocolos tipo FTP o Telnet (cu-
Muchas veces he vuelto a consultar este pasaje, nor- ya conversación puede mantenerse durante horas),
malmente en mitad del tercer CD de una instala - HTTP es breve. Una conversación HTTP estándar nor-
ción de cuatro CD. Pero ¿realmente fue alguna vez malmente adopta la siguiente forma:
posible escribir algo que ocupara 16 K? Pues sí, lo era.
Y lo sorprendente es que aún lo es. Sr. Navegador: «Hola. Estos son mis detalles. Dame
Entonces ¿qué es lo que hace un servidor web? Ima - el archivo denominado X».
gine que su ordenador es un edificio de oficinas con Sr. Servidor: «Sí, lo tengo. Oh, es un archivo de tex-
su propia red telefónica. Lo más probable es que se to, aquí está. Bla, bla, bla.»
disponga de un número de teléfono principal para
la centralita (la dirección de Internet del ordena - Observará que durante la conexión sólo se envía un
dor) y que cada oficina tenga un enchufe en la pa - único archivo. ¿Cómo es posible esto si la mayoría
red y su propia extensión telefónica. Cuando escri- de páginas web contienen gran cantidad de imáge-
nes, sonidos, applets, etc.? La respuesta es sencilla.
Cuando se le dice al navegador que vaya a una di-
rección en concreto, empezará simplemente pidien-
do el archivo de la página web. Entonces, cuando
haya cortado la comunicación, leerá el archivo y verá
qué más necesita. A continuación volverá a llamar
para solicitar los archivos adicionales que la página
Una vez a empezado incluye.
Webservice desde una En la gloriosa época del Unix, crear un programa que
ventana de DOS, puede pudiera estar atento a una red presentaba una gran
usar su navegador para dificultad. Solamente una persona por década resolvía
conectarlo con: cómo hacerlo y normalmente no tenía amigos, así que
http://127.0.0.1:8080. no se lo contaba a nadie.
Por suerte, Java nos facilita considerablemente las co-
bimos el software para un servidor es algo así como sas. Java incluye una clase especial que realiza todo
colocar a alguien en la oficina para que responda al el trabajo por nosotros. Sorprendentemente se de-
teléfono. El software se situará allí y controlará las nomina ServerSocket. La forma de crear una cone-
conexiones (estará al tanto del tráfico de la red) y si xión al servidor es:
el teléfono suena contestará. La forma de respon -
der dependerá del protocolo de la «forma de fun - ssMain = new
cionamiento acordada», que estructurará todas las ServerSocket(portNo);
conversaciones que tengan lugar.
Hay montones de protocolos diferentes. FTP es el mo- Donde portNo es el número del puerto que quere-
mos atender. Si algún otro programa ya lo estuviera private void write(String
utilizando, obtendríamos la excepción «Address in text) {
use». Podemos detectar esto con algo parecido a lo byte b[] =
siguiente: text.getBytes();
write(b, 0,
try { text.length());
ssMain = new }
ServerSocket(portNo);
} y:
catch(IOException e) {
System.out. private void write(byte b[],
println(“IOException: “ + int start, int length) {
e.getMessage()); try {
} out.write(b, 0,
length);
Una vez creada la conexión, tendremos que instalar }
el software equivalente a un teléfono para que po- catch(IOException e) {
damos esperar a que suene. Podemos hacer que un }
ServerSocket espere la conexión de una red llaman- }
do a su método accept(); por ejemplo, así:
La primera convierte una cadena en un flujo de by-
socket = ssMain.accept();

Este comando estará esperando hasta que alguien lla- COMPILAR Y EJECUTAR
me. El objeto Socket que devuelve es como una co- ARCHIVOS.JAVA CON EL JDK
nexión telefónica, es decir, podemos hablarle y es -
cucharle. Nuestro servidor web puede tener que n primer lugar cree una carpeta especial
manejar muchas llamadas a la vez, así que crearemos E (por ejemplo C:\JWEB) en el disco duro
un objeto nuevo denominado Request para cada lla - y copie allí todos los archivos de este taller.
mada entrante. Debe tener instalado el Java Development Kit
Cada vez que recibamos un objeto Socket lo utili- en el PC, y tanto el directorio en curso como
zaremos para crear un nuevo objeto Request. Hare - la biblioteca de clases estándar deben estar
mos de Request una extensión de la clase Thread pa - incluidas en la variable CLASSPATH. Puede ve-
ra que el objeto WebService puede empezar a rificar que es así abriendo la ventana de DOS y
ejecutarla y después ponerse en contacto con cual- escribiendo:
quier otra cosa.
Los objetos Request necesitarán usar el objeto Soc- set
ket para crear formas de escuchar y hablar a la red.
Pueden hacer esto con los métodos getInputStream() El resultado debe ser algo así:
y getOutputStream() Socket:
.
out = new .
DataOutputStream(socket. PATH=C:\WINDOWS;C:\WINDOWS\
getOutputStream()); COMMAND;C:\JDK1.1.5\BIN
in = new BufferedReader(new CLASSPATH=.;C:\jdk1.1.5\lib
InputStreamReader .
(socket.getInputStream())); .

Para simplificar las cosas podemos crear un conjun- En el nuevo directorio escriba:
to de funciones de escritura, «write», que sean ca -
paces de enviar cadenas y matrices de bytes a través javac *.java
del flujo de salida, «out». Los datos tienen que enviarse
como bytes y no como cadenas, para evitar que Ja - Esto compilará los archivos de Java en el di-
va los corrompa con sus «útiles» pequeños caracte - rectorio.
res de control. Las dos funciones principales ‘write’
que crearemos son:
CURSOS

Puede compilar nas web estáticas) y HEAD (cuando no se quiere el ar-


Webservice.java con IDE o chivo, sólo información sobre su tamaño, etc.). La par-
desde una línea de te final de la orden indica al servidor web la última
comnado con JDK. versión de HTTP que el navegador puede aceptar.
Lo que nos interesa es la parte central: el archivo
que está pidiendo el navegador. Si una persona ha in-
troducido el URL www.company.com:8000/emplo-
yees/fred.htm, el valor incluido en la orden GET sería
/employees/fre.htm.
Para leer las cabeceras y averiguar qué archivo quie-
re el navegador, necesitaremos algo parecido al pri-
tes. La segunda simplemente envía matrices de by- mer ítem del Rincón del Código. Observará que es-
tes que le han sido dadas. Escuchar es mucho más fá- tamos ignorándolo todo excepto la línea GET. Cuando
cil; podemos hacerlo con: llegamos a ella, pasamos el nombre de archivo que
nos pide al método setFileRequested(...) para averi-
in.readLine() guar dónde se encuentra en la máquina.
El nombre de archivo estará relacionado con algún
Esto devolverá una línea de información completa ca- directorio de su máquina denominado «Web root». Al-
da vez. gunos servidores web permiten unir muchas raíces
Así de fácil y de sencillo. Las Request pueden hablar web, pero nosotros no nos complicaremos y pondre-
y escuchar a la red. Pero siguen sin comprender lo que mos todas nuestras páginas y subdirectorios web ba-
se les pide. jo un mismo directorio. Para localizar el archivo re-
En este punto es cuando hacemos que la clase Re- levante en la máquina, setFileRequested(...) antepone
quest hable HTTP. La versión de HTTP que utilizare- NUESTRO NUEVO EXPERTO la raíz web delante del nombre de archivo dado en
mos es la 1.0, y los detalles se suministran en un Huw Collingbourne, el la petición GET. Por ejemplo, la raíz web: c:\Web;re-
documento denominado RFC 1945, escrito por el pa- anfitrión regular de este quested file + /employees/fred.thm;file on the PC =
dre de la Web, Tim Berners-Lee. Encontrará una co- espacio, ha tomado la c:\web\employees\fred.htm.
pia en www.cis.ohio-state.edu/htbin/rfc/ difícil decisión de colgar Ahora que ya sabemos qué busca el navegador, ten-
rfc1945.thml. su copia de JDK. La dremos que crear el final de la conversación por par-
Como decía antes, un protocolo no es más que una presencia de Huw seguirá te del servidor. Si vuelve a la charla de ejemplo en-
forma acordada de estructurar una conversación. amenizando otras áreas de tre el Sr. Navegador y el Sr. Servidor, verá que la
Si observa la breve conversación entre el Sr. Nave- PC Plus, pero el mando del respuesta del servidor está compuesta de tres par-
gador y el Sr. Servidor de la página anterior, verá que Taller de Java pasa a tes diferenciadas:
los comentarios iniciales del navegador tienen dos manos de David Griffiths.
partes. El trabajo diario de David Estado: Sí, lo tengo.
Primero, el navegador da mucha información sobre sí se basa en el análisis de Cabeceras de respuesta: Oh, es un archivo de tex-
mismo: «Hola. Estos son mis detalles». Éstas son las sistemas y recientemente to... aquí está.
«request headers». La cabecera de la petición con- ha diseñado una intranet Archivo: Bla, bla, bla...
tiene información sobre qué tipo de navegador es, qué para un ente municipal. Es
tipos de archivos prefiere, su lenguaje favorito, etc. El un entusiasta programador La primera parte (el estado) dirá o bien que se ha
servidor web puede utilizar estos detalles para mo- de Java y un escritor con encontrado el archivo solicitado sin problema, o bien
dificar su información saliente. Por ejemplo, podemos talento, de modo que tiene que no se ha encontrado o algo ha ido mal. Si todo
elegir enviar como respuesta un conjunto diferente el perfil idóneo para va según lo planeado, la línea de estado será:
de páginas si el navegador es Internet Explorer. continuar esta sección.
La segunda parte, «Dame el archivo denominado X», HTTP/1.0 200 OK
es la petición de archivo del navegador. La forma más
habitual de hacer esto sería enviando una cadena co- El 200 indica al navegador que todo ha ido bien. Si
mo ésta: ocurriera un error o el archivo no se encontrara, es-
te número se convertiría en uno de los valores de error,
GET /somefilename.htm como 404 ó 500.
HTTP/1.1 La segunda parte (cabeceras de respuesta) se utiliza
para indicar al navegador qué tipo de documento es
Al primer término se le denomina «method». GET es el archivo. En el caso de que el servidor web fuera
el más común y el único que vamos a implementar incapaz de encontrar el archivo, este fragmento de
aquí. Otras posibilidades son POST (casi siempre uti- código se utiliza para indicar al navegador qué tipo
lizado para conseguir más cosas que simples pági- de documento va a ser el archivo del mensaje de error.
byte b[] = new byte[1024];
int readCount;
Petición while ((readCount =
istream.read(b)) != -1) {
write(b, 0, readCount);
}
Petición

Observará que leemos de 1K en 1K antes de com -


Internet pletarlo todo. Es posible leer el archivo en fragmentos
Petición mayores incrementando el tamaño de la matriz b[].
En el caso de que las cosas no hayan ido bien y no ha -
yamos podido encontrar el archivo, podemos utili-
zar una simple función que realizará las tres partes
Petición por nosotros, tal y como mostramos en el tercer ítem
del Rincón del Código. A continuación podemos su-
marlo todo con el método run() en el archivo Re -
Un PC ejecutando WebService quest.java, mostrado al final del Rincón del Código.
Éste es el corazón y alma de nuestra conversación
HTTP. En primer lugar leemos toda la petición desde
El tipo de contenido será uno de los tipos MIME están- La clase WebService el navegador. Si no encontramos un método GET en
dar. Si, por ejemplo, el archivo es una página web espera peticiones la petición, informamos de que no podemos mane-
HTML estándar, la línea será: enviadas a través de la red jarla. Si hay una petición GET y el archivo existe, se
y crea objetos Request lo enviamos. Si el archivo no existe, informamos de
Content-Type: text/html para tratar con las un error 404. Si alguna otra cosa va mal, asumimos
llamadas a páginas HTML. que hay un problema con el servidor.
Averiguaremos qué tipo de contenido es mirando la Probablemente lo más fácil sea compilar y ejecutar
extensión del archivo como se muestra en el segun- los archivos de este taller con el Java Development
do ítem del Rincón del Código. Kit, y por lo tanto así es como lo describiremos aquí.
La primera parte de este método fija «ext» a la ex- Pero en el SuperCD también hay un archivo deno -
tensión del archivo. Estos son sólo algunos de los ti- minado othrcmps.txt que le ayudará si está utilizando
pos MIME posibles. Obtendrá una lista más comple- un compilador IDE como SuperCede o Visual Café.
ta si dispone de una copia de Netscape. En Netscape Para arrancar el servidor, vaya al directorio que con-
3.0, consulte los Helpers de las preferencias genera- tiene los archivos de clase Request y WebService com-
les. En Netscape 4, busque la opción Aplicaciones pilados y escriba lo siguiente:
en las preferencias.
Es importante que, después de decir qué tipo de con- java WebService ./ 8080
tenido es, sigamos con dos caracteres de línea nue-
va. Ésta es la señal para el navegador de que esta- El primer parámetro indica a WebService qué direc-
mos a punto de enviar la tercera parte: el archivo torio vamos a utilizar como raíz web, en este caso el
propiamente dicho. En caso de que el archivo fuera directorio en curso. El segundo parámetro indica qué
encontrado correctamente, podemos enviar la pri- puerto debe utilizar. Si ya dispone de un servidor web
mera y segunda cabeceras utilizando el método: (o de algún otro tipo de servidor) en el puerto 8080,
obtendrá la excepción «Address in use» y el servidor
private void writeHeaders() web se detendrá. Si no obtiene ningún error, el ser-
{ vicio web debería estar ya en marcha.
writeln(“HTTP/1.0 200
OK”); Así se ve
write(“Content-Type: “ + Ahora, para visualizar la página, arranque su nave-
getMimeType() + “\n\n”); gador web favorito y vaya a la siguiente dirección:
} http://127.0.0.1:8080. Se estará preguntando ¿por
qué 127.0.0.1? Es la forma como un ordenador se pue-
Después podemos enviar el contenido del archivo con: de referir a sí mismo sin salir a la red.
Si utiliza la versión 2 de Windows Sockets de Mi -
FileInputStream istream crosoft, en este punto puede tener un problema. De-
= new FileInputStream bido a lo que parece ser una tara en el diseño, la
(getFileRequested()); máquina no podrá conectarse a sí misma a menos que
CURSOS

RINCÓN DEL CÓDIGO


1. Leer las cabeceras 3. Informar de un error
private boolean readHeaders() throws IOException private void error(int errNo, String error) {
{ writeln(“HTTP/1.0 “ + errNo + “ “ +
String info; error);
String method; write(“Content-Type: text/html\n\n”);
String requestURI; writeln(“<body><h1>HTTP/1.0 “ + errNo + “
boolean success = false; “ +
while (!(info = in.readLine()).equals(“”)) { error);
int firstSpace = info.indexOf(“ “); writeln(“</h1></body>”);
method = info.substring(0, firstSpace); }
if (method.equals(“GET”)) {
requestURI = 4. Comprobación
info.substring(firstSpace + 1, public void run() {
info.indexOf(“ “, try {
firstSpace + 1)); if (!readHeaders())
setFileRequested(requestURI); error(501, “Not
success = true; implemented”);
} else if (new
} File(getFileRequested()).exists()) {
return success; // Whether we found a supported writeHeaders();
method FileInputStream istream
} = new FileInputStream(getFileRequested());
byte b[] = new byte[1024];
2. Determinar el tipo de contenido int readCount;
private void setMimeType(String fname) { while ((readCount =
String ext = “”; istream.read(b)) != -1) {
write(b, 0,
if (fileRequested.lastIndexOf(“.”) > -1) readCount);
ext = fname.substring( }
}
fileRequested.lastIndexOf(“.”)).toUpperCase(); else {
error(404, “Object not
if (ext.equals(“.HTM”)) found”);
this.mimeType = “text/html”; }
else if (ext.equals(“.HTML”)) socket.close();
this.mimeType = “text/html”; }
else if (ext.equals(“.GIF”)) catch(Exception e) {
this.mimeType = “image/gif”; error(500, “Internal Server Error:
else if (ext.equals(“.JPG”)) “ +
this.mimeType = “image/jpeg”; e.getMessage());
else }
this.mimeType = “text/plain”; }
}

también esté conectada a una red. Si está utilizan- visitando: http://[la dirección interna de su PC]:8080.
do esta versión de Windows Sockets, tendrá que co- Para ello, los que le visiten tendrán que insertar la di-
nectarse a Internet antes para que el software de na - rección pública en Internet de su máquina (ya sea
vegación pueda llevarle a su servidor web. numérica o el nombre, por ejemplo, myaccount.dia-
Cuando haya comprobado el servidor web de forma lup.co.uk) y no 127.0.0.1.
local, puede conectarse a él a través de una red (In- Y aquí lo tenemos, un servidor web en... ohhh, poco
ternet o bien una red de área local) y permitir que menos de 6K. Clive Sinclair estaría orgulloso del tra-
otras máquinas accedan a su sede web. Puede hacerlo bajo que hemos hecho.

También podría gustarte