Programando Clientes TCP - PowerPoint PPT Presentation

About This Presentation
Title:

Programando Clientes TCP

Description:

Una direcci n IP es la direcci n absoluta de un computador cualquiera en toda la ... Se usa para conectar un programa Java con un servidor Web y leer (download) los ... – PowerPoint PPT presentation

Number of Views:49
Avg rating:3.0/5.0
Slides: 22
Provided by: nbal
Category:

less

Transcript and Presenter's Notes

Title: Programando Clientes TCP


1
Programando Clientes TCP
  • Postítulo 2004

2
La Clase InetAddress
  • Una dirección IP es la dirección absoluta de un
    computador cualquiera en toda la internet. En la
    versión actual consiste en un valor guardado en
    4bytes. Datos pueden ser mandados de un
    computador a otro en la internet sólo si se tiene
    este número del destinatario.
  • No tiene constructores, se crea un nuevo objeto
    InetAddress haciendo
  • InetAddress n InetAddress.getLocalHost()
  • InetAddress n InetAddress.getByName(nombre)
  • Y tiene los siguientes métodos
  • String nombre n.getHostName()
  • String direccion n.getHostAddress()
  • Ver programa ejemplo InetExample.java y Names.java

3
La Clase URL
  • URL Uniform Resource Locator
  • Se usa para conectar un programa Java con un
    servidor Web y leer (download) los recursos que
    ofrece.

PURL
4
La Clase URL
  • Un URL es un UNIFORM RESOURCE LOCATOR. Consiste
    en una dirección de un recurso que un servidor en
    la internet pone a disposición de los usuarios,
    como por ej. http//www.arminco.com
  • En un objeto URL existen dos componentes
    principales El descriptor de protocolo (ej.
    http) y el nombre del recurso (ej.
    www.arminco.com). http significa Hyper Text
    Transfer protocol pero hay otros protocolos de
    transferencia de datos en la internet como el
    File Transfer protocol (ftp), Gopher, File o
    News.
  • En java es posible abrir una dirección de URL y
    leer el contenido como si fuera un archivo
    cualquiera. Para ello debemos crear un objeto URL
    con el nombre del protocolo y la dirección del
    recurso que queremos recuperar.

5
La Clase URL (2)
  • Existen varios constructores de URL
  • URL unRUL new URL(http//www.arminco.com/index.
    html)
  • unURL new URL(httpwww.arminco.com,index.ht
    ml)
  • unURL new URL(http,www.arminco.com,80,index
    .html)
  • Al crear una variable URL se puede producir una
    excepción del tipo MalformedURLException. Por
    eso se deben tomar las medidas necesarias (como
    por ej usar un bloque try-catch)
  • try URL miURL new URL(....)
  • catch(MalFormedURLException e)
  • // codigo para atrapar la exception
  • Métodos que se pueden aplicar a un objeto de la
    clase URL
  • getProtocol(), getHost(), getPort(), getFile(),
    openConnection()

