|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--chat.SocketUDPaffidabile
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.
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 |
|
Field Detail |
public static final int TIMEOUT
public static final int TENTATIVI
private java.net.DatagramSocket sock
private java.util.Vector history
private java.util.Vector cache
Constructor Detail |
public SocketUDPaffidabile() throws java.net.SocketException
java.net.DatagramSocket
interno da impiegare per l'accesso alla rete. La porta UDP da
usare viene scelta dal Sistema Operativo sottostante.public SocketUDPaffidabile(int porta) throws java.net.SocketException
java.net.DatagramSocket
interno da impiegare per l'accesso alla rete, assegnandogli un
numero di porta UDP da impiegare.porta
- il numero di porta UDP da impiegare.Method Detail |
public final int invia(java.net.DatagramPacket d) throws java.io.IOException
int invia(DatagramPacket[])
.d
- il datagramma UDP da recapitare.DatagramPacket
per i quali
è giunta la conferma della ricezione (ACK).invia(DatagramPacket[])
public final int invia(java.net.DatagramPacket[] d) throws java.io.IOException
d
- i datagrammi UDP da recapitare.DatagramPacket
per i quali
è giunta la conferma della ricezione (ACK).public final int disponibili() throws java.io.IOException
DatagramPacket
disponibili alla lettura.DatagramSocket
interno.sock
public void ricevi(java.net.DatagramPacket d) throws java.io.IOException
d
- il DatagramPacket
ricevuto.DatagramSocket
interno.public void chiudi()
sock.close()
.sock
protected abstract int inserisciSeqNum(java.net.DatagramPacket d)
invia(...)
viene invocato una ed una sola volta.d
- il DatagramPacket
da manipolare.d
.invia(DatagramPacket)
,
invia(DatagramPacket[])
protected abstract int estraiSeqNum(java.net.DatagramPacket d)
ricevi(...)
questa procedura viene invocata una ed una sola volta.d
- il DatagramPacket
da manipolare.d
.ricevi(DatagramPacket)
private void flush() throws java.io.IOException
sock
. Gli ACK vengono scartati, mentre
gli altri messaggi vengono messi nella cache interna
cache
se non sono già stati ricevuti.DatagramSocket
interno.sock
,
cache
private void allaCache(java.net.DatagramPacket d, int seq_num)
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
.d
- il datagramma UDP appena estratto dal socket interno.seq_num
- il sequence number di d
.sock
,
cache
,
history
|
||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |