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