//Progetto Ingegneria del Software
//Autore: Ignazio Coco
//Matricola: 616/000075
import java.io.*;
import java.net.*;
/**
* Classe che implementa il lato client dell"applicazione
* @author Ezio
*/
public class Talk {
/**
* Questo parametro permette di impostare il programma in modalità
* di debug. Ciò comporta la visualizzazione di tutti i messaggi
* durante la fase di esecuzione
*/
private static boolean debug=true;
/**
* identifica l"utente con cui si vuuole instaurare la connessione
*/
static String utente;
/**
* identifica l"indirizzo Ip dell"utente a cui ci vuole connettere
*/
static String indirizzoIp;
/**
* indentifica la porta dell"utente a cui ci si vuole connettere
*/
static int porta;
/**
* stream verso l"utente a cui ci si è connessi
*/
static DataOutputStream streamConnOut;
/**
* variabile usata per mantenere i riferimenti alle socket,
* prima del server dei nomi, poi dell"utente con il quale si vuole
* chattare
*/
static public Socket socket;
/**
* mantiene l"indirizzo Ip del server dei nomi
*/
static String indIp;
/** Creates a new instance of Talk */
public Talk() {
}
/**
* metodo usato per disconnettersi dall"utente con cui si dialoga
* @return Ritorna 0 o -1 nel caso in cui l"operazione abbia avuto
* successo o meno
*/
static int disconnect() {
try {
socket.close();
streamConnOut.close();
return 0;
}
catch (IOException e) {
if (debug) System.out.println("Errore durante il tentativo di disconnessione dal server");
if (debug) System.out.println(e);
return -1;
}
}
/**
* Avvia prima una connessione col server dei nomi, cercando di ottenere
* l"ip associato all"utente.
* Successivamente instaura la connessione verso l"utente
* @param nomeUtente Il nome dell"utente a cui ci si vuole connettere
* @return 0: l"operazione ha avuto esito positivo
* -1: l"operazione ha generato un errore
* -2: l"utente non è online
*/
static int connect(String nomeUtente) {
if (debug) System.out.println("Inizio connect server nomi");
if (debug) System.out.println("Instaurazione socket - server nomi");
try {
socket = new Socket(indIp, 5555);
}
catch (UnknownHostException e) {
if (debug) System.out.println("Errore host sconosciuto");
if (debug) System.out.println(e);
return -1;
}
catch (IOException e) {
if (debug) System.out.println("Errore I/O su socket - server nomi");
if (debug) System.out.println(e);
return -1;
}
if (debug) System.out.println("Apertura stream - server nomi");
try {
streamConnOut = new DataOutputStream(socket.getOutputStream());
streamConnOut.writeBytes("retrieveIp:"+nomeUtente + "\n");
DataInputStream is = new DataInputStream(socket.getInputStream());
String mess = is.readLine();
if ((mess.substring(0,3)).equals("###")) return -2;
String tmp[] = mess.split(":");
if (debug) System.out.println("Messaggio ricevuto: "+mess);
indirizzoIp=tmp[1];
porta=Integer.parseInt(tmp[2]);
is.close();
streamConnOut.close();
socket.close();
}
catch (IOException e) {
if (debug) System.out.println("Errore I/O su stream - server nomi");
if (debug) System.out.println(e);
return -1;
}
if (debug) System.out.println("Inizio connect");
if (debug) System.out.println("Instaurazione socket");
try {
socket = new Socket(indirizzoIp, porta);
}
catch (UnknownHostException e) {
if (debug) System.out.println("Errore host sconosciuto");
if (debug) System.out.println(e);
return -1;
}
catch (IOException e) {
if (debug) System.out.println("Errore I/O su socket");
if (debug) System.out.println("IP:" + indirizzoIp + " Porta:" + porta);
if (debug) System.out.println(e);
return -1;
}
if (debug) System.out.println("Apertura stream");
try {
streamConnOut = new DataOutputStream(socket.getOutputStream());
System.out.println("Connesso con " + utente + " IP:" + indirizzoIp + " porta:" + porta);
}
catch (IOException e) {
if (debug) System.out.println("Errore I/O su stream");
if (debug) System.out.println(e);
return -1;
}
if (debug) System.out.println("Connesso!");
return 0;
}
/**
* Metodo usato per inviare un messaggio
* @param message il messaggio da inviare
* @return 0: l"operazione ha avuto esito positivo
* -1: l"operazione ha generato un errore
*/
static int sendMessage(String message) {
try {
streamConnOut.writeBytes(message + "\n");
return 0;
}
catch (IOException e) {
if (debug) System.out.println("Errore durante l"invio del messaggio");
if (debug) System.out.println(e);
return -1;
}
}
/**
* Il metodo principale del programma
* @param args Argomenti da passare al programma, nell"ordine:
* nome, indirizzo Ip del server dei nomi
*/
public static void main(String args[]) {
utente=args[0];
indIp=args[1];
if (utente.equals("")) {
System.out.println("Errore: deve inserire il nome dell"utente");
System.exit(-1);
}
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
if (debug) System.out.println("Connessione...");
int res = connect(utente);
if (res==0) {
if (debug) System.out.println("Connesione avvenuta correttamente");
}
else if (res==-2) {
if (debug) System.out.println("Errore: impossibile trovare l"utente");
System.exit(-1);
}
else {
if (debug) System.out.println("Errore: impossibile connettersi al server dei nomi");
System.exit(-1);
}
String message;
if (debug) System.out.println("Inizio Chat");
while (true) {
try {
System.out.print("Digita:: ");
message = stdIn.readLine();
if (message.equals("")) {
if (disconnect()==0) { if (debug) System.out.println("Disconnessione avvenuta in modo corretto");}
else if (debug) System.out.println("Errore invio messaggio");
System.exit(0);
}
if (sendMessage(message)==0) {
if (debug) System.out.println("Messaggio inviato correttamente");
}
else {
if (debug) System.out.println("Messaggio non inviato");
System.exit(-1);
}
}
catch (IOException e) {
if (debug) System.out.println("Errore I/O in main");
if (debug) System.out.println(e);
System.exit( -1);
}
}
}
}