chat
Class SocketUDPaffidabile

java.lang.Object
  |
  +--chat.SocketUDPaffidabile
Direct Known Subclasses:
Monitor

public abstract class SocketUDPaffidabile
extends java.lang.Object

Astrazione di un socket UDP che utilizza Automatic Repeat reQuest (ARQ) per consegnare i datagrammi all'altro capo della rete. Realizzato come wrapper attorno ad un java.net.DatagramSocket.

Oltre all'aspetto reliable dell'invio di datagrammi, viene realizzata anche una gestione dei java.net.DatagramPacket per evitare che duplicazioni o forti ritardi nel transito in rete possano riflettersi anche esternamente alla classe stessa. Questo viene realizzato mediante sequence number progressivi attribuiti ai messaggi scambiati in rete.

ATTENZIONE: per via del protocollo di comunicazione realizzato questa classe non consente di ricevere meno di quattro byte: i datagrammi contenenti quattro byte applicativi vengono interpretati come acknowledge, mentre solo quelli aventi cinque o più byte sono interpretati come unità informative significative. Per lunghezze strettamente inferiori a quattro il DatagramPacket viene semplicemente scartato.

Version:
1.0
Author:
Alessandro Gaspari

Field Summary
private  java.util.Vector cache
          Buffer temporaneo nel quale inserire i datagrammi non ancora letti dall'utente.
private  java.util.Vector history
          Archivio degli ultimi sequence number delle connessioni virtuali.
private  java.net.DatagramSocket sock
          La socket UDP tramite la quale realizzare gli scambi affidabili di datagrammi.
static int TENTATIVI
          Numero massimo di invii per ciascun datagramma nel caso non sia ricevuta alcuna conferma (ACK) da parte dal destinatario.
static int TIMEOUT
          Timeout in millisecondi fra l'invio di un messaggio e la ricezione del relativo acknowledge.
 
Constructor Summary
SocketUDPaffidabile()
          Costruttore che crea il java.net.DatagramSocket interno da impiegare per l'accesso alla rete.
SocketUDPaffidabile(int porta)
          Costruttore che crea il java.net.DatagramSocket interno da impiegare per l'accesso alla rete, assegnandogli un numero di porta UDP da impiegare.
 
Method Summary
private  void allaCache(java.net.DatagramPacket d, int seq_num)
          Accesso in scrittura alla cache dei DatagramPacket estratti da sock ma non ancora letti dall'utente.
 void chiudi()
          Chiusura del socket UDP usato internamente.
 int disponibili()
          Metodo per ottenere il numero di DatagramPacket disponibili alla lettura.
protected abstract  int estraiSeqNum(java.net.DatagramPacket d)
          Metodo che processa i datagrammi (non ACK) ricevuti dalla rete.
private  void flush()
          Lettura di tutti i datagrammi, diversi dagli ACK, disponibili da sock.
protected abstract  int inserisciSeqNum(java.net.DatagramPacket d)
          Metodo che processa i datagrammi prima di inviarli direttamente in rete.
 int invia(java.net.DatagramPacket d)
          Metodo per inviare in modo affidabile un datagramma UDP.
 int invia(java.net.DatagramPacket[] d)
          Metodo per inviare in modo affidabile dei datagrammi UDP.
 void ricevi(java.net.DatagramPacket d)
          Lettura, con eventuale attesa, del primo datagramma disponibile.
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, registerNatives, toString, wait, wait, wait
 

Field Detail

TIMEOUT

public static final int TIMEOUT
Timeout in millisecondi fra l'invio di un messaggio e la ricezione del relativo acknowledge.

TENTATIVI

public static final int TENTATIVI
Numero massimo di invii per ciascun datagramma nel caso non sia ricevuta alcuna conferma (ACK) da parte dal destinatario.

sock

private java.net.DatagramSocket sock
La socket UDP tramite la quale realizzare gli scambi affidabili di datagrammi.

history

private java.util.Vector history
Archivio degli ultimi sequence number delle connessioni virtuali.

cache

private java.util.Vector cache
Buffer temporaneo nel quale inserire i datagrammi non ancora letti dall'utente.
Constructor Detail

SocketUDPaffidabile

