
Originariamente inviata da
andbin
Innanzitutto tieni presente che: a) receive() è "bloccante" (attende fino alla ricezione di un datagram) e b) se in un certo momento non stai ricevendo con receive() ma arrivano dei datagram, a seconda di vari fattori, un certo numero possono essere bufferizzati e tenuti in coda.
A proposito del receive() bloccante....
Io ho implementato un Client che cerca un host nel gruppo multicast inviando un pacchetto vuoto.
Dato che il receive è bloccante ; se l'Host si mette in attesa dei pacchetti vuoti con una receive() e nella prossima riga del codice l'Host fa una send di un pacchetto vuoto come risposta ; questo pacchetto vuoto verrà spedito solo se arriverà qualcosa ?
Cioè il client manda una richiesta (un pacchetto vuoto) :
codice:
byte [] buf = new byte [128];
DatagramPacket packet = new DatagramPacket(buf , buf.length , groupAddress , multicastPort);
try{
Msocket.send(packet);
}catch(Exception err){
err.printStackTrace();
}
L'Host resta in attesa e se riceve il pacchetto vuoto ne invia anche uno vuoto a sua volta :
codice:
Msocket.joinGroup(groupAddress);
byte [] buf = new byte [128];
DatagramPacket packet = new DatagramPacket(buf , buf.length);
Msocket.receive(packet);
byte [] buf2 = new byte [128];
DatagramPacket packet2 = new DatagramPacket(buf2 , buf2.length , groupAddress , multicastPort);
Msocket.send(packet2);
Funziona cosi?