Repasemos: El servidor que lee - PowerPoint PPT Presentation

About This Presentation
Title:

Repasemos: El servidor que lee

Description:

Repasemos: El servidor que lee import java.io.*; import java.net.*; public class UnServidor{public static void main(String args[])throws Exception – PowerPoint PPT presentation

Number of Views:32
Avg rating:3.0/5.0
Slides: 12
Provided by: vicgaete
Category:

less

Transcript and Presenter's Notes

Title: Repasemos: El servidor que lee


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

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(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()

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

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 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)
Write a Comment
User Comments (0)
About PowerShow.com