15.05.2013 Views

Práctica 3: Introducción a los sockets en Java - Redes de ...

Práctica 3: Introducción a los sockets en Java - Redes de ...

Práctica 3: Introducción a los sockets en Java - Redes de ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P3-6 <strong>Práctica</strong>s <strong>de</strong> <strong>Re<strong>de</strong>s</strong> <strong>de</strong> Computadores<br />

6. Vaciado <strong>de</strong>l buffer TCP (flush)<br />

Aunque las v<strong>en</strong>tajas <strong>de</strong> emplear para la escritura una clase con<br />

almac<strong>en</strong>ami<strong>en</strong>to son claras, también pue<strong>de</strong> plantear algunos inconv<strong>en</strong>i<strong>en</strong>tes<br />

si uno no es cuidadoso, como vamos a ver <strong>en</strong> el ejercicio sigui<strong>en</strong>te.<br />

Ejercicio 5:<br />

Copia el programa “Cli<strong>en</strong>teSMTP.java” y r<strong>en</strong>ómbralo como<br />

“Cli<strong>en</strong>teSMTPej5.java”. Aña<strong>de</strong>, al final <strong>de</strong> tu programa, el código<br />

sigui<strong>en</strong>te:<br />

PrintWriter esc = new PrintWriter<br />

(s.getOutputStream());<br />

salida.print("EHLO re<strong>de</strong>sXX.re<strong>de</strong>s.upv.es\r\n");<br />

System.out.println(“lectura 2: “ + lee.readLine());<br />

s.c<strong>los</strong>e();<br />

NOTA: Se ha supuesto que el objeto BufferedRea<strong>de</strong>r <strong>de</strong>finido <strong>en</strong> el ejercicio<br />

anterior se llama “lee” y el objeto Socket se llama “s”.<br />

Ejecútalo para que se conecte al puerto 25 <strong>de</strong> “zoltar.re<strong>de</strong>s.upv.es”. ¿Qué es lo<br />

que ocurre?¿Aparece la segunda respuesta <strong>de</strong>l servidor <strong>en</strong> tu pantalla? (Lo<br />

normal será que no aparezca nada).<br />

Este cli<strong>en</strong>te SMTP <strong>de</strong>bería <strong>en</strong>viar un m<strong>en</strong>saje correcto al servidor<br />

SMTP <strong>de</strong> zoltar y recibir su respuesta, pero no recibe nada. ¿Por qué?<br />

Porque él tampoco le <strong>en</strong>vía nada. Para mejorar la efici<strong>en</strong>cia, el stream <strong>de</strong><br />

salida int<strong>en</strong>ta ll<strong>en</strong>ar su buffer tanto como sea posible antes <strong>de</strong> <strong>en</strong>viar <strong>los</strong><br />

datos, pero como el cli<strong>en</strong>te no ti<strong>en</strong>e más datos que <strong>en</strong>viar (<strong>de</strong> mom<strong>en</strong>to) su<br />

petición no llega a <strong>en</strong>viarse nunca.<br />

La solución a este problema la da el método flush() <strong>de</strong> la clase<br />

PrintWriter. Este método fuerza a que se <strong>en</strong>ví<strong>en</strong> <strong>los</strong> datos aunque el<br />

buffer no esté aún ll<strong>en</strong>o. En caso <strong>de</strong> duda acerca <strong>de</strong> si resulta o no necesario<br />

utilizarlo, es mejor invocarlo, ya que realizar un flush innecesario<br />

consume pocos recursos, pero no utilizarlo cuando se necesita pue<strong>de</strong><br />

provocar bloqueos <strong>en</strong> el programa.<br />

Ejercicio 6:<br />

Modifica el cli<strong>en</strong>te SMTP para que utilice el método flush y comprueba que<br />

ahora funciona correctam<strong>en</strong>te.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!