Piero V.

Socket e thread in Python

Chi è interessato a sviluppare un’applicazione che utilizzi in un modo anche semplice la rete deve spesso documentarsi sulle socket, in qualsiasi linguaggio di programmazione, anche per il python.

In questo campo ho lavorato più di una volta, però mi sono limitato alla creazione di socket con una sola connessione alla volta.

Tuttavia non è molto utile: penso che la maggior parte delle applicazioni pratiche richiedano più di un client connesso e “addirittura” la possibilità di dialogare tra di loro.

Quindi intervengono i thread.

Non so darvi la spiegazione tecnica di cosa siano, però so darvi una spiegazione pratica: i thread permettono di eseguire contemporaneamente più operazioni, senza però creare un altro processo. Il vantaggio è che si ottiene il famoso multi tasking.

Documentandomi ho trovato che uno degli svantaggi è che non avviene il controllo sull’uso contemporaneo di alcune risorse come file, tuttavia in questo caso usiamo solo la RAM e perciò non ci poniamo il problema.

In python usare i thread è abbastanza semplice: una volta importato il modulo threading o solamente la classe Thread da esso, bisogna estenderla e fare una funzione chiamata run in cui bisogna mettere il codice da eseguire.

Tornando all’argomento delle socket il mio obbiettivo era inviare con una connessione del contenuto e farlo leggere a tutti gli altri client connessi, insomma, una specie di chat, ma molto basilare, infatti non metto neanche chi ha inviato cosa.

Per fare ciò ho preso il codice di esempio delle socket ma ho fatto sì che quando un client si connettesse, il programma creasse un thread da dedicargli.

Così ho creato una classe che estendeva threading.Thread chiamata client e ho salvato ogni istanza in un dizionario, usando come chiavi l’md5 di indirizzo IP:porta. In realtà l’md5 non è necessario, però mi consente di avere chiavi di una determinata lunghezza.

Vi allego lo script. È basato sugli esempi della documentazione ufficiale di python. Penso che perciò non ci siano problemi se lo rilascio nel pubblico dominio.

Tenete conto che in Python programmo poco, perciò il codice è quello che è. Inoltre dovrei migliorare la parte della disconnessione dei client.