6
La Clase URL (3)
  • Si sabemos a priori que el contenido de un URL
    es texto podemos leerlo de la siguiente manera
  • import java.net.
  • import java,io.
  • public class LeerURL
  • public static void main(String args)
  • try
  • URL miURL new URL(http//www.dcc.uchile.cl
    )
  • URLConnection c miURL.openConnection()
  • BufferedReader in new BufferedReader (
  • new InputStreamReader(c.getInputStream()))
  • String line
  • while ((line in.readLine() ! null)
  • System.out.prinln(line)
  • c.close()
  • catch(MalFormedURLException e)
    System.out.pritnln(e)
  • Ejercicio programar esto pero permitir dar el
    http como parámetro

7
El Socket
  • Un socket es un extremo de un link de
    comunicación entre dos programas que corren en
    una red. El socket está asociado (amarrado,
    bound) a un número de port de modo que la capa
    TCP pueda identificar exactamente la aplicación a
    la cual están destinados los datos que llegan a
    un computador.
  • Normalmente un servidor que corre en un
    computador específico tiene un socket que está
    asociado a un número de port específico. El
    servidor espera, oyendo por el socket a que un
    cliente quiera establecer alguna comunicación.
  • Para que un cliente pueda comunicarse con el
    servidor debe saber a qué port está asociado el
    socket por el cual el servidor está aceptando
    llamadas. Para hacer una petición de conexión el
    cliente debe tratar de hacer un rendezvous con
    por el port donde está escuchando el servidor.

8
El Socket (2)
  • Si todo sale bien, el servidor acepta la
    conexión. Con la aceptación el servidor recibe un
    nuevo socket asociado a un port nuevo (cuyo
    número no necesariamente conoce). El port
    original (por donde escuchaba) queda libre para
    seguir escuchando otras peticiones.
  • Se crea un link de comunicaciones bi-direccional
    entre el servidor y el cliente. En el servidor,
    el extremo está asociado al nuevo port.
  • En el cliente, si la conexión fue aceptada por un
    servidor, se crea un socket asociado a un port
    (cuyo nombre no es necesariamente conocido).
  • El cliente y el servidor se comunican escribiendo
    datos en o leyendo datos desde el socket.

9
Sockets en el Cliente en Java (1)
  • Cuando un programa cliente (llamador) en java
    desea conectarse con un servidor (en cualquier
    lenguaje!) debe saber primero dónde esta
    corriendo (host) y en que port está escuchando.
  • El host lo puede dar como dirección (Ej
    192.123.355.211) o como nombre (ej
    achawall.dcc.uchile.cl).
  • Sabiendo esto puede intentar un rendezvous con
    el servidor. Esto se hace intentando crear una
    conexión TCP y recogiendo el extremo del circuito
    virtual en un socket
  • Socket llamando
  • llamando new Socket(host,5555)
  • Este queda esperando hasta que se realiza la
    conexión en el servidor y se crea el socket, que
    es el extremo local de la conexión. El otro
    extremo (servidor) NO está asociado al port 5555.
    Ese se usó solamente para oir.

10
Sockets en el Cliente en Java (2)
  • Esto puede ocacionar un error si el host no
    existe, no está alcanzable por la red o no hay
    ningún servidor oyendo por ese socket. Para eso
    hay naturalmente un timeout.
  • Conviene por esto siempre ejecutarlo en un bloque
    try con el catch capturando la excepción
    UnknownHostException.

11
Sockets en el Cliente en Java (3)
  • Si todo sale bien con la conexión, podemos abrir
    un canal de lectura y/u otro de escritura para
    poder recibir y/o enviar datos.
  • PrintWriter out
  • new PrintWriter(llamando.getOutputStream(),
    true)
  • BufferedReader In new BufferedReader(
  • new InputStreamReader(llamando.getInputStream(
    )))
  • getInputStream y getOutputStream abren flujos de
    datos orientados a la lectura y escritura de
    bytes por la línea. Printwriter y BufferedReader
    son filtros que permiten leer y escribir
    strings.
  • out.print(hola) out.println(como estas)
  • String linea in.readLine()
  • El servidor debe enviar una marca de fin de línea
    (ascii) !!!!
  • Veamos un cliente que se conecta al servidor echo
    de una máquina Unix. Modifíquelo para que se
    conecte a otros.

12

Un cliente para el servidor de date
El servidor de date espera que alguien se conecte
con un rendezvous al port 13 (1) y luego responde
enviando la fecha de sus sistema (2). Luego corta
la comunicación (unilateralmente) (3).
2
3
Client
Date server
1
13
DateClient
13

Un cliente para el servidor echo
El servidor de echo espera que alguien haga un
rendezvous en el port 7 (1). Luego lee líneas de
texto desde el cliente y responde enviando lo
mismo que recibió. Esto lo sigue haciendo hasta
que el cliente se desconecta.
2
3
Client
Echo server
1
7
EchoClient
14

Un cliente finger
El servidor finger espera un request y luego
manda una serie de líneas y corta la comunicación

Finger -l ltusernamegt_at_host
3
Client
Finger server
1
7
Finger
15

Un cliente pop para mail
El protocolo está descrito en rfc 1939
(descripcion de protocolos de internet) Verlo en
http//www.ietf.org/rfc.html
cliente_pop lthostgt ltusernamegt ltpasswordgt\
3
Client
mail pop server
1
7
Cliente_pop
16
Programas Cliente en Java
  • Cómo habría que modificarlo para que se conecte
    con el servidor www (80) y muestre el archivo
    pedido?
  • Cómo habría que modificarlo para que se conecte
    con el servidor finger (79) y muestre la consulta
    pedida?
  • Cómo habría que modificarlo para que se conecte
    con el servidor ftp ( ???) y realice el diálogo?
  • Cómo se vería un cliente genérico que sirva de
    marco para todo esto?

17
Un cliente genérico para java
  • import java.io.
  • import java.net.
  • public class Cliente
  • public static void main(String args)
    throws IOException
  • Socket echoSocket null
    PrintWriter out null BufferedReader in
    null
  • if (args.length ! 2)
  • System.out.println(Use
    java GClient lthostgt ltportgt )
  • int nport Integer.parseInt(args1)
  • try
  • echoSocket new
    Socket(args0, nport)
  • out new PrintWriter(echoSocket
    .getOutputStream(), true)
  • in new BufferedReader(new
  • InputStreamReader(echoSocket.getInputStream())
    )
  • catch (UnknownHostException
    e)
  • System.err.println("Don't
    know about host " args0)
  • System.exit(1)
  • catch (IOException e)

18
Constructores para sockets
  • Socket(String host, int port) el port debe estar
    en el rango 1-65,535
  • Socket(Inet Address host, int port)lo mismo pero
    con un objeto InetAddress como parámetro
  • Socket(String host, int port, String localHost,
    int localport) Cada comunicación TCP consiste de
    un host y un port local y un host y un port
    remoto. Este constructor permite definir todos
    ellos. Especificar un host local sólo tiene
    sentido cuando el computador es multihomed (más
    de una dirección). Null default address.
    Algunas veces es necesario definir el port local
    de un cliente por los firewalls. 0 el sistema
    asigna uno dentro de los disponibles. Los números
    0 a 1024 no deben usarse ya que los usan
    servicios bien conocidos como echo, telnet
    finger, ftp.

19
Más métodos socket en Java
  • InetAddress getInetAddress() retorna la dirección
    IP del host remoto al cual el socket está
    conectado
  • int getPort() retorna el número de port al que se
    conectó el socket en el otro computador
  • InetAddress getLocalAddress() retorna la
    dirección IP del computador local
  • int getLocalPort() retorna el número de port
    local, este normalmente no va explicitado en el
    programa cliente .
  • void setSoTimeout(int timeout)pone un timeout
    para la operación de lectura (read) efectuada en
    este socket. 0 no timeout, lo cual puede
    bloquear la operación en forma indefinida
    (default). Si la operación de lectura no es
    completada en ese tiempo se lanza una
    InterruptedIOException
  • int getSoTimeout() retorna el timeout del socket

20
Más métodos socket en Java
  • void setTcpNoDelay(boolean on) Habilita/deshabilit
    a el uso del algoritmo de Nagels que hace más
    eficiente la operación de escritura retardando el
    envío de peqyueñas cantidades de información
    hasta que hay suficiente. CUIDADO, esto puede
    introducir demoras inaceptables para ciertas
    aplicaciones.
  • boolean getTcpNoDelay() retorna verdadero o falso
    dependiendo si el algoritmo de Nagel está
    funcionando o no
  • void setSoLinger(boolean on, int val) permite
    definir el time-out del linger del socket.
    Linger es el tiempo que la comunicación del
    socket permanece abierta una vez que el
    programa la ha cerrado recibiendo paquetes de
    confirmación que aún no habían llegado y evitar
    que otra aplicación use el port durante ese
    tiempo.
  • int getSoLinger () returns the current linger
    setting or 1 if not set.
  • void setSendBufferSize(int size)
  • int getSendBufferSize()
  • void setReceiveBufferSize(int size)
  • int getReceiveBufferSize()

Sockets.java
21
Exceptions originadas por Socket
  • La mayoría de los constructores de sockets lanzan
    una exception, la cual debe ser atrapada en un
    bloque try-catch. La mayoría de las exceptions
    son subclases de la clase IOException
  • BindException el port local que se pidió usar no
    pudo ser usado. Tipicamente esto sucede cuando el
    port ya está en uso.
  • ConnectException la conexín fue rechazada porque
    no había ningún programa servidor escuchando en
    el host remoto.
  • NoRouteToHostException el host remoto no pudo
    ser alcanzado ya sea por que la comunicación
    falla o porque está detrás de una firewall
  • UnknownHostException la dirección dada no es
    válida (falla en el DNS Lookup)
Write a Comment
User Comments (0)
About PowerShow.com