La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.

Presentaciones similares


Presentación del tema: "Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores."— Transcripción de la presentación:

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 1 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(); }

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 2 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(); }

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

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 4 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 !

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

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

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

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

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

10 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 10 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 !!!

11 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 11 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);


Descargar ppt "Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores."

Presentaciones similares


Anuncios Google