1008
Capítulo 24 Redes
1
// Fig. 24.6: PruebaServidor.java
2
// Prueba la aplicación Servidor.
3
import
javax.swing.JFrame;
4
5
public class
PruebaServidor
6
{
7
public static void
main( String args[] )
8
{
9
Servidor aplicacion =
new
Servidor();
// crea el servidor
10
aplicacion.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE
);
11
aplicacion.ejecutarServidor();
// ejecuta la aplicación servidor
12
}
// fin de main
13
}
// fin de la clase PruebaServidor
Figura 24.6
| Clase de prueba para
Servidor
.
obtenerFlujos
(declarado en las líneas 99 a 109) para obtener las referencias a los fl ujos para la conexión. En
la línea 70 se hace una llamada al método
procesarConexion
(declarado en las líneas 112 a 133) para enviar
el mensaje de conexión inicial al cliente, y para procesar todos los mensajes que se reciban del cliente. El bloque
finally
(líneas 76 a 80) fi naliza la conexión del cliente llamando al método
cerrarConexion
(líneas 136 a 151),
incluso aunque haya ocurrido una excepción. El método
mostrarMensaje
(líneas 169 a 180) es llamado desde
estos métodos para utilizar el subproceso despachador de eventos para mostrar los mensajes en el objeto
JText-
Area
de la aplicación.
En el método
esperarConexion
(líneas 90 a 96) se utiliza el método
accept
de
ServerSocket
(línea
93) para esperar una conexión de un cliente. Al ocurrir una conexión, el objeto
Socket
resultante se asigna
a
conexion
. El método
accept
realiza un bloqueo hasta que se reciba una conexión (es decir, el subproceso
en el que se haga la llamada a
accept
detiene su ejecución hasta que un cliente se conecte). En las líneas 94 y 95 se
imprime en pantalla el nombre del equipo host que realizó la conexión. El método
getInetAddress
de
Socket
devuelve un objeto
InetAddress
(paquete
java.net
), el cual contiene información acerca del equipo cliente.
El método
getHostName
de
InetAddress
devuelve el nombre de host del equipo cliente. Por ejemplo, hay una
dirección IP (
127.0.0.1
) y nombre de host (
localhost
) especiales, que son útiles para probar aplicaciones de
red en su equipo local [a ésta también se le conoce como
dirección de bucle local
(
loopback
)]. Si se hace una
llamada a
getHostName
en un objeto
InetAddress
que contenga
127.0.0.1
, el nombre de host correspondiente
que devuelve el método es
localhost
.
El método
obtenerFlujos
(líneas 99 a 109) obtiene las referencias a los fl ujos de
Socket
y los utiliza para
inicializar un objeto
ObjectOutputStream
(línea 102) y un objeto
ObjectInputStream
(línea 106), respecti-
vamente. Observe la llamada al método
flush
de
ObjectInputStream
en la línea 103. Esta instrucción hace que
el objeto
ObjectOutputStream
en el servidor envíe un
encabezado de fl ujo
al objeto
ObjectInputStream
correspondiente del cliente. El encabezado de fl ujo contiene información como la versión de la serialización de
objetos que se va a utilizar para enviar los objetos. Esta información es requerida por el objeto
ObjectInput-
Stream
, para que pueda prepararse para recibir estos objetos de manera correcta.
Observación de ingeniería de software 24.5
Al utilizar un objeto
ObjectOutputStream
y un objeto
ObjectInputStream
para enviar y recibir datos a través
de una conexión de red, siempre debe crear primero el objeto
ObjectOutputStream
y vaciar (mediante el método
flush
) el fl ujo, de manera que el objeto
ObjectInputStream
pueda prepararse para recibir los datos. Esto se requiere
sólo en las aplicaciones de red que se comunican utilizando a
ObjectOutputStream
y
ObjectInputStream
.
Tip de rendimiento 24.3
Por lo general, los componentes de entrada y salida de una computadora son mucho más lentos que su memoria.
Los búferes de salida se utilizan comúnmente para incrementar la efi ciencia de una aplicación, al enviar mayores
cantidades de datos con menos frecuencia, con lo cual se reduce el número de veces que una aplicación accede a los
componentes de entrada y salida de la computadora.
24_MAQ_CAP_24_Deiltel.indd1008
4/19/081:34:52AM