Domanda Esercizio Multiserver Java da risolvere

Programmer0434

Utente Iron
31 Marzo 2022
1
1
0
4
Ultima modifica:
Buon pomeriggio, sono alle prese con il seguente esercizio che, per quanto ci provi, non riesco a capire. Premesso che non sia una cima con i socket vorrei capire come andrebbe sviluppato questo esercizio, se qualche buon anima può darmi una mano ve ne sarei davvero grato. Ecco il testo dell'esercizio:
"Realizza un'applicazione che simuli una lotteria di 90 numeri; alcuni giocatori si collegano e acquistano alcuni numeri (per es. 5) estratti casualmente dal server: quando si raggiunge un numero adeguato di giocatori (almeno 4) e non avvengono successive connessioni per almeno 60 secondi il server provvede alle estrazioni di 5 premi, comunicando ai giocatori l'esito della estrazione; a loro volta i client se hanno un numero vincente lo segnalano al server."
PS. Da noi é solito dividere, in base alla loro utilità, in classi (es. public class Server, public class Client ecc.). Grazie mille per la pazienza e per l'aiuto
 
Ciao, non so se ti serva ancora questa cosa, ma provo a spiegarti in parole povere, almeno per me, su come dovresti agire per risolvere il tutto.
Le connessioni socket a basso livello, anche in Java, sono sempre un bagno di sangue se gestite male.

Dovrai gestirti lato server, un thread che sia sempre attivo, che tenga una socket con una connessione sempre aperta, pronta ad accettare nuove connessioni, senza aspettare che il server accetti la connessione, ma connessione diretta.
Il dialogo tra il server e i client si svolgerà sostanzialmente sempre in modo alternato con un messaggio ricevuto ed uno inviato, botta e risposta tra server e client.

Questa immagine ti potrà aiutare a capire meglio.

1668302926301.png



Ti consiglio di dividerti tutte le richieste in sotto problemi ed utilizzare varie classi, dove ognuna svolge il proprio ruolo.

1) Sul codice del server, ti tieni un contatore, di tutte le connessioni che ti arrivano in ingresso, salvandoti rispettivamente l'IP e l'ID socket in un array, una lista, una mappa o ciò che più preferisci.

2) I client fanno una richiesta al server di pescare un numero, magari una getNumber semplicissima, dove il server gli invia un numero casuale (segnati i numeri inviati per far sì che il server non invii due volte lo stesso numero al client o agli altri client).

3) Siccome c'è la richiesta di avere almeno 4 giocatori connessi per 60 secondi, prima di lanciare il match con i numeri, c'è bisogno di un altro thread, che faccia un ping alle socket connesse, di durata di pochi secondi, poiché una socket potrebbe disconnettersi in modo forzato e il server potrebbe non accorgersene in tempo, ti servirà per avere il counter aggiornato dei giocatori connessi.

4) Un altro thread che scatta non appena le connessioni sono 4, facendo avviare un timer.
Effettuando però un controllo ogni secondo sulla variabile counter che potrebbe essere eventualmente aggiornato, in quel caso bisogna stopparlo se le connessioni scendono al di sotto di 4, oppure in caso di nuova connessione e quindi maggiore di 4, di riavviare il timer.

5) Quando si arriva ai 60 secondi, puoi far mandare un segnale dal server, con la lista dei numeri vincenti (magari anteponi quando invii il messaggio, una stringa che fa sì che i client capiscano che è quella dell'estrazione del premio, con cui fare il confronto).

6) Il client farà un confronto tra i numeri ricevuti dal server, con i propri, se c'è qualcuno di vincente puoi dargli una stringa con scritto WIN seguito dal numero, oppure solamente il numero, ma è necessario che i client comunichino al server anche che non abbiano nessun numero uguale, questo perché potrebbe portare al server che resta in attesa dei client che gli inviino una risposta sul confronto dei numeri.

Spero di averti aiutato un minimo a fare un po' di mente locale sul da farsi.

Ciao!!