Multigroup Chat in Python hosted on Raspberry PI - Raimondi Cominesi Simone & Voltolini Pietro - Simone ...
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Multigroup Chat in Python hosted on Raspberry PI a cura di Raimondi Cominesi Simone & Voltolini Pietro 1
Indice Introduzione Settaggio impostazioni Raspberry o Abilitazione protocollo ssh o Abilitazione protocollo ftp o Configurazione Router clientGui.py serverchat.py clientserverchat.py Socket TCP Multiclient 2
Introduzione L’idea di sviluppare il progetto di una chat utilizzando le Socket e il linguaggio Python è nata in seguito all’interesse di approfondire gli argomenti che sono stati trattati durante il corso di Reti. Il nostro intento è stato quello di approfondire la parte delle Socket concentrandoci sulla possibilità di poter realizzare una chat MultiGroup, dove più utenti possono scambiarsi messaggi all’interno di stanze separate, astraendo la semplice chat a stanza singola. A differenza delle socket implementate attraverso il linguaggio C, per spingere oltre la nostra conoscenza e per imparare un nuovo linguaggio di programmazione abbiamo deciso di sviluppare la chat in Python implementando anche una parte di grafica per quanto riguarda i client adottando la libreria Tkinter. Avendo già una conoscenza del Raspberry e del suo sistema operativo Raspbian (Lite) abbiamo voluto creare un server web dove poter ospitare il server della nostra applicazione facendo si che la chat si possa utilizzare non solo a livello locale ma anche a livello globale. Settaggio delle impostazione del Raspberry Innanzitutto abbiamo installato la versione Raspbian (Lite) sul nostro dispositivo, successivamente mediante il terminale e attraverso il comando sudo raspi-config abbiamo selezionato la voce Interfacing Options per poi attivare il protocollo SSH al fine di comandare da esterno il server. 3
Abilitazione protocollo FTP Attraverso i seguenti comandi seguendo una guida online abbiamo installato pure-ftpd andando a creare uno user con relativa password che ci ha consentito di trasferire i vari file da locale al server( attraverso FileZilla) - sudo apt-get install pure-ftpd - sudo groupadd ftpgroup - sudo useradd ftpuser -g ftpgroup -s /sbin/nologin -d /dev/null - sudo mkdir /home/pi/FTP - sudo chown -R ftpuser:ftpgroup /home/pi/FTP - sudo pure-pw useradd upload -u ftpuser -g ftpgroup -d /home/pi/FTP –m - sudo pure-pw mkdb Configurazione Router A questo punto abbiamo fatto l’accesso alle impostazioni del nostro router andando ad assegnare un indirizzo statico al Raspberry, successivamente ci siamo spostati sulle impostazioni di NAT effettuando il port forwarding al fine di assegnare al nostro dispositivo la porta 22 per il protocollo SSH e la porta 21 per il protocollo FTP e la porta 3700 che andiamo ad utilizzare come porta della nostra chat , rendendo cosi accessibile dall’esterno il Raspberry. Per comunicare dall’esterno verso il router abbiamo definito un dominio sfruttando il servizio DynDns che ci consente di connetterci al router senza dover utilizzare il classico indirizzo IP fatto da numeri. 4
ClientGUI.py Utilizzo della libreria grafica Tkinter Tkinter (Tk-interface) è un wrapper (involucro) per Tk, un sottile strato di software orientato agli oggetti fondato su di esso. È la GUI di default di Python, Graphical User Interface (Interfaccia Grafica per l'Utente), ed è integrata in Python fin dalle sue origini. Ha notevoli doti di semplicità e portabilità, ottimi widget. Come canvas per la grafica strutturata, e text per l'editing avanzato del testo; ed è ben documentato sia in linea che in pubblicazioni cartacee. Anche se le interfacce ottenute hanno l'aspetto un po' datato, resta un'ottima scelta per costruire rapidamente interfacce semplici e portabili. La programmazione di GUI è esattamente analoga ad ogni altro tipo di programmazione: sequenze di istruzioni, cicli, fasi condizionali e moduli. La differenza principale consiste nel fatto che nella programmazione di GUI normalmente viene usato un Toolkit (Insieme di attrezzi) ed occorre quindi seguire il modello di programmazione previsto da chi ha prodotto il toolkit. Ogni toolkit ha una sua API, Application Programmer's Interface (una libreria di funzioni specifiche) ed un proprio insieme di regole per la programmazione che il programmatore deve imparare e seguire. Poichè imparare un nuovo toolkit è generalmente più complicato che imparare un nuovo linguaggio di programmazione, è meglio sceglierne uno che funziona per vari linguaggi. Tk, tra l'altro, funziona per Tcl, Perl, Python, Ruby e Lisp. Le applicazioni GUI sono quasi sempre di tipo ad eventi. Ogni programma ad eventi è strutturato come un ciclo che raccoglie gli eventi e li processa. Gli eventi possono essere generati dal sistema operativo, come accade nel caso di praticamente tutti i programmi di tipo GUI. Oppure può essere il programma stesso che va in cerca degli eventi, come accade nei sistemi di controllo embedded, tipo quelli usati nelle macchine fotografiche. 5
Dai seguenti screenshoot acquisiti dal file clientGUI.py si può evincere di come abbiamo il modulo tkinter per gestire la grafica. La funzione window.after() consente di lanciare la funzione up dopo un tot di tempo, mentre la funzione window.mainloop consente di tenere aperta la finestra della chat. L’oggetto frame ci consente di creare un contenitore all’interno della finestra principale. La funzione .pack() ci consente la disposizione degli oggetti all’interno della finestra. 6
Serverchat.py Il file serverchat.py è il server della nostra chat e ci consente lo smistamento dei messaggi in arrivo e in uscita fra le diverse stanze e i vari user all’interno di esse. In questo screenshoot del file serverchat.py possiamo notare la gestione di nuovi utenti che prendono parte alla chat, per evitare di rendere il codice più smart abbiamo deciso di utilizzare un altro file composto da diverse funzioni volte a gestire le stanze e gli utenti. 7
ClientServerChat.py In questo file abbiamo diverse classi contenenti diverse finzioni che ci consentono la gestione delle stanze e degli utenti. Come si può notare dal seguente screen abbiamo deciso di concentrare in questo file diverse funzione sia per la creazioni delle socket (create_socket), sia soprattutto per la gestione delle stanze, cercando cosi di evitare l’ingrombro e la confusione del file server e del file client 8
Socket TCP Multiclient Per sviluppare il nostro progetto abbiamo adottato l’uso di socket bastate sul protocollo TCP che consentissero di gestire più Client. La motivazione fondamentale per la quale non abbiamo utilizzato una socket basata su UDP è che socket di questo tipo possono modificare la sequenza ordinata di pacchetti inviati. Per la creazione della socket per comunicare con il server usiamo la funzione socket(), nella quale sono specificati l’Address Family e SOCK_STREAM per definire un canale di trasmissione bidirezionale, sequenziale e affidabile. Durante la creazione della connessione avviene la seguente sequenza di operazioni: 1. (lato passivo) Il server esegue l'apertura passiva del socket, attraverso le funzioni socket, bind e listen; 2. (lato attivo) Il client richiede l'inizio della connessione (apertura attiva) usando la funzione connect; 3. (lato passivo) Il server accetta la connessione tramite la funzione accept e la sposta su un nuovo socket; 4. (lato passivo e attivo) Invio e ricezione dei dati. La funzione setsockopt permette di forgiare le caratteristiche della socket e tramite la funzione connect inizia la comunicazione. Il server gestisce vari client della chat attraverso la selezione. La funzione select monitora tutti i socket client e il socket master per attività leggibili. Se uno qualsiasi dei socket client è leggibile, significa che uno dei client di chat ha inviato un messaggio 9
A lato server sono fondamentali la funzione bind per assegnare alla socket l’indirizzo IP. Una che la socket è stata creata e gli è stata assegnata una porta, il server per completare la procedura di apertura esegue la funzione listen che consente di settare la lunghezza per le richieste di connessione Infine tramite la funzione accept il server accetta la connessione andando a postare quindi la connessione su un nuovo utente. Una volta completata questa procedura inizia l’invio e la trasmissione dei dati tramite le funzioni send e receive. 10
Puoi anche leggere