You are on page 1of 28

Xarxes de Dades i Internet

Pràctica 3:
Comunicació d’aplicacions
Introducció
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ L'objectiu d'aquesta pràctica és comprendre la


comunicació d'aplicacions per mitjà dels sockets.
– D'una banda, el professor explicarà com funcionen els sockets.
– D'altra banda, implementareu una aplicació client i una servidor
amb llenguatge Java, a partir dels exemples que trobareu en
aquest material.

§ Teniu descrit el que us demanem de cara a la memòria


de pràctiques.
§ Properament tindreu disponible al Campus Virtual el
test corresponent a aquesta pràctica.

2
Què són els sockets?
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Els sockets són mecanismes de comunicació entre


processos que faciliten l’enviament de dades d’un
procés a un altre que s’executen en màquines diferents
connectades per xarxa.
§ És defineix com la unió de:
– Una IP que assenyala a un equip.
– Un port que correspon a una aplicació que s’executa dintre de
l’equip.

§ Cada procés farà servir un socket per identificar-se.

3
Què són els sockets?
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

Esquema d’un navegador accedint a una web de Amazon

IP: 23.43.124.15 Demana la web d’un producte


IP: 54.239.33.90
Socket d’origen: 23.43.124.15:6520
Socket de destí: 54.239.33.90:80 SERVIDOR
HTTP
Envia la web demanada Port: 80
Port: 6520
Socket d’origen: 54.239.33.90:80
Socket de destí: 23.43.124.15:6520

4
Com funcionen els sockets?
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ La comunicació amb sockets fa servir un esquema


client-servidor.
– El servidor inicia el seu procés i es queda “escoltant” pel
seu socket esperant que altre procés enviï un missatge.
– El client inicia el seu procés i envia un missatge al
servidor. Si espera resposta, es queda a la espera.
És necessari que el client conegui la IP i el port del
servidor.
– El servidor tracta el missatge rebut. Si cal, envia la
resposta al socket del client que va iniciar la transmissió.
– El client rep la informació del servidor.

5
Assignació de ports
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Quan configurem un socket a la nostra aplicació, cal


indicar el número de port associat que farà servir.
– Un port és un valor de 0 a 65535.
– Quants bits té el número de port?
§ Tal com veurem a teoria es divideixen en 3 categories
– Ben coneguts (well-known): de 0 a 1023, que només es
poden utilitzar si el procés té permisos "d'administrador".
– Registrats: 1024 a 49151
– Efímers: 49152 a 65535, els assigna el sistema operatiu
temporalment.
• Quan el procés que el fa servir finalitza es reassigna a un
altre.

6
Tipus de sockets (velocitat vs. fiabilitat)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Serveis sense connexió


