Snippets
Andrea Caravano Esercizio "StudioMedico" dalla raccolta degli esercizi riassuntivi in Java: Socket in TCP e programmazione concorrente
Created by
Andrea Caravano
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | /*
* 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.");
}
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /*
* 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 Server
*
* 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.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Paziente {
private 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 String stampaPaziente() {
StringBuilder SB = new StringBuilder();
SB.append(String.format("Cognome: %s%n", cognome));
SB.append(String.format("Nome: %s%n", nome));
SB.append(String.format("Data di nascita: %s%n", dataNascita));
SB.append(String.format("Città di nascita: %s", cittaNascita));
return SB.toString();
}
}
public class ServerStudioMedico {
static final int PORTALISTEN = 9000;
static ExecutorService esecutore = Executors.newCachedThreadPool();
public static void main(String[] args) {
try (ServerSocket procServer = new ServerSocket(PORTALISTEN)) {
System.out.format("Processo server avviato con il seguente indirizzo di socket: %s%n", procServer.getLocalSocketAddress());
while (true) {
try {
Socket tempSocket = procServer.accept();
esecutore.execute(() -> {
try (Socket varClient = tempSocket) {
System.out.format("Thread ID = %d - Indirizzo di socket del client: %s%n", Thread.currentThread().getId(), varClient.getRemoteSocketAddress());
avviaComunicazione(varClient);
} catch (IOException e) {
System.err.format("Errore di avvio della comunicazione: %s%n", e.getMessage());
}
});
} catch (IOException e) {
System.err.format("Errore nella creazione di nuovi socket: %s%n", e.getMessage());
}
}
} catch (IOException e) {
System.err.format("Errore lato server: %s%n", e.getMessage());
}
}
private static void avviaComunicazione(Socket varClient) {
try (
BufferedReader BR = new BufferedReader(new InputStreamReader(varClient.getInputStream(), "UTF-8"));
PrintWriter PW = new PrintWriter(new OutputStreamWriter(varClient.getOutputStream(), "UTF-8"), true)
) {
String nomeUtente = BR.readLine();
String password = BR.readLine();
BufferedWriter BW = null;
if (new File(String.format("%s.txt", nomeUtente)).exists()) {
Scanner S = new Scanner(new FileReader(String.format("%s.txt", nomeUtente)));
if (nomeUtente.equals(S.nextLine()) && password.equals(S.nextLine())) {
PW.println("100"); // Tratto da HTTP: "Continue"
} else {
varClient.close();
throw new IOException("Nome utente o password errati.");
}
} else {
BW = new BufferedWriter(new FileWriter(String.format("%s.txt", nomeUtente)));
BW.write(String.format("%s%n", nomeUtente));
BW.write(String.format("%s%n", password));
BW.close();
PW.println("201"); // Tratto da HTTP: "Created"
}
int sceltaUtente = Integer.valueOf(BR.readLine());
BW = new BufferedWriter(new FileWriter(String.format("%s.txt", nomeUtente), true));
if (sceltaUtente == 1) {
Scanner datiPaziente = new Scanner(BR.readLine());
Paziente p = new Paziente(datiPaziente.next(), datiPaziente.next(), datiPaziente.next(), datiPaziente.next());
BW.write(p.toString());
PW.println("200"); // Tratto da HTTP: "OK"
BW.close();
} else if (sceltaUtente == 2) {
BW.close();
Scanner S = new Scanner(new FileReader(String.format("%s.txt", nomeUtente)));
S.nextLine();
S.nextLine();
// Salto due righe, trattandosi di nome utente e password, che non mi interessa leggere.
while (S.hasNext()) {
Paziente p = new Paziente(S.next(), S.next(), S.next(), S.next());
PW.println(p.stampaPaziente());
}
PW.println("");
} else {
PW.println("405"); // Si adotta, come in HTTP, il codice 405 (Method Not Allowed), indicante la scelta non valida.
}
} catch (IOException e) {
System.err.format("Errore di I/O: %s%n", e.getMessage());
}
}
}
|
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.