Che cos'è la programmazione socket in Python e come padroneggiarla?



Scopri cos'è la programmazione socket in Python insieme alle comunicazioni client-server insieme al trasferimento di oggetti python usando pickle e socket.

Internet è innegabilmente diventata l ''Anima dell'Esistenza' e la sua attività è caratterizzata da 'Connessioni' o 'Reti'. Queste reti sono rese possibili utilizzando uno dei fondamenti più cruciali di Prese. Questo articolo copre tutte le aree relative alla programmazione socket in Python. I socket ti aiutano a fare queste connessioni, mentre , senza dubbio, lo rende facile.

Diamo una rapida occhiata a tutti gli argomenti trattati in questo articolo:





Perché usare i socket?
Cosa sono i socket in Python?
Come ottenere la programmazione Socket in Python
Cos'è un server?
Cos'è un cliente?
Echo Client-Server
Comunicazioni multiple
Trasferimento di oggetti Python



Perché usare i socket?

I socket sono la spina dorsale del networking. Rendono possibile il trasferimento di informazioni tra due diversi programmi o dispositivi. Ad esempio, quando apri il browser, come client stai creando una connessione al server per il trasferimento delle informazioni.

convertitore da binario a decimale java

Prima di approfondire questa comunicazione, vediamo prima cosa sono esattamente queste prese.

Cosa sono i socket?

In termini generali, i socket sono endpoint interni creati per inviare e ricevere dati. Una singola rete avrà due prese, una per ogni dispositivo o programma di comunicazione. Questi socket sono una combinazione di un indirizzo IP e di una porta. Un singolo dispositivo può avere un numero 'n' di socket in base al numero di porta utilizzato. Sono disponibili diverse porte per diversi tipi di protocolli. Dai un'occhiata alla seguente immagine per ulteriori informazioni su alcuni dei numeri di porta comuni e sui relativi protocolli:




porte comuni-SocketProgramminginPython-Edureka

Ora che sei chiaro sul concetto di socket, diamo ora uno sguardo al modulo Socket di Python:

Come ottenere la programmazione Socket in Python:

Per ottenere la programmazione Socket in Python, dovrai importare il file presa modulo o . Questo modulo è costituito da metodi incorporati necessari per creare socket e aiutarli ad associarsi tra loro.

Alcuni dei metodi importanti sono i seguenti:

MetodiDescrizione

socket.socket ()

utilizzato per creare socket (richiesto sia sul server che sul client per creare socket)

socket.accept ()

utilizzato per accettare una connessione. Restituisce una coppia di valori (conn, address) dove conn è un nuovo oggetto socket per inviare o ricevere dati e address è l'indirizzo del socket presente all'altra estremità della connessione

socket.bind ()

utilizzato per eseguire il binding all'indirizzo specificato come parametro

socket.close ()

utilizzato per contrassegnare il socket come chiuso

socket.connect ()

utilizzato per connettersi a un indirizzo remoto specificato come parametro

socket.listen ()

consente al server di accettare le connessioni

Ora che hai compreso l'importanza del modulo socket, passiamo a vedere come può servire per creare server e client per la programmazione socket in .

Cos'è un server?

Un server è un programma, un computer o un dispositivo dedicato alla gestione delle risorse di rete. I server possono trovarsi sullo stesso dispositivo o computer o collegati localmente ad altri dispositivi e computer o anche remoti. Esistono vari tipi di server come server database, server di rete, server di stampa, ecc.

I server fanno comunemente uso di metodi come socket.socket (), socket.bind (), socket.listen (), ecc per stabilire una connessione e collegarsi ai client. Adesso scriviamo un programma per creare un server. Considera il seguente esempio:

ESEMPIO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #port number può essere qualsiasi cosa tra 0-65535 (di solito specifichiamo porte non previlegiate che sono > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} stabilito ') #f stringa è una stringa letterale con prefisso f che # contiene espressioni python all'interno di parentesi graffe clt .send (bytes ('Socket Programming in Python', 'utf-8')) # per inviare informazioni a clientocket