– S'envia un paquet entre client i servidor. La transmissió de
dades és més lleugera i ràpida (no s'afegeixen retards),
però hi ha una limitació de mida (un paquet de 64 kB).
– Fan servir el protocol UDP (datagrames).
– Cada paquet pot viatjar per qualsevol ruta.
• No es garanteix la recepció seqüencial dels paquets.
• Es poden perdre i poden arribar duplicats.
• L'aplicació ha de donar la fiabilitat.
– Exemples: DNS, comunicacions multimèdia (VoIP,
videotrucades).

7
Tipus de sockets (velocitat vs. fiabilitat)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Serveis amb connexió


– Estan pensats per enviar grans quantitats d’informació de
forma fiable, per tal que el programador no ho hagi de
gestionar.
• Aquesta informació s'acabarà dividint en paquets, tal i com
hem vist a teoria.
– Es garanteix la recepció dels paquets en ordre sense
duplicats. Com veurem a teoria, això implica afegir
retards, capçaleres més grans, control de flux... i dedicar
temps a establir la connexió.
– Fan servir el protocol TCP.
– Exemples: HTTP, Telnet, FTP, SMTP.
8
Tipus de sockets (velocitat vs. fiabilitat)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Orientat o no orientat a la connexió?


– En funció del tipus d'aplicació, de la quantitat de dades a
enviar, de si el temps real és crític...

§ Concurrent?
– Els servidors orientats a la connexió poden ser concurrents o no
concurrents.
– Concurrents
• Poden gestionar varis clients a la vegada, amb un fil d’execució
(thread) per cada client al que atenen (aquest concepte el fareu
servir en altres assignatures). La seva gestió és més complexa.
– No concurrents (o seqüencials)
• Només tracten una sol·licitud cada vegada, de manera que les
demés peticions es van encuant, els clients es bloquegen...

9
Creació de sockets
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Quan es crea un socket s'utilitzen els


constructors, que ens crearan els sockets:
– En el cas del servidor, en crear el socket s'especifica en
quin port estarà funcionant.
– En el cas del client, en crear el socket s'especifica tant la
IP com el port destí al que es vol realitzar la connexió.

Client: a quina IP
està el servidor? En
Servidor: port que quin port escolta?
utilitza el socket
10
Sockets en Java (model orientat a la connexió)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Per tal d’implementar una connexió amb sockets, Java


disposa dues classes i mètodes que podem trobar a la
llibreria java.net:
– ServerSocket: per gestionar la connexió des del servidor:
• public Socket accept () Espera que un client es
connecti. Retorna un socket amb la connexió establerta
(quan un client hi ha connectat amb èxit).
• public void close () Tanca la connexió del socket.
– Per rebre i escriure missatges al socket es fan servir les
classes DataInputStream i DataOutputStream (java.io)

Hi ha altres mètodes que us poden ser interessants i que podeu trobar a


https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html

11
Sockets en Java (model orientat a la connexió)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Per tal d’implementar una connexió amb sockets, Java


disposa dues classes i mètodes que podem trobar a la
llibreria java.net:
– Socket: per implementar la connexió des del client:
• public InputStream getInputStream () Llegeix
dades del canal d’entrada del socket.
• public OutputStream getOutputStream () Llegeix
dades del canal de sortida del socket.
• public void close() Tanca la connexió del socket.

https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html

12
Sockets en Java (NO orientat a la connexió)
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Per als serveis sense connexió també tenim la classe


DatagramSocket
– En aquesta mena d'aplicacions, s'estableix un diàleg on
un envia i l'altre rep, o a l'inrevés.
– Alguns mètodes:
• public void receive (DatagramPacket p) Rep un
datagrama.
• public void receive (DatagramPacket p) Envia un
datagrama.
• public void close() Tanca el socket.

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

13
Anàlisi d'exemples
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ Tot seguit trobareu quatre codis


– Aplicació 1: no orientada a la connexió
• Client
• Servidor

– Aplicació 2: orientada a la connexió


• Client
• Servidor

§ Analitzeu com funcionen, primer de forma individual i


després amb una posada en comú a classe.
§ Descriviu què fan l'aplicació 1 i l'aplicació 2.
14
Exemple de client no orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

import java.net.*;
import java.io.*;

public class ClienteUDP {

// Los argumentos proporcionan el mensaje y el nombre del servidor


public static void main(String args[]) {

try {
DatagramSocket socketUDP = new DatagramSocket();
byte[] mensaje = args[0].getBytes();
InetAddress hostServidor = InetAddress.getByName(args[1]);
int puertoServidor = 6789;

// Construimos un datagrama para enviar el mensaje al servidor


DatagramPacket peticion =
new DatagramPacket(mensaje, args[0].length(), hostServidor,
puertoServidor);

Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/

15
Exemple de client no orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

// Enviamos el datagrama
socketUDP.send(peticion);

// Construimos el DatagramPacket que contendrá la respuesta


byte[] bufer = new byte[1000];
DatagramPacket respuesta =
new DatagramPacket(bufer, bufer.length);
socketUDP.receive(respuesta);

// Enviamos la respuesta del servidor a la salida estandar


System.out.println("Respuesta: " + new String(respuesta.getData()));

// Cerramos el socket
socketUDP.close();

} catch (SocketException e) {
System.out.println("Socket: " + e.getMessage());
} catch (IOException e) {
System.out.println("IO: " + e.getMessage());
}
} Extret de
} http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/

16
Exemple de servidor no orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

import java.net.*;
import java.io.*;

public class ServidorUDP {

public static void main (String args[]) {

try {

DatagramSocket socketUDP = new DatagramSocket(6789);


byte[] bufer = new byte[1000];

while (true) {
// Construimos el DatagramPacket para recibir peticiones
DatagramPacket peticion =
new DatagramPacket(bufer, bufer.length);

// Leemos una petición del DatagramSocket


socketUDP.receive(peticion);

Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/

17
Exemple de servidor no orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

System.out.print("Datagrama recibido del host: " +


peticion.getAddress());
System.out.println(" desde el puerto remoto: " +
peticion.getPort());

// Construimos el DatagramPacket para enviar la respuesta


DatagramPacket respuesta =
new DatagramPacket(peticion.getData(), peticion.getLength(),
peticion.getAddress(), peticion.getPort());

// Enviamos la respuesta, que es un eco


socketUDP.send(respuesta);
}

} catch (SocketException e) {
System.out.println("Socket: " + e.getMessage());
} catch (IOException e) {
System.out.println("IO: " + e.getMessage());
}
} Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsUDP/
}

18
Esquema: no orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

Client Servidor (bucle infinit)

Crea el socket Crea el socket

Crea el paquet a enviar i


hi posa una petició
Envia el paquet
Rep el paquet
Crea el paquet a enviar
i hi posa la resposta
Envia el paquet
Rebre el paquet

Tanca el socket

19
Exemple de client orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

import java.net.*;
import java.io.*;

public class EcoCliente {


public static void main(String[] args) throws IOException {
Socket socketCliente = null;
BufferedReader entrada = null;
PrintWriter salida = null;

// Creamos un socket en el lado cliente, enlazado con un


// servidor que está en la misma máquina que el cliente
// y que escucha en el puerto 4444
try {
socketCliente = new Socket("localhost", 4444);
// Obtenemos el canal de entrada
entrada = new BufferedReader(new
InputStreamReader(socketCliente.getInputStream()));
// Obtenemos el canal de salida
salida = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socketCliente.getOutputStream())),true);
} catch (IOException e) { Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsTCP/

20
Exemple de client orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

System.err.println("No puede establer canales de E/S para la conexión");


System.exit(-1);
}
BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));

