[:it]Nel progetto del paragrafo precedente per la gestione di una chat, il programma server gestisce soltanto una connessione per volta. Solo quando il client si scollega, il programma server si mette in attesa di nuove connessioni.
Usando i thread, il programma server può aprire più connessioni contemporaneamente e gestire contemporaneamente più programmi client.
Realizzare un’applicazione C/S in cui il programma server gestisce un elenco di numeri di telefono. Ogni programma client si collega al server, comunica il nome di una persona e ottiene come risposta il numero di telefono. Se il numero non esiste viene inviato dal server un messaggio di nome non trovato. Il programma server deve poter accettare contemporaneamente più connessioni e servire più programmi client.
La rubrica telefonica è memorizzata in un file di testo agenda.txt, che supponiamo già disponibile e che contiene per ogni riga un nome e un numero di telefono separati dal punto e virgola.
Mario;02672727
Bianca;068382928
Francesca;33877778899
Valerio;33911112222
Il programma server utilizza la classe Contatto:
Il ciclo principale del codice del programma server concorrente (o multiutente) è il seguente:
while (true) {
connessione = sSocket.accept();
new Utente(connessione);
}
Ogni volta che un nuovo client si collega, viene creato un oggetto di classe Utente. Questa classe implementa l’interfaccia Runnable ed è quindi in grado di generare un thread che viene eseguito in modo asincrono.
Il programma server può ricevere nuove connessioni mentre i thread si preoccupano di gestire le connessioni con i client, inviando e ricevendo i dati.
Il programma server completo è riportato di seguito.
La classe Utente, che fa parte del codice del programma server, implementa le seguenti operazioni:
• apre i flussi in uscita e in ingresso dalla socket;
• riceve il nome dal client;
• effettua una ricerca sequenziale sul file agenda.txt;
• invia al client il numero di telefono oppure un messaggio di non trovato;
• chiude la connessione.
Il programma client presenta il seguente listato:
[:]