View Full Version : [java] Datagram e concorrenza.
nuovoUtente86
28-06-2007, 15:25
Mentre conosco bene il Tcp e riesco ad implementare benissimo la concorrenza,ho notato che per quanto riguarda l' UDP lat server non si fa mai utilizzo dei thread come se la concorrenza fosse gia data di default dal protocollo.Mi chiedo come si fa a gestire l' arrivo multiplo di pacchetti sul server?
Il metodo recive() è bloccante?
Grazie.
Mentre conosco bene il Tcp e riesco ad implementare benissimo la concorrenza,ho notato che per quanto riguarda l' UDP lat server non si fa mai utilizzo dei thread come se la concorrenza fosse gia data di default dal protocollo.Mi chiedo come si fa a gestire l' arrivo multiplo di pacchetti sul server?
Il metodo recive() è bloccante?Sì: "This method blocks until a datagram is received.".
Comunque per la concorrenza non credo che ci siano problemi a farla: appena ricevi un pacchetto, crei un nuovo thread passandogli il pacchetto e ritorni ad aspettare un nuovo pacchetto.
Nel thread farai quello che devi fare ed invierai la risposta, se necessaria (nota che nel pacchetto hai le informazioni sul mittente!).
nuovoUtente86
28-06-2007, 16:11
nel codice di molti tutorial c' è qualcosa del genere
while(nn si verifica un' eccezione){
ricevi un pacchetto
rielabora la richiesta
invia il pacchetto}
//questo mi sembra non multithread giusto?
mentre il metodo elabora il pacchetto ,gli altri pacchetti in arrivo vengono accodati o si perdono?
Secondo te la variabile DatagramSocket che dovrebbe essere condivisa fra i tre e il metodo send() in particolare andrebbero protetti con un monitor oppure no,ma in tal caso cosa succede se si verifica :
thread1 fa socket.send(pacchetto1)
thread2fa socket.send(pacchetto2)
?
Nel tcp tale problema nn si pone in quanto il ServerSocket un avolta ricevuto il socket non deve occuparsi piu di nulla.
In realtà si potrebbe anche evitare di condividere il DatagramSocket istanziandone uno uno in ogni thread,che ne pensi?
Ma come mai da nessuna parte ne ho trovato una implementazione multithread?
while(nn si verifica un' eccezione){
ricevi un pacchetto
rielabora la richiesta
invia il pacchetto}
//questo mi sembra non multithread giusto?Esatto. Si chiama server "sequenziale" (o "iterativo").
mentre il metodo elabora il pacchetto ,gli altri pacchetti in arrivo vengono accodati o si perdono?Si accodano (finché possibile). Esiste un buffer. Quale sia la capacità di questo buffer, non lo so. Sicuramente poi è diversa da un sistema operativo all'altro.
Secondo te la variabile DatagramSocket che dovrebbe essere condivisa fra i tre e il metodo send() in particolare andrebbero protetti con un monitor oppure no,ma in tal caso cosa succede se si verifica :
thread1 fa socket.send(pacchetto1)
thread2fa socket.send(pacchetto2)
?Su questo non ne ho idea, dovrei documentarmi.
Nel tcp tale problema nn si pone in quanto il ServerSocket un avolta ricevuto il socket non deve occuparsi piu di nulla.
In realtà si potrebbe anche evitare di condividere il DatagramSocket istanziandone uno uno in ogni thread,che ne pensi?Pure qui dovrei documentarmi. Suppongo che sia fattibile.
Ma come mai da nessuna parte ne ho trovato una implementazione multithread?Dipende ovviamente da cosa si deve fare di preciso, ma per cose "normali" immagino che sia sufficiente un server sequenziale.
nuovoUtente86
28-06-2007, 18:18
un domanda riguardo il TCP:quando il server nn è sul metodo accept(),le richieste di connessione decadono o si incodano?
nuovoUtente86
28-06-2007, 23:27
Si accodano (finché possibile). Esiste un buffer. Quale sia la capacità di questo buffer, non lo so. Sicuramente poi è diversa da un sistema operativo all'altro.
.
Ma dell' occodamneto dei pacchetti se ne occupa il SO o Java o entrambi?
Ciòè arrivano 10 pacchetti sulla porta 10000 è il sistema operativi ad accodarli e poi passarli singolarmente all' applicazione(il programma java in questo caso) oppure il sistema li passa a java che in modo trasparente all' utente(programmatore) li accoda?
un domanda riguardo il TCP:quando il server nn è sul metodo accept(),le richieste di connessione decadono o si incodano?
Ma dell' occodamneto dei pacchetti se ne occupa il SO o Java o entrambi?
Ciòè arrivano 10 pacchetti sulla porta 10000 è il sistema operativi ad accodarli e poi passarli singolarmente all' applicazione(il programma java in questo caso) oppure il sistema li passa a java che in modo trasparente all' utente(programmatore) li accoda?Innanzitutto tieni presente che il TCP è un protocollo con "connessione". Vuol dire che prima che client e server si possano scambiare dei dati, è necessario aprire una connessione, accettata da entrambi. Esiste un protocollo ben preciso, che utilizza un handshake composto da 3 passi.
Pertanto fino a quando la connessione non è accettata dal server (con la accept() ), è solo half-open. Ed esiste un coda che mantiene le connessioni in attesa di accettazione da parte del server. Se la coda è piena, le successive richieste di connessione vengono semplicemente rifiutate.
La dimensione di tale coda (backlog) è parametrabile su ogni singolo server socket, basta leggere la documentazione della funzione listen() (mi sto riferendo alla funzione "nativa" dei socket utilizzabile in "C").
A livello di Java, quando costruisci un ServerSocket, puoi specificare la dimensione del backlog tramite il suo costruttore.
Vedi i link, please:
listen() nativa dei socket: http://msdn2.microsoft.com/en-us/library/ms739168.aspx
ServerSocket (Java): http://java.sun.com/javase/6/docs/api/java/net/ServerSocket.html
TCP: http://en.wikipedia.org/wiki/Transmission_Control_Protocol
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.