ClientStudioMedico.java
/* 
 * Andrea Caravano (www.andreacaravano.net) 
 * 
 * Esercizio 3: "StudioMedico" 
 * Descrizione: Uno studio medico ha adottato un infrastruttura di rete che prevede che, per ogni medico, 
 * esista un file di testo contenente le informazioni personali (nome, cognome, data di nascita e città di nascita) dei pazienti in cura (si suppone tali informazioni non contengano spazi e siano separate da Whitespace). 
 * Ogni medico, in seguito ad autenticazione mediante nome utente e password (memorizzate su linee 
 * separate all’inizio del file), può effettuare due operazioni: 
 * 1)   Aggiunta nuovo paziente in cura 
 * 2)   Consultazione elenco completo dei pazienti 
 * N.B.: Se il nome utente specificato dal client non esiste, si utilizzano il nome utente 
 * specificato per creare un nuovo file, corrispondente al nuovo medico. 
 * Un possibile file di esempio è il seguente: 
 * <file “rossi.txt”>: 
 * mario 
 * passwordmario 
 * Giuseppe Verdi 01/02/1980 Milano 
 * Carlo Russo 03/04/1990 Roma 
 * 
 * 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 Paziente {
    public String cognome, nome, dataNascita, cittaNascita;

    Paziente(String cognome, String nome, String dataNascita, String cittaNascita) {
        this.cognome = cognome;
        this.nome = nome;
        this.dataNascita = dataNascita;
        this.cittaNascita = cittaNascita;
    }

    @Override
    public String toString() {
        return String.format("%s %s %s %s%n", cognome, nome, dataNascita, cittaNascita);
    }
}

public class ClientStudioMedico {

    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("STUDIO MEDICO");
        System.out.println("=============");
        System.out.print("Nome utente: ");
        PW.println(S.nextLine());
        System.out.print("Password: ");
        PW.println(S.nextLine());
        String risposta = BR.readLine();
        if (risposta.equals("100") || risposta.equals("201")) {
            System.out.println("Scelte possibili:");
            System.out.println("1) Aggiungi un paziente");
            System.out.println("2) Ottieni i dati di tutti i pazienti");
            System.out.println();
            int scelta;
            boolean errore;
            do {
                System.out.print("Scelta: ");
                scelta = S.nextInt();
                errore = !(scelta == 1 || scelta == 2);
                if (errore) {
                    System.out.println("Errore. La scelta deve essere 1 oppure 2");
                }
            }
            while (errore);
            PW.println(scelta);
            if (scelta == 1) {
                System.out.print("Indica, separati da whitespace, i dati del paziente: ");
                Paziente p = new Paziente(S.next(), S.next(), S.next(), S.next());
                PW.println(p.toString());
                if (BR.readLine().equals("200"))
                    System.out.println("Paziente registrato.");
                else
                    System.out.println("Errore di immissione e registrazione. Ritenta.");
            } else {
                System.out.println();
                System.out.println("Elenco pazienti: ");
                System.out.println();
                String stringaRicevuta = BR.readLine();
                while (stringaRicevuta.isEmpty() == false) {
                    for (int i = 0; i < 4; i++) {
                        System.out.println(stringaRicevuta);
                        stringaRicevuta = BR.readLine();
                    }
                    System.out.println();
                }
            }
        } else {
            throw new IOException("Nome utente o password errati.");
        }
    }
}