UDP en Java
UDP en Java
UDP en Java
import java.net.*;
import java.io.*; import java.net.*;
public class UDPClient { import java.io.*;
public static void main(String args[]) { public class UDPServer {
DatagramSocket socket = null; public static void main(String args[]) {
try { DatagramSocket socket = null;
socket = new DatagramSocket(); try {
byte[] m = args[0].getBytes(); socket = new DatagramSocket(6789);
InetAddress host = InetAddress.getByName(args[1]); byte[] n = new byte[1000];
int port = 6789; while (true) {
DatagramPacket req = new DatagraPacket(m, DatagramPacket req = new
args[0].length, host, port); DatagraPacket(n, n.length);
socket.send(req); socket.receive(req);
byte[] n = new byte[1000]; DatagramPacket rep = new
DatagramPacket rep = new DatagramPacket(req.getData(),
DatagraPacket(n, n.length); req.getLength(), req.getAddress(),
socket.receive(rep); req.getPort());
System.out.println(“Received “+ new String socket.send(rep);
(rep.getData())); }
} catch (SocketException e) { } catch (SocketException e) {
System.out.println(“Socket: “+e.getMessage()); } System.out.println(“Socket: “+e.getMessage()); }
} catch (IOException e) { } catch (IOException e) {
System.out.println(“IO: “+e.getMessage());} System.out.println(“IO: “+e.getMessage());}
} finally { if (socket != null) socket.close(); } } finally { if (socket != null) socket.close(); }
} }
} }
Particularidades de UDP
• Tamaño del mensaje: el recibidor debe establecer el largo
del mensaje a recibir, si es más chico que el que se mandó se
trunca (se puede hasta 216 pero muchos ambientes lo limitan
a 8 kilobytes)
• Bloqueo: la instrucción de send no bloquea Los datagramas
son almacenados en una cola en el destino. Si no hay proceso
esperándolos se descartan. Receive bloquea hasta que hay
algo que leer de la cola o hasta el timeout
• Timeouts: se pueden definir sobre el socket, por default no
hay setSoTimeout. Concurrencia ?
• Recibe de cualquiera: el receive no especifica de quién, así
que el origen se saca del datagrama. Se puede abrir un
DatagramSocket que sólo pueda mandar a una dirección y a
un port connect (en qué casos es útil?)
Lo mismo con TCP
import java.net.*;
import java.io.*; import java.net.*;
public class TCPClient { import java.io.*;
public static void main(String args[]) { public class UDPServer {
Socket socket = null; public static void main(String args[]) {
try { try {
s = new Socket(args[1], 6789); DataInputStream in = null;
DataInputStream in = new DataOutputStream out = null;
DataInputStram(s.getInputStream()); ServerSocket ss = new ServerSocket(6789);
DataOutputStream out = new while(true) {
DataOutputStream(s.getOutputStream()); Socket s = ss.accept();
out.writeUTF(args[0]); in = new DataInputStream(s.getInputStream());
String data = in.readUTF(); out = new OutputStream(s.getOutputStream());
System.out.println(“Received “+ data); String data = in.readUTF();
} catch (UnknownHostException e) { out.writeUTF(data);
System.out.println(“Sock: “+e.getMessage()); } }
} catch (EOFException e) { } catch (EOFException e) {
System.out.println(“EOF: “+e.getMessage());} System.out.println(“EOF: “+e.getMessage());}
} catch (IOException e) { } catch (IOException e) {
System.out.println(“IO: “+e.getMessage());} System.out.println(“IO: “+e.getMessage());}
} finally { if (socket != null) try { socket.close(); } } finally { if (socket != null) try { socket.close(); }
catch(IOException e) {} catch(IOException e) {}
} }
} }
Particularidades de TCP
• Coincidencia de datos en los extremos :
• Bloqueo: hay chequeo (ack)
• Fallas : TCP trata de hacer coincidir las velocidades de escritura
y lectura. Si el escribidor es muy rápido, trata de bloquearlo hasta
que el lector haya consumido suficiente.
• Duplicación y orden de mensajes: los paquetes ip contienen
identificadores correlativos que permiten al recibidor detectar
duplicados o cambiados de orden
• Destino de los mensajes: como se abre una conexión virtual entre
ambos extremos, no es necesario especificar a quién va ya que el
socket se abre con un connect
Qué esconde TCP
• Tamaño del mensaje: Las aplicaciones deciden cuánto leer y
cuánto escribir. El sistema subyacente decide cómo transmitirlo.
• Mensajes Perdidos: hay chequeo (ack)
• Control de flujo: TCP trata de hacer coincidir las velocidades de
escritura y lectura. Si el escribidor es muy rápido, trata de
bloquearlo hasta que el lector haya consumido suficiente.
• Duplicación y orden de mensajes: los paquetes ip contienen
identificadores correlativos que permiten al recibidor detectar
duplicados o cambiados de orden
• Destino de los mensajes: como se abre una conexión virtual entre
ambos extremos, no es necesario especificar a quién va ya que el
socket se abre con un connect
Problemas de TCP
• Coincidencia de datos: Lo que se mande por un lado y lo que se
lea (formato) debe coincidir (en especial al mandar objetos).
• Bloqueo: hay que asegurarse que cundo se escribe pocos datos
estos se manden si es necesario contar con ellos pronto o pueden
bloquear la ejecución (buffer)
• La comunicación se establece de punto a punto, así que sólo se
atiende a un cliente a la vez (a menos que se haga concurrente)
• Falla de la conexión: si se demora mucho en hacer el ack
entonces la conexión se declara rota (se tira un IOException). En
este sentido TCP no es más seguro de lo que la red lo es.
• El proceso usando la conexión no puede distinguir si la falla se
debe a la red o a que el proceso par se cayó
• No puede saber después de la caída qué llego efectivamente a
destino y qué no alcanzó a llegar
El esquema request-reply
• Muchas veces cuando se usa TCP o UDP se modela el protocolo
de comunicación entre cliente y servidor con el esquema de
request-reply
• Son la base para implementar middleware como RMI, RPC,
CORBA o algo parecido
• Se basan en un trio de primitivas de comunicación: doOperation,
getRequest y sendReply
Cliente Servidor
getRequest
doOperation
(select object)
(wait)
(execute meth.)
(continue)
sendReplay
El esquema request-reply
• Aunque a Implementación UDP tiene ventajas se han
implementado ya algunas versiones en TCP:
• el acknowladge de TCP es innecesario ya que se hace un reply
a cada request a nivel de aplicación
• se evitan los mensajes para la conexión
• el control de flujo es innecesario cuando los argumentos
pasados son pequeños (caben en una trama)
Modelo:
message(g,m) : operación de transmisión de un
mensaje m a los miembros de un grupo g
deliver(m) : operación de proceso de mensaje m
sender(m) : identificación del que manda el mensaje
group(m) : grupo de destino del mensaje
open/closed group : el grupo puede/no puede recibir
mensajes mandados por un por un
miembro que no pertenece al grupo
Reliable Multicast
Reliable multicast implica que se cumplen 3 propiedades: