Download Fundamentos de Redes de Computadores - DCC

Document related concepts
no text concepts found
Transcript
Módulo ECI - 11: Fundamentos de Redes de Computadores
Repasemos: El servidor que lee
import java.io.*;
import java.net.*;
public class UnServidor{
public static void main(String args[])throws Exception {
ServerSocket ss = new ServerSocket(4444);
Socket cs = ss.accept();
BufferedReader entradaSocket = new BufferedReader(
new InputStreamReader(cs.getInputStream()));
String linea = null;
while (true) {
linea=entradaSocket.readLine();
if (linea.equals("bye")) break;
else System.out.println("llego :"+linea);
}
System.out.println("termina la llamada");
cs.close();
entradaSocket.close();
}
}
1
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Repasemos: El cliente que escribe
import java.io.*;
import java.net.*;
public class UnCliente{
public static void main(String args[])throws Exception {
Socket s = new Socket(args[0],4444);
PrintWriter salidaSocket = new PrintWriter(s.getOutputStream(),true);
BufferedReader kbdin = new BufferedReader(
new InputStreamReader(System.in));
String linea = null;
while (true) {
linea=kbdin.readLine();
if (linea.equals("bye")) break;
else salidaSocket.println(linea);
}
System.out.println("termina la llamada");
s.close();
salidaSocket.close();
}
}
2
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Cuando un programa debe comportarse como
cliente y servidor a la vez: el teléfono
 Un teléfono es un cliente y un servidor a la vez
 Se comporta como servidor cuando recibe una llamada
 Se comporta como cliente cuando efectúa una llamada
 El servidor crea un socket asociado a un por desde donde
escucha si hay alguien que quiere llamar.
 El cliente queda esperando que el usuario de un comando
para llamar a algun servidor (por ejemplo esperar del
teclado que el usuario ingrese un nombre de host para
llamar)
 El problema es que deben estar los 2 en el mismo
programa: usamos threads, uno para el servidor y otro
para el cliente.
 Ambos quedan esperando y se da curso a lo que pase
primero.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
3
Módulo ECI - 11: Fundamentos de Redes de Computadores
Cuando un programa debe comportarse como
cliente y servidor a la vez: el teléfono (2)
 Otro problema: no se deben aceptar peticiones de llamadas
si es que se da curso a una llamada (se activa el thread del
cleinte)
 No se puede dar curso a una llamada si se atendó a una (se
activa el thread de servidor)
 La idea es suspender un thread cuando se activa el otro.
 Para esto se necesita que ambos conozcan el otro thread.
Al crear uno se le da un puntero al otro !
 Ver programas telefono.java Oidor.java Llamados.java
 El cliente sólo puede escribir, el servidor sólo puede leer,
Modifíquelos !
4
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Broadcasting
 Muchas veces se necesita que un servidor distribuya un mismo
mensaje entre varios clientes
 Ej: en un chat entre varias personas, si uno escribe, los demás
deben recibir lo que escribió.
 Esto generalmente se resuelve con un servidor de comunicaciones.
 Todos los clientes se registran con un servidor de comunicaciones.
 Si uno de los cliente escribe algo, se lo manda al servidor
 El servidor replica el mensaje a cada uno de los clientes que tiene
registrado.
 Hay que solucionar algunos problemas
 Problema: El servidor de comunicaciones debe registrar a todos
los clientes; Solución: llevamos un arreglo de sockets o flujos de
salida para sockets.
 Problema: El servidor debería oir si alguien quiere conectarse
