You are on page 1of 36

Arquitecturas cliente/servidor

Creacin de Sockets Cliente Servidor

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Creacin de Sockets Cliente/Servidor


Sockets en TCP
Sockets en UDP
Definicin de DAEMON
Concepto de Hilos
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Qu es un socket?
Un socket es un punto final de un enlace de
comunicacin de dos vas entre dos
programas que se ejecutan a travs de la red.
El cliente y el servidor deben ponerse de
acuerdo sobre el protocolo que utilizarn.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Familias de sockets
Es una constante de la API de Berkeley que indica que tipo de
Protocolo se va utilizar durante una conexin
Familia AF_UNIX: Usa protocolos internos de Unix.
Familia AF_INET: Usa protocolos de Internet, como el TCP
(Transmisin Control Protocol).
Familia AF_CCITT: Norma X.25 de CCITT.
Familia AF_NS: Protocolos NS de XEROX.
Familia AF_SNA: Protocolos IBM SNA.
Entre otras..
Tambin se puede encontrar como PF_* (Protocol Family)
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Referencia API de sockets en C


Circuito virtual: Mediante la bsqueda de
enlaces libres, se establece un circuito virtual.
Conexin permanente hasta el final de la
comunicacin. SOCK_STREAM
Datagramas: no trabajan con circuitos
permanentes. La transmisin se realiza a nivel
de paquetes. SOCK_DGRAM
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Sockets TCP

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Orientado a Conexin
Establece un camino virtual entre servidor y cliente,
fiable, sin prdidas de informacin ni duplicados, la
informacin llega en el mismo orden que se enva.
El cliente abre una sesin en el servidor y este guarda
un estado del cliente.
El cliente utiliza la clase Socket
El servidor utiliza la clase ServerSocket
Estas clases se encuentran definidas en el paquete java.net
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Clase Socket
Constructores:
public Socket ()
public Socket (InetAddress address, int port)
public Socket (String host, int port)
public Socket (InetAddress address, int port, InetAddress localAddr, int
localPort)
public Socket (String host, int portt, InetAddress localAddr, int localPort)
address / localAddr Direccin IP de la mquina remota /local.
port / localPort
Puerto de la mquina remota / local.
host
Nombre de la mquina remota
Nota: En el caso del primer constructor se crea un objeto Socket sin
conexin.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Servicios de la clase Socket


public InetAddress getInetAddress()
Devuelve la direccin IP de la mquina en la que estamos conectados.

public int getPort()


Devuelve el puerto de la mquina remota.

public void close()


Cierra el canal de comunicacin.

public InputStream getInputStream()


Devuelve el canal de lectura del socket.

public OutputStream getOutputStream()


Devuelve el canal de escritura del socket.

Ademas JAVA proporciona dos llamadas para saber la @IP y puerto local
(getLocalAddress() y getLocalPort())
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Clase ServerSocket
Constructores:
public ServerSocket (int port)
public ServerSocket (int port, int backlog)
public ServerSocket (int port, int backlog, InetAddress bindAddr)

port
puerto de escucha de la mquina servidora.
backlog tamao de la cola de espera, en el primero es 50.
bindAddr direccin IP local que se har pblica mediante el bind.
El constructor ServerSocket se encarga de hacer el bind y el listen.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Servicios de la clase ServerSocket


public Socket accept()
Devuelve el socket resultado de aceptar una peticin, para
llevar a cabo la comunicacin con el cliente.

public void close()


Cierra el canal de comunicacin.

public InetAddress getInetAddress()


Devuelve la direccin IP de la mquina local.

public int getLocalPort()


