/* * Andrea Caravano (www.andreacaravano.net) * * Esercizio 4: "Linate" * Descrizione: Il recente processo di ristrutturazione dell’aeroporto di Milano Linate, ha causato un * insolito aumento dei passeggeri nell’aeroporto, causando un incremento del numero di hostess e * manager del check-in che, parallelamente, si occupano di modificare i dettagli di un volo in partenza. * Nel problema proposto, le hostess sono rappresentate due Thread che operano solo quando non stanno operando i * due altri Thread assegnati ai manager del check-in. * Si sottolinea, tuttavia, che le hostess e i manager del check-in, possono operare contemporaneamente * tra di loro, gestendo la modifica dei parametri del volo mediante apposite strutture di gestione della mutua esclusione. * I dettagli del volo su cui operano i due gruppi di Thread sono i seguenti: * 1) Località di partenza: Milano Linate * 2) Località di arrivo: Roma Fiumicino * 3) Data e orario del volo: 18/12/2019 – 09:50 * 4) Incremento di un unità del numero di passeggeri (numero iniziale = 0) * Il server inizia la propria attività solo quando tutti e 4 i client sono connessi. * Attraverso un menù di scelta (che includa anche la possibilità di chiusura della connessione), il client decide * quale operazione attuare e lo comunica al server, che si occuperà di fornire opportuna risposta di conferma. * Si suppone non vi siano vincoli di precedenza. Il primo gruppo di processi che viene avviato, da avvio alle * operazioni di modifica. * * Possibile soluzione * Componente Client * * N.B.: L'esercizio scaturisce dalla sola fantasia dell'autore e intende rappresentare una applicazione didattica. * I dettagli in esso contenuti potrebbero non essere corrispondenti alla realtà e intendono valutare le abilità nella gestione delle strutture dati proposte. */ import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; class Volo { public String localitaPartenza, localitaArrivo, dataVolo; public int numeroPasseggeri; Volo(String localitaPartenza, String localitaArrivo, String dataVolo, int numeroPasseggeri) { this.localitaPartenza = localitaPartenza; this.localitaArrivo = localitaArrivo; this.dataVolo = dataVolo; this.numeroPasseggeri = numeroPasseggeri; } } public class ClientLinate { static final String INDIRIZZOSERVER = "127.0.0.1"; static final int PORTASERVER = 9000; public static void main(String[] args) { try (Socket processoClient = new Socket(INDIRIZZOSERVER, PORTASERVER)) { System.out.format("Connesso al processo server avviato con il seguente indirizzo di socket: %s%n", processoClient.getRemoteSocketAddress()); System.out.format("Processo client avviato con il seguente indirizzo di socket: %s%n", processoClient.getLocalSocketAddress()); avviaComunicazione(processoClient); } catch (UnknownHostException e) { System.err.println("Server non contattabile. Possibile errore di immissione."); } catch (IOException e) { System.err.format("Errore connessione con server: %s%n", e.getMessage()); } } private static void avviaComunicazione(Socket processoClient) throws IOException { BufferedReader BR = new BufferedReader(new InputStreamReader(processoClient.getInputStream(), "UTF-8")); PrintWriter PW = new PrintWriter(new OutputStreamWriter(processoClient.getOutputStream(), "UTF-8"), true); Scanner S = new Scanner(System.in); System.out.println("AEROPORTO DI MILANO LINATE"); System.out.println("=========================="); System.out.println(); System.out.println("In attesa di iniziare la propria attività..."); System.out.println(); System.out.println("Benvenuto!"); while (BR.readLine().equals("100")) { System.out.println(); System.out.println("Di seguito, le possibili scelte: "); System.out.println("1) Modifica della località di partenza"); System.out.println("2) Modifica della località di arrivo"); System.out.println("3) Modifica dell'orario del volo"); System.out.println("4) Aggiunta di un passeggero"); System.out.println("5) Esci"); System.out.println(); System.out.print("Scelta: "); int scelta = S.nextInt(); S.nextLine(); PW.println(scelta); String risposta = BR.readLine(); if (risposta.equals("405")) { System.err.println("Metodo non consentito. Chiusura della comunicazione..."); break; } else if (risposta.equals("100")) { if (scelta == 1) { System.out.print("Inserisci la nuova località di partenza: "); PW.println(S.nextLine()); } else if (scelta == 2) { System.out.print("Inserisci la nuova località di arrivo: "); PW.println(S.nextLine()); } else if (scelta == 3) { System.out.print("Inserisci la nuova data del volo: "); PW.println(S.nextLine()); } risposta = BR.readLine(); if (risposta.equals("200")) { System.out.println("Modifica accettata."); } else if (risposta.equals("202") && scelta == 5) { System.out.println("Richiesta di chiusura della comunicazione accettata."); break; } } else System.err.println("Errore nella comunicazione."); } } }