Progetto e Realizzazione di un servizio di Chat Progetto di: Nicoli Leonardo Corso di: Reti di Calcolatori L-S Obiettivi Realizzare una applicazione basata su un modello di comunicazione più evoluto del Client/Server in particolare: Comunicazione via CHAT di utenti P2P Requisiti Ogni utente deve avere la possibilità di: Collegarsi ad un gruppo di utenti che comunicano via chat, Inviare messaggi a tutti gli utenti in chat, Ricevere messaggi da tutti gli utenti in chat, Uscire da un gruppo di chat. Inoltre… Realizzare un Server che gestisca l’elenco degli utenti attualmente in chat Struttura del sistema Comunicazione UNO a MOLTI: Come interconnettere gli utenti? • Multicast • Ogni utente con tutti gli altri • Anello M1 M1 B A C D M1 M1 Struttura del sistema • Ogni nodo ha visibilità totale dell’anello Tutti conoscono tutti Possibilità di invio di Messaggi Privati • Canali punto-punto come Connessioni TCP Possibili messaggi di conferma ricezione Preservano l’ordine dei messaggi Inizializzazione utente può entrare e uscire dalla chat Anello fortemente dinamico nodo deve poter accettare richieste di connessione Per inserire nuovi utenti che si vogliono unire alla chat Per richiudere l’anello dopo l’uscita di un utente dalla chat Inizializzazione Necessità di un Server che fornisca all’utente che vuole inserirsi l’indirizzo di uno degli utenti in chat da contattare Server Gruppo X Client IP:Porta Gruppo 1: …. Gruppo 2: …. Protocolli info Server •Richiesta informazioni •Iscrizione a un gruppo Client Ci sono n gruppi: 1: ……… 2: ………. ……….. n: ……….. Server Gruppo X Nome: Tizio Server Client IP:123.145.78.15 Porta:2563 Protocolli Ingresso nel gruppo Tizi o Tizio: Inserito Sempronio Ip: …. Porta:…. Caio Semproni o Ip: ….. Porta: … Client Uscita dal gruppo fine Tizio: Inserito Sempronio Ip: …. Porta:…. Caio, Ip, porta siamo in n Tizio ip porta, …….. fine fine Tizio Semproni o Caio fine Tolleranza ai guasti Canali punto-punto Bidirezionali Ad ogni invio di messaggio si attende la conferma di avvenuta ricezione per un certo tempo Se scatta il Timeout rilevata caduta del nodo Apertura connessione con il successivo (chiusura anello) Invio messaggio di notifica Cancellazione dal Server dell’utente caduto Scalabilità Introduzione di un servizio di Nomi per poter avere diversi Server reperibili dagli utenti attraverso nomi logici Registra www.chatter.it IP : Porta Gestore Nomi OK Server Cerca www.chatter.it IP : Porta Client Implementazione in Java Utilizzo del package java.net Utilizzo del servizio di Nomi di Ambra Molesini • Server parallelo ServerSocket in attesa di connessioni e un Thread generato per ogni Cliente • Client Multithreaded un thread in ascolto sulla ServerSocket, uno sulla socket di ingresso, e uno sull’interfaccia grafica Implementazione del singolo nodo 2 uscite dove accedere in scrittura in mutua esclusione (Socket e Pannello) ed elenco ordinato degli utenti in chat. Interfaccia grafica Elenco utenti Listener CLIENT Demone Client Socket di Uscita Server Socket Rice Thread Socket di Ingresso Messaggi Ogni nodo elimina i propri messaggi Tutti i messaggi devono avere: dopo un giro dell’anello • Nome del Mittente • Flag di Visibilità Messaggio Pubblico o Privato • Contenuto testuale messaggi Privati devono inoltre avere: • Nome del Destinatario messaggi di Sistema (Notifica eventi) devono avere come contenuto: Ingresso: Caduta: • Keyword distintiva • Informazioni aggiuntive: IP, Porta, e Nome Nome dell’utente dell’utente andato in che entra crash Possibili sviluppi futuri • Utenti in chat che potrebbero RIFIUTARE l’ingresso di un nuovo utente • L’utente che entra potrebbe esprimere PREFERENZE sulla sua posizione nell’anello • Messaggi di contenuto non solo testuale: Scambio di file, oppure dati Multimediali (gli utenti si Vedono tramite webcam) • Crittografia per aumentare sicurezza dei messaggi privati Conclusioni • Sistema Efficiente, Funzionale, e Semplice da usare • Nodi Autonomi, che funzionano Senza distinzioni di ruolo • Possibile realizzare con questa struttura applicazioni Complesse, Dinamiche, Flessibili ed Affidabili