public SocketUDPaffidabile()
                    throws java.net.SocketException
Costruttore che crea il java.net.DatagramSocket interno da impiegare per l'accesso alla rete. La porta UDP da usare viene scelta dal Sistema Operativo sottostante.
Throws:
java.net.SocketException - se ottenuta creando il socket.

SocketUDPaffidabile

public SocketUDPaffidabile(int porta)
                    throws java.net.SocketException
Costruttore che crea il java.net.DatagramSocket interno da impiegare per l'accesso alla rete, assegnandogli un numero di porta UDP da impiegare.
Parameters:
porta - il numero di porta UDP da impiegare.
Throws:
java.net.SocketException - se ottenuta creando il socket.
Method Detail

invia

public final int invia(java.net.DatagramPacket d)
                throws java.io.IOException
Metodo per inviare in modo affidabile un datagramma UDP. Wrapper di int invia(DatagramPacket[]).
Parameters:
d - il datagramma UDP da recapitare.
Returns:
il numero di DatagramPacket per i quali è giunta la conferma della ricezione (ACK).
Throws:
java.io.IOException - se generato dal socket usato internamente.
See Also:
invia(DatagramPacket[])

invia

public final int invia(java.net.DatagramPacket[] d)
                throws java.io.IOException
Metodo per inviare in modo affidabile dei datagrammi UDP.
Parameters:
d - i datagrammi UDP da recapitare.
Returns:
il numero di DatagramPacket per i quali è giunta la conferma della ricezione (ACK).
Throws:
java.io.IOException - se generato dal socket usato internamente.

disponibili

public final int disponibili()
                      throws java.io.IOException
Metodo per ottenere il numero di DatagramPacket disponibili alla lettura.
Returns:
il numero di datagrammi che possono essere letti senza bloccarsi in attesa sul socket interno.
Throws:
java.io.IOException - se generata dal DatagramSocket interno.
See Also:
sock

ricevi

public void ricevi(java.net.DatagramPacket d)
            throws java.io.IOException
Lettura, con eventuale attesa, del primo datagramma disponibile.
Parameters:
d - il DatagramPacket ricevuto.
Throws:
java.io.IOException - se generata dal DatagramSocket interno.

chiudi

public void chiudi()
Chiusura del socket UDP usato internamente. Invoca semplicemente sock.close().
See Also:
sock

inserisciSeqNum

protected abstract int inserisciSeqNum(java.net.DatagramPacket d)
Metodo che processa i datagrammi prima di inviarli direttamente in rete. Per ciascun messaggio UDP passato come parametro ad invia(...) viene invocato una ed una sola volta.
Parameters:
d - il DatagramPacket da manipolare.
Returns:
il sequence number aggiunto a d.
See Also:
invia(DatagramPacket), invia(DatagramPacket[])

estraiSeqNum

protected abstract int estraiSeqNum(java.net.DatagramPacket d)
Metodo che processa i datagrammi (non ACK) ricevuti dalla rete. Per ogni messaggio UDP pervenuto a ricevi(...) questa procedura viene invocata una ed una sola volta.
Parameters:
d - il DatagramPacket da manipolare.
Returns:
il sequence number letto da d.
See Also:
ricevi(DatagramPacket)

flush

private void flush()
            throws java.io.IOException
Lettura di tutti i datagrammi, diversi dagli ACK, disponibili da sock. Gli ACK vengono scartati, mentre gli altri messaggi vengono messi nella cache interna cache se non sono già stati ricevuti.
Throws:
java.io.IOException - se generata dal DatagramSocket interno.
See Also:
sock, cache

allaCache

private void allaCache(java.net.DatagramPacket d,
                       int seq_num)
Accesso in scrittura alla cache dei DatagramPacket estratti da sock ma non ancora letti dall'utente. Prima di aggiungere effettivamente il datagramma a cache viene controllato se il medesimo segmento informativo è già stati ricevuto, ispezionando le entry di history; questo evita duplicazioni per il client esterno di questo SocketUDPaffidabile.
Parameters:
d - il datagramma UDP appena estratto dal socket interno.
seq_num - il sequence number di d.
See Also:
sock, cache, history