Devuelve el puerto de la mquina local
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Modelo cliente/servidor
Modelo general
SERVIDOR
ServerSocket(port#)
accept()
............
InputStream
OutputStream
............
close()

CLIENTE
Socket(host,port#)
............
OutputStream
InputStream
............
close()
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Creacin de objetos
Conexin servidor

ServerSocket miServicio;
try{
miServicio = new ServerSocket(numeroPuerto);
} catch ( IOException e ) {
System.out.println ( e );
}
.......
Socket socketServicio = null;
try{
socketServicio = miServicio.accept();
} catch ( IOException e ) {
System.out.println ( e );
}

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Creacin de objetos (2)


Conexin cliente
Socket miCliente;
try{
miCliente = new Socket(maquina,numeroPuerto);
} catch ( IOException e ) {
System.out.println ( e );
}

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Creacin de Objetos Stream


Creacin Streams de entrada

A pesar de haber creado el socket, el programa no puede enviar o recibir datos a


traves de esta clase. Se utilizan los InputStream y el OutputStream

DataInputStream entrada; (--- CLIENTE ---)


try {
entrada = new DataInputStream( miCliente.getInputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
DataInputStream entrada; (--- SERVIDOR ---)
try {
entrada = new DataInputStream(socketServicio.getInputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Creacin de Objetos Stream


Creacin Streams salida
PrintStream salida; (--- CLIENTE y SERVIDOR ---)
try {
salida = new PrintStream( miCliente.getOutputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}

DataOutputStream salida; (--- CLIENTE y SERVIDOR ---)


try {
salida = new DataOutputStream(miCliente.getOutputStream() );
} catch ( IOException e ) {
System.out.println ( e );
}

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

InputStream &
Output Stream

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Comunicacin entre cliente/servidor


Para la transmisin de datos entre cliente y servidor se utilizan las
clases DataInputStream (recibir datos) y DataOutputStream (enviar
datos)
Estas clases disponen de mtodos para leer y escribir
datos en el socket:

read/write Boolean
read/write Char
read/write Double, read/write Float, read/write Int,
read/write Long, read/write Short
read/writeUTF (leer/escribir cadenas de caracteres)

Para envar los datos se utiliza el mtodo flush() de la clase


DataOutputStream.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Interaccin cliente/servidor: TCP


Servidor (corriendo en IP hostid)

Cliente

create socket,
port=x, for
incoming request:
serverSocket =
ServerSocket()

TCP

wait for incoming


connection request connection
connectionSocket =
serverSocket.accept()

setup

read request from


connectionSocket
write reply to
connectionSocket
close
connectionSocket
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

create socket,
connect to hostid, port=x
clientSocket =
Socket()

send request using


clientSocket

read reply from


clientSocket
close
clientSocket

import java.io.*;
import java.net.*;
public class SimpleEchoServer{
public static void main(String[] args) {
try{
ServerSocket s = new ServerSocket(9999);
String str;
while (true){
Socket c = s.accept();
InputStream i =
c.getInputStream();
OutputStream o =
c.getOutputStream();
do{
byte[] line = new byte[100];
i.read(line);
o.write(line);
str = new String(line);
}while ( !str.trim().equals("bye") );

c.close();
}
}catch (Exception err){
System.err.println(err);
}

}
}

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

import java.net.*;
import java.io.*;
public class SimpleEchoClient{
public static void main(String[] args) {
try{
Socket s = new Socket("127.0.0.1", 9999);
InputStream i = s.getInputStream();
OutputStream o =
s.getOutputStream();
String str;
do{
byte[] line = new byte[100];
System.in.read(line);
o.write(line);
i.read(line);
str = new String(line);
System.out.println(local: +str.trim());
}while ( !str.trim().equals("bye") );

s.close();
}catch (Exception err){
System.err.println(err);
}
}

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Ciclo de vida de un socket TCP

Ciclo de vida
del servidor TCP
Ciclo de vida del
cliente TCP

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Sockets UDP

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

No orientado a conexin
Envo de datagramas de tamao fijo. No es fiable, puede haber
prdidas de informacin y duplicados, y la informacin puede llegar
en distinto orden del que se enva.
No se guarda ningn estado del cliente en el servidor, por ello, es
ms tolerante a fallos del sistema.

Tanto el cliente como el servidor utilizan la clase DatagramSocket.

Se encuentran en el paquete java.net

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Clase Datagram Socket


Constructores:
public DatagramSocket ()
public DatagramSocket (int port)
public DatagramSocket (int port, InetAddress laddr)
port puerto de la mquina.
laddr direccin IP local que se har pblica mediante el bind.
El constructor DatagramSocket se encarga de hacer el
bind.
El primer constructor elige un puerto libre.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

DatagramSocket
Un objeto java.net.DatagramSocket es un conector
a travs del cual enviamos y recibimos paquetes
UDP.
Si se quiere utilizar un DatagramSocket para recibir
paquetes se necesita especificar el puerto.
Al contrario, si es para enviar paquetes, no es
necesario especificar este puerto.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Ejemplo
DatagramSocket ds1 = new DatagramSocket(123);
/* Aqu usamos este DatagramSocket para recibir
datos... */
/* ... */
/* Hemos terminado, cerramos el socket */
ds1.close();
DatagramSocket ds2 = new DatagramSocket();
/* Aqu lo usamos para transmitir datos... */ /* ...
*/
/* Hemos terminado, cerramos el socket */
ds2.close();
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Servicios de la clase DatagramSocket


public void connect(InetAddress address, int port)
Conecta el socket a la mquina remota con la @IP address y puerto port.
public void close()
Cierra el canal de comunicacin.
public InetAddress getInetAddress()
Devuelve la @IP de la mquina remota.
public int getPort()
Devuelve el puerto de la mquina remota.
Tambin hay dos llamadas para saber la @IP y puerto
local (getLocalAddress() y getLocalPort()).

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

DatagramSocket
public void send ( DatagramPacket p):
Enva un datagrama a la mquina remota, por el
socket asociado.
public void receive ( DatagramPacket p):
Recibe un datagrama de otra mquina, por el
socket asociado.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

La clase DatagramPacket
Esta clase representa a los paquetes de datos que vamos a
recibir o transmitir a travs de los objetos DatagramSocket.
Estos paquetes constan de:
cabecera direccin de origen, destino del paquete,
el puerto, longitud del paquete, checksum, etc.
cuerpo contenido real del paquete.

cabecera

En Java accedemos a las distintas partes de un datagrama


mediante los mtodos de la clase java.net.DatagramPacket.

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

cuerpo

DatagramPacket
La forma de construir datagramas es distinta dependiendo de si queremos
enviar o recibir datos.
En caso de que se quiera recibir, especificar:
arreglo de bytes donde almacenar los datos
longitud mxima que queremos recibir.
Si queremos transmitir, especificar:
arreglo de bytes a enviar
longitud mxima datos a enviar
direccin y puerto destino del datagrama.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Clase DatagramPacket
Constructores
public DatagramPacket (byte[] buff, int length)
Construye un DatagramPacket para recibir paquetes en el
buffer buff, de longitud length
public DatagramPacket (byte[] buff, int length, InetAddress address, int port)
Construye un DatagramPacket para envar paquetes con datos del buffer buff, de
longitud length, a la @IP address y el puerto port.
Servicios:
Para la actualizacin y consulta de los diferentes campos de un
DatagramPacket disponemos de los siguientes mtodos:
set/getAddress, set/getData, set/getLength, set/getPort

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Enviar datos
int tam = 1024;
InetAddress direcc = ...;
byte[] datos = new byte[tam];
int puerto = 543;
for (int n=0;n<tam;n++){
/* Generamos los datos que vamos a enviar */
datos[n] = ...;
}
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp =
new DatagramPacket(datos, tam, direcc, puerto);
ds.send(dp); /* Aqu enviamos el paquete */
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

Recibir datos
int tam = 1024;
byte[] buffer = new byte[tam];
int puerto = 987;
DatagramSocket ds =
new DatagramSocket(puerto);
DatagramPacket dp =
new DatagramPacket(buffer,tam);
ds.receive(dp);

/*Ahora tenemos en buffer la informacin que nos interesa*/

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Interaccin cliente/servidor: UDP


Servidor (corriendo en host)
create socket,
port=x, for
incoming request:
serverSocket =
DatagramSocket()

read request from


serverSocket
write reply to
serverSocket
specifying client
host address,
port number

Cliente

create socket,
clientSocket =
DatagramSocket()
Create, address (hostid, port=x,
send datagram request
using clientSocket

read reply from


clientSocket

close
clientSocket

Arquitecturas Cliente/Servidor, Sem 2015-1


M.I.Yasmine Macedo Reza

Clase InetAddress
La forma de crear un objeto InetAddress es
mediante el mtodo esttico:
InetAddress.getByName(String host)
Recibe un nombre de host en notacin alfanumrica (por
ejemplo "www.etsit.upv.es" o "209.41.57.70" )
devuelve un objeto InetAddress con esa direccin.
Si la direccin no existe o no puede ser encontrada, este
mtodo lanza una excepcin UnknownHostException.
Arquitecturas Cliente/Servidor, Sem 2015-1
M.I.Yasmine Macedo Reza

You might also like