Title: Repasemos: El servidor que lee
1Repasemos 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.getInp
utStream())) - String linea null
- while (true)
- lineaentradaSocket.readLine()
- if (linea.equals("bye")) break
- else System.out.println("llego "linea)
-
- System.out.println("termina la llamada")
- cs.close()
- entradaSocket.close()
2Repasemos 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(args0,4444)
- PrintWriter salidaSocket new
PrintWriter(s.getOutputStream(),true) - BufferedReader kbdin new
BufferedReader( - new InputStreamReader(System.in
)) - String linea null
- while (true)
- lineakbdin.readLine()
- if (linea.equals("bye")) break
- else salidaSocket.println(linea)
-
- System.out.println("termina la llamada")
- s.close()
- salidaSocket.close()
3Cuando 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.
4Cuando 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 !
5Broadcasting
- 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.
6Broadcasting 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.
7Comunicació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.
8Comunicació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
9Manejo 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
10Clases 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 byte256
- 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 !!!
11Clases 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 byte256
- 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(dato
s, datos.length, port, direccion)