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