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 ...
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.