ClientStoAspettando.java
/* 
 * Andrea Caravano (www.andreacaravano.net) 
 * 
 * Esercizio 2: "StoAspettando" 
 * Descrizione: Progettare un’applicazione Client/Server Multithread in Java che attenda, per ogni client collegato, 
 * un numero non precisato di stringhe. L’invio del client termina quando la stringa ricevuta dal server 
 * corrisponde a “FINE-INVIO”. 
 * Prima di concludere la comunicazione, vengono inviate nuovamente al client le stringhe ricevute, trasformate 
 * in maiuscolo. 
 * 
 * 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;

public class ClientStoAspettando {

    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);
        String stringaClient = " ";
        while (stringaClient.equals("FINE-INVIO") == false) {
            System.out.print("Immetti la stringa da inviare al server: ");
            stringaClient = S.nextLine();
            PW.println(stringaClient);
        }
        PW.println(stringaClient);
        S = new Scanner(BR.readLine());
        int contaStringhe = S.nextInt();
        System.out.println();
        System.out.println("Stringhe ricevute dal server: ");
        for (int i = 0; i < contaStringhe; i++) {
            String stringaRicevuta = BR.readLine();
            System.out.println(stringaRicevuta);
        }
    }
}