para participar en el chat o si quiere mandar un mensaje;
Solución: implementemos un protocolo (por ejemplo si me
conecto en un port o en otro.
 Problema: El servidor no debe dejar de oir si alguien quiere
conectarse cuando está mandando el mensaje; Solución:
implementemos threads.
5
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Broadcasting: implementación
 Veamos una primera solución: En el servidor usamos un
thread para oir y registrar a los clientes. El programa
principal (que es otro thread) queda en un ciclo infinito
leyendo lineas del teclado y ditribuyéndolas a los clientes
conectados. El cleinte simplemente se conecta y lee en un
ciclo infinito lo que el servidor le manda y lo muestra en
la pantalla (no escribe al servidor).
 Veamos una segunda solución: El servidor lee el mensaje
desde otro socket. Queda escuchando en el socket 4444
para los clientes que quieren recibir los mensajes y en
4445 a clientes que quieren mandar mensajes. Haremos
otro programa cliente que haga esto.
 Solución final: Finalmente acemos el cliente definitivo
que también tiene un thread que lee y escribe en pantalla
lo que el servidor manda y el programa principal acepta
lineas del teclado y las manda al servidor.
6
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Comunicación Servidor-Cliente sin conexión
 Hasta ahora hemos visto cómo se logran comunicar 2
programas estableciendo entre ellos un circuito virtual a
traves de una conexión TCP/IP
 Sabemos que en una conexión de este tipo se genera
mucho tráfico y que la comunicación es más lenta, ya que
el protocolo subyacente de confirmación, retransmisión,
descarte y/o reordenación de paquetes se basa en mensajes
de datagramas.
 Habíamos visto que a veces el usuario debería optar por
una transmisión sin conexión, especialmente si no es
necesario garantizar la llegada de todos los datagramas.
 Para eso existen en JAVA todos lor recursos de modo de
mandar un datagrama aislado a un destinatario dado.
7
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Comunicación Servidor-Cliente sin conexión:
pasos a seguir
 La comunicación se basa en armar paquetes UDP y
enviarlos a la internet con la siguiente información:
 datos: un arreglo de bytes
 número de port del destinatario: int
 Dirección Internet del destinatario: InetAddress
 El servidor se pone a escuchar en un socket dado si hay
paquetes destinados a él.
 El cliente arma un paquete y lo lanza a la internet.
 El servidor recibe el paquete y extrae los datos, numero de
port y dirección internet del enviador.
 Si necesita responder manda un paquete a la dirección
(port y dirección internet) que venía en el paquete recibido
8
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Manejo de Datagramas en JAVA
 La comunicación se basa en armar paquetes UDP y
enviarlos a la internet con la siguiente información:
 datos: un arreglo de bytes
 número de port del destinatario: int
 Dirección Internet del destinatario: InetAddress
 El servidor se pone a escuchar en un socket dado si hay
paquetes destinados a él.
 El cliente arma un paquete y lo lanza a la internet.
 El servidor recibe el paquete y extrae los datos, numero de
port y dirección internet del enviador.
 Si necesita responder manda un paquete a la dirección
(port y dirección internet) que venía en el paquete recibido
9
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Clases para Datagramas en JAVA: envío
 Definición: Un datagrama es un mensaje independiente,
autocontenido que se manda de un programa a otro por la
red pero que su llegada, tiempo de llegada y contenido no
estan garantizados.
 Crear un socket por donde mandar el datagrama
 DatagramSocket ds = new DatagramSocket();
 Crear y armar el datagrama
 byte[] datos = new byte[256];
 InetAddress direccion = InetAddress.getByName(“www.ctc.cl”);
 DatagramPacket paquete = new DatagramPacket(datos,
datos.length,direccion,4444);
 Mandarlo
 ds.send(paquete);
 Esperar respuesta
 socket.receive(packet); //limpiarlo antes !!!
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
10
Módulo ECI - 11: Fundamentos de Redes de Computadores
Clases para Datagramas en JAVA: recepción
 Para poder recibir tengo que escuchar en un port acordado (ya
que de otra manera no hay como ponerse de acuerdo)
 socket = new DatagramSocket(4444);
 preparar un Datagrama para recibir datos
 byte[] datos = new byte[256];
 DatagramPacket paquete = new DatagramPacket(datos,datos.length);
 Ponerse a escuchar si alguien manda un datagrama a este
computador a este port
 socket .receive(paquete);
 Sacar los datos, el port y la dirección de donde venía
 int port = paquete.getPort();
 InetAddress dirección = paquete getAddress();
 String contenido = new String(paquete.getData());
 Mandar una respuesta
 DatagramPacket respuesta = new DatagramPacket(datos,
datos.length, port, direccion);
11
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl