ClientTiHoColpito.java
/* 
 * Andrea Caravano (www.andreacaravano.net) 
 * 
 * Esercizio 1: "TiHoColpito" 
 * Descrizione: Progettare un applicazione Client/Server in Java che, a seguito dell’invio, da parte del client, 
 * di una stringa di testo contenente una lettera dell’alfabeto americano e un numero, separati da un Whitespace (es: C 6), 
 * invii, in maniera casuale, una tra le due seguenti stringhe: 
 * - “Colpito!” 
 * - “Mancato, ritenta!" 
 * Prima dell’invio, validare la correttezza della struttura dati e, se non valida, inviare al client una stringa vuota. 
 * La comunicazione termina con l’invio, da parte del client, di una stringa vuota. 
 * 
 * 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 ClientTiHoColpito {

    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;
        try {
            System.out.print("Indicare le coordinate da consegnare al client, separate da Whitespace: ");
            S = new Scanner(System.in);
            String letturaScanner = S.nextLine();
            while (letturaScanner.isEmpty() == false) {
                S = new Scanner(letturaScanner);
                String lettera = S.next();
                int numero = S.nextInt();
                PW.println(String.format("%s %d", lettera, numero));
                String risposta = BR.readLine();
                if (risposta.isEmpty()) {
                    throw new Exception();
                } else {
                    System.out.format("Risposta del server: %s%n", risposta);
                }
                System.out.print("Indicare le coordinate da consegnare al client, separate da Whitespace: ");
                S = new Scanner(System.in);
                letturaScanner = S.nextLine();
            }
            PW.println("");
        } catch (Exception e) {
            System.err.println("Errore nell'immissione dati. Riprova.");
            PW.println(""); // Indico al server, come previsto dal protocollo, la volontà di chiudere la comunicazione.
        }
    }
}