ChatTCP Wiki - Umberto-Cazzuola-Peano-5A/chatTCP GitHub Wiki

CHAT TCP

Il progetto (chatTCP) permette a più client, collegati ad un unico server, di comunicare tra loro; simulando una chat. La chat permette l'invio e la ricezione di più messaggi da più utenti. Il server deve gestire i client che si collegano e inviare a quest'ultimi i messaggi che lui stesso riceve da un solo utente. Invece il client deve rimanere sempre in ascolto, anche se non invia nulla, perché attraverso il server può ricevere messaggi da altri client.

DIFFERENZA CON UDP

TCP e UDP sono due protocolli utilizzati per l'invio di dati. Il più affidabile è il TCP, che garantisce una completa sicurezza. Il protocollo TCP verifica sempre che il destinatario abbia ricevuto i "dati" mentre l'UDP, al contrario, non controlla pienamente gli errori ma è rispettivamente più veloce nella comunicazione. Inoltre TCP è un protocollo orientato alla connessione, ovvero prima di poter trasmettere dati deve stabilire la comunicazione tra mittente e destinatario, che rimane attiva anche in assenza di scambio di dati e viene chiusa quando non più necessaria. Al contrario UDP si occupa solo di inviare datagrammi (DatagramPacket); è senza connessione.

CLIENT

Il progetto clientTCP è composto da 2 classi: clientTCP e Listener

La classe Listener permette al client una volta inviato un messaggio di mettersi in ascolto per ricevere messaggi che potrebbero arrivare da altri Client o dal Server

// connetti al socket per poter leggere i dati che arrivano al Client // (client <-- server) BufferedReader in = null; try{ in = new BufferedReader(new InputStreamReader(client.getInputStream())); } catch (IOException e) { System.out.println("IO Error!!!"); System.exit(-1); }

La classe clientTCP è la classe principale del progetto e permette al Client di connettersi al Server usando i Socket, di mettersi in ascolto attraverso i Thread e di inviare messaggi al server.

Vengono dichiarati indirizzo IP e porta:

String hostName = "127.0.0.1"; int portNumber = 1234;

Viene creato un socket e gli vengono assegnati indirizzo IP e porta:

// prendi l'indirizzo IP del server dalla linea di comando InetAddress address = InetAddress.getByName(hostName);

Viene effettuata una connessione concorrente al socket e una volta che il testo da linea di comando viene acquisito viene inviato al Server:

Listener l; try { l = new Listener(clientSocket); Thread t = new Thread(l); t.start(); } catch (Exception e) { System.out.println("Connessione NON riuscita con server: "); }

SERVER

Il progetto serverTCP è composto da 3 classi: serverTCP, MessageManager e socketWorker

La classe MessageManager salva l'ultimo messaggio ricevuto e lo invia a tutti i socketWorkers che lo inviano a loro volta a tutti i Client attraverso:

synchronized void sendNewMessaggio(String m) { //aggiorna l'ultimo messaggio nella variabile dell'oggetto this.messaggio = m; //chiedi ad ogni worker di inviare il messaggio ricevuto for (SocketWorker worker: this.workers) { worker.sendMessaggio(this.messaggio); }

La classe socketWorker rappresenta il "Lavoratore" di ogni client e gestisce la connessione tra il Client e il server, in questa classe vengono usati i Thread. Qui viene creata la connessione con il socket per ricevere ed inviare il testo

BufferedReader in = null; try{ // connessione con il socket per ricevere (in) e inviare(out) il testo // da/al client connesso in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); } catch (IOException e) { System.out.println("Errore: in|out fallito"); System.exit(-1); }

Qui il socket viene messo in attesa di ricevere un messaggio in input e una volta ricevuto lo invia al Server.

//mi metto in attesa di ricevere un nuovo messaggio da client line = in.readLine(); //il nuovo messaggio e' stato ricevuto e lo andiamo ad inserire //nella variabile "messaggio" della classe EventoReceiver //il quale aggiornera' la variabile e richiedera' l'invio a ogni //Worker, ognuno al proprio client messaggioReceived(line); //scrivi messaggio ricevuto su terminale System.out.println(clientPort + ">> " + line); } catch (IOException e) { System.out.println("lettura da socket fallito"); System.exit(-1);

La classe ServerTCP è la classe principale del progetto ed è la classe in cui viene dichiarata la porta del Server:

int portNumber = 1234; //porta a cui il server si mettera' in ascolto