Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Selezionare un nodo Host in maniera casuale che invia un pacchetto vuoto in multicast

    Ciao a tutti.

    Sto realizzando una classe Client che effettua una richiesta di calcolo inviando un pacchetto vuoto al gruppo multicast 224.0.0.0 sulla porta 5000.

    Il Client deve selezionare un nodo Host casuale tra quelli che hanno risposto entro 5 secondi.
    La risposta consiste nell'invio da parte dell'Host di un pacchetto vuoto al gruppo multicast.

    Come faccio a selezionare in maniera casuale l'host che ha risposto entro 5 secondi?

    Viene fatto in automatico rimanendo in attesa del pacchetto?

    codice:
    byte [] buf = new byte [128];
    DatagramPacket packet = new DatagramPacket(buf , buf.length);
    multicastSocket.receive(Packet);

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Come faccio a selezionare in maniera casuale l'host che ha risposto entro 5 secondi?
    Ma vuoi prendere il primo host che ha risposto entro 5 secondi .... o uno a caso di quelli che hanno risposto entro 5 secondi?

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Viene fatto in automatico rimanendo in attesa del pacchetto?
    Se N host ti inviano ciascuno un datagram, chiaramente riceverai (potenzialmente, visto che non c'è alcuna garanzia) N datagram. Ovviamente in sequenza, cioè con il receive ne tiri fuori solo uno per volta.
    L'indirizzo del mittente lo puoi sapere dal pacchetto stesso ( getAddress() ).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma vuoi prendere il primo host che ha risposto entro 5 secondi .... o uno a caso di quelli che hanno risposto entro 5 secondi?
    uno a caso di quelli che hanno risposto nei 5 secondi

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    uno a caso di quelli che hanno risposto nei 5 secondi
    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.

    Quindi grosso modo (non ho provato) potresti fare così. Imposti il timeout sul MulticastSocket a 5 secondi. Quindi prendi il tempo corrente in millisecondi e fai una receive. Se ricevi un datagram prima del timeout, prendi il tempo così sai quanto è durato e questa durata la scali dai 5 secondi e reimposti il timeout e così via, finché non hai un timeout o hai esaurito i 5 secondi.
    Alla fine avrai N pacchetti che puoi tenere in una lista. A quel punto estrai un numero casuale 0<=x<N e ne prendi quindi uno a caso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    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?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Alla fine avrai N pacchetti che puoi tenere in una lista. A quel punto estrai un numero casuale 0<=x<N e ne prendi quindi uno a caso.
    Come faccio a mettere i pacchetti in arrivo in una lista?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    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 ?

    Funziona cosi?
    Sì, è così. Da receive() si esce o avendo ricevuto un pacchetto (scritto nel DatagramPacket in argomento) oppure con una eccezione (tra cui come caso particolare SocketTimeoutException se c'è un timeout di tempo finito).
    Altrimenti sta lì in attesa e ovviamente tiene "impegnato" il thread che lo sta eseguendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Come faccio a mettere i pacchetti in arrivo in una lista?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Come faccio a mettere i pacchetti in arrivo in una lista?
    Beh, sono oggetti (DatagramPacket), quindi basta un List<DatagramPacket>. Chiaramente vanno usati DatagramPacket distinti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Beh, sono oggetti (DatagramPacket), quindi basta un List<DatagramPacket>. Chiaramente vanno usati DatagramPacket distinti.
    Cosi?

    codice:
    ArrayList<DatagramPacket> list = new ArrayList<DatagramPacket>();
    Msocket.receive(packet);
    list.add(packet);
    Dovrei poi ricavare quanti elementi ci sono nella lista e poi selezionare un indice a caso .
    Con ArrayList non mi pare ci sia un metodo a riguardo.
    Dovrei utilizzare un'altra struttura?

    codice:
    DatagramPacket packet2 = list.get((int)Math.random()* ?);
    HostAddress = packet2.getAddress();

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.