Come puoi vedere, la prima necessità per creare un socket è importare il modulo socket. Dopodiché, il metodo socket.socket () viene utilizzato per creare un socket lato server.

NOTA:

AF_INET fa riferimento a Indirizzo da Internet e richiede una coppia di (host, porta) in cui l'host può essere un URL di un determinato sito Web o il suo indirizzo e il numero di porta è un numero intero. SOCK_STREAM viene utilizzato per creare protocolli TCP.

Il metodo bind () accetta due parametri come una tupla (host, porta). Tuttavia, è meglio utilizzare numeri di porta a 4 cifre poiché quelli inferiori sono solitamente occupati. Il metodo listen () consente al server di accettare le connessioni. Qui, 5 è la coda per più connessioni che avvengono contemporaneamente. Il valore minimo che può essere specificato qui è 0 (se fornisci un valore inferiore, viene modificato in 0). Nel caso in cui non venga specificato alcun parametro, ne prende uno adatto di default.

Il consente di accettare le connessioni per sempre. 'Clt' e 'adr' sono l'oggetto e l'indirizzo del cliente. L'istruzione print stampa solo l'indirizzo e il numero di porta del socket client. Infine, clt.send viene utilizzato per inviare i dati in byte.

Ora che il nostro server è pronto, passiamo al client.

Cos'è un cliente?

Un client è un computer o un software che riceve informazioni o servizi dal server. In un modulo client-server, i client richiedono servizi dai server. L'esempio migliore è un browser web come Google Chrome, Firefox, ecc. Questi browser web richiedono server web per le pagine web e i servizi richiesti come indicato dall'utente. Altri esempi includono giochi online, chat online, ecc.

Ora diamo un'occhiata a come codificare il programma lato client :

ESEMPIO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Il primo passo è importare il modulo socket e quindi creare un socket proprio come hai fatto durante la creazione di un server. Quindi, per creare una connessione tra il client-server sarà necessario utilizzare il metodo connect () specificando (host, port).


NOTA: gethostname viene utilizzato quando client e server si trovano sullo stesso computer. (LAN - localip / WAN - publicip)

Qui, il client vuole ricevere alcune informazioni dal server e per questo, è necessario utilizzare il metodo recv () e le informazioni vengono memorizzate in un'altra variabile msg. Tieni presente che le informazioni passate saranno in byte e nel client nel programma sopra possono ricevere fino a 1024 byte (dimensione del buffer) in un singolo trasferimento. Può essere specificato a qualsiasi importo a seconda della quantità di informazioni trasferite.

Infine, il messaggio da trasferire dovrebbe essere decodificato e stampato.

Ora che sei consapevole di come creare programmi client-server, passiamo a vedere come devono essere eseguiti.

Echo Client-Server:

Per eseguire questi programmi, apri il prompt dei comandi, accedi alla cartella in cui hai creato il programma client e server e quindi digita:

py server.py (qui, server.py è il nome file del server, puoi anche usare py -3.7 server.py)

Fatto ciò, il server inizia a funzionare. Per eseguire il client, apri un'altra finestra di cmd e digita:

py client.py (qui, client.py è il nome file del client)

USCITA (SERVER):

(CLIENTE)

Proviamo lo stesso programma riducendo la dimensione del buffer a 7 e vediamo quale output otteniamo:

PRODUZIONE:

Come puoi vedere, la connessione viene interrotta dopo il trasferimento di 7 byte. Ma questo è un problema perché non hai ricevuto le informazioni complete e la connessione è chiusa. Andiamo avanti per risolvere questo problema.

Comunicazioni multiple:

Affinché la connessione continui fino a quando il client non riceve le informazioni complete, è possibile utilizzare il ciclo while:

ESEMPIO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) mentre True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Una volta fatto questo, il messaggio completo verrà ricevuto in 7 byte per trasferimento.

Ma questa volta, come puoi vedere, la connessione non viene interrotta e non sai mai quando accadrà. E per aggiungere a questo, cosa succede se in realtà non sai quanto è grande il messaggio o le informazioni che il client riceverà dal server. In questi casi, puoi effettivamente utilizzare il seguente bit di codice sul lato client:

ESEMPIO:

complete_info = '' while True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Sul lato server utilizzare il metodo close () come segue:

clt. chiudi ()

L'output di questo sarà come mostrato nell'immagine qui sotto:

PRODUZIONE:



Tutto il blocco di codice precedente fa è controllare la dimensione delle informazioni e stamparle in un buffer di due byte alla volta, oltre a chiudere la connessione dopo che è stata completata.

Trasferimento di oggetti Python:

Fino a qui hai appena imparato a trasferire le corde. Ma la programmazione socket in Pitone ti permette anche di trasferire anche oggetti Python. Questi oggetti possono essere qualsiasi cosa come insiemi, tuple, dizionari, ecc. Per ottenere ciò, dovrai importare il modulo pickle di Python.

Modulo pickle Python:

Il modulo pickle di Python entra in scena quando stai effettivamente serializzando o de-serializzando oggetti in python. Diamo un'occhiata a un piccolo esempio,

ESEMPIO:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

PRODUZIONE: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. '

Come puoi vedere, nel programma precedente, 'mylist' viene serializzato utilizzando la funzione dumps () del modulo pickle. Tieni inoltre presente che l'output inizia con una 'b', il che significa che è convertito in byte. Nella programmazione socket, è possibile implementare questo modulo per il trasferimento oggetti Python tra client e server.

Come utilizzare il modulo pickle per trasferire strutture di oggetti Python?

Quando usi il pickle insieme ai socket, puoi assolutamente trasferire qualsiasi cosa attraverso la rete. Annotiamo le controparti lato server e lato client per trasferire un elenco dal server al client:

Lato server:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} edited ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) #il messaggio che vogliamo stampare in seguito mymsg = {len (mimig): {a}} 'utf-8') + mimig clt.send (mimig)

Qui, m è un dizionario che è fondamentalmente un file che deve essere inviato dal server al client. Questo viene fatto serializzando prima l'oggetto usando dumps () e poi convertendolo in byte.
Ora annotiamo la controparte lato client:

Dalla parte del cliente:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True: complete_info = b '' rec_msg = True while True: mymsg = s.recv (10) if rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Ricevuto le informazioni complete') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Il primo ciclo while ci aiuterà a tenere traccia del messaggio completo (complete_info) e del messaggio che viene ricevuto (rec_msg) utilizzando il buffer. il messaggio impostando rec_
Quindi, mentre il messaggio viene ricevuto, tutto ciò che faccio è stamparne ogni bit, venendo ricevuto in un buffer di dimensione 10. Questa dimensione può essere qualsiasi cosa a seconda della tua scelta personale.

c ++ vai alla riga

Quindi, se il messaggio ricevuto è uguale al messaggio completo, sto solo stampando il messaggio come informazioni complete ricevute, dopodiché ho deserializzato il messaggio utilizzando load ().

L'output del programma precedente è il seguente:

Questo ci porta alla fine di questo articolo sulla programmazione socket in Python. Spero che tu abbia capito chiaramente tutti i concetti.

Assicurati di esercitarti il ​​più possibile e di ripristinare la tua esperienza.

Hai domande per noi? Si prega di menzionarlo nella sezione commenti di questo blog 'Socket Programming in Python' e vi risponderemo il prima possibile.

Per ottenere una conoscenza approfondita di Python e delle sue varie applicazioni, puoi iscriverti a live con supporto 24 ore su 24, 7 giorni su 7 e accesso a vita.