String linea;

// El programa cliente no analiza los mensajes enviados por el


// usario, simplemente los reenvía al servidor hasta que este
// se despide con "Adios"
try {
while (true) {
// Leo la entrada del usuario
linea = stdIn.readLine();
// La envia al servidor
salida.println(linea);
// Envía a la salida estándar la respuesta del servidor
linea = entrada.readLine();
System.out.println("Respuesta servidor: " + linea);
Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsTCP/

21
Exemple de client orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

// Si es "Adios" es que finaliza la comunicación


if (linea.equals("Adios")) break;
}
} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
// Libera recursos
salida.close();
entrada.close();
stdIn.close();
socketCliente.close();
}
}

Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsTCP/

22
Exemple de servidor orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

import java.io.*;
import java.net.*;

public class EcoServidor {


public static final int PORT = 4444;
public static void main(String[] args) throws IOException {
// Establece el puerto en el que escucha peticiones
ServerSocket socketServidor = null;
try {
socketServidor = new ServerSocket(PORT);
} catch (IOException e) {
System.out.println("No puede escuchar en el puerto: " + PORT);
System.exit(-1);
}

Socket socketCliente = null;


BufferedReader entrada = null;
PrintWriter salida = null;

System.out.println("Escuchando: " + socketServidor);


Extret de
http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsTCP/

23
try {
// Se bloquea hasta que recibe alguna petición de un cliente
// abriendo un socket para el cliente
socketCliente = socketServidor.accept();
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

System.out.println("Connexión acceptada: "+ socketCliente);


// Establece canal de entrada
entrada = new BufferedReader(new
InputStreamReader(socketCliente.getInputStream()));
// Establece canal de salida
salida = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socketCliente.getOutputStream())),true);
// Hace eco de lo que le proporciona el cliente, hasta que recibe "Adios"
while (true) {
String str = entrada.readLine();
System.out.println("Cliente: " + str);
salida.println(str);
if (str.equals("Adios")) break;
}

} catch (IOException e) {
System.out.println("IOException: " + e.getMessage());
}
salida.close();
entrada.close();
socketCliente.close();
socketServidor.close();
Extret de
} http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSocketsTCP/
}
24
Esquema: orientat a la connexió
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

Client Servidor (bucle infinit)

Crea el socket Crea el socket

Establiment de connexió
Atén el client

Successió d'enviaments i Si és concurrent,


Successió de respostes
respostes això ho fa un
(i enviaments)
thread, perquè
el servidor pugui
atendre més
Tanca el socket Tanca la connexió
clients.

25
Repte: fes la teva pròpia aplicació
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ A partir dels exemples proporcionats, inventa't un cas


pràctic i desenvolupa'l, per exemple:
– Propostes no orientades a la connexió:
• Servidor que inverteix la paraula que envia el client, servidor
que descompon en factors primers un número, etc.

– Propostes orientades a la connexió:


• Servidor que respon aleatòriament a una conversa amb el
client, servidor que fa una partida del 7 i mig, etc. Noteu
que com que no hem treballat els servidors concurrents, els
clients es quedaran bloquejats mentre el servidor està
atenent una petició.

26
Memòria de pràctiques
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ En l'apartat corresponent a aquesta pràctica heu


d'incloure el següent:
– Un resum d'entre 200 i 300 paraules sobre el concepte socket:
què són, per a què serveixen i de quins tipus hi ha.
– Una breu explicació de l'exemple que heu decidit implementar,
a partir del codi que us hem proporcionat. Recordeu justificar
perquè heu escollit el model orientat a la connexió o el no
orientat a la connexió.
– Una descripció de les proves que heu fet i si aquestes han
funcionat com esperàveu.

Important: si sou citats a l'entrevista possiblement us


demanem que ens feu una demostració d'aquesta pràctica!

27
Referències
Xarxes de Dades i Internet – Departament d’Enginyeria Informàtica i Matemàtiques

§ http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSock
etsUDP/
§ http://www.it.uc3m.es/celeste/docencia/cr/2003/PracticaSock
etsTCP/
§ http://sopa.dis.ulpgc.es/ii-
dso/leclinux/ipc/sockets/sockets.pdf
§ http://umh2266.edu.umh.es/wp-
content/uploads/sites/197/2013/04/T5_ClientServer.pdf
§ Crèdits de les imatges https://www.stickpng.com/

28

You might also like