Buona giornata, studenti! Nel nostro tutorial precedente, abbiamo discusso del modulo Python unittest. Oggi daremo uno sguardo a un esempio di programmazione di socket in Python. Creeremo delle applicazioni server e client di socket in Python.
Programmazione di Socket in Python
Per capire la programmazione di socket in Python, dobbiamo conoscere tre argomenti interessanti – Server Socket, Client Socket e Socket. Allora, cos’è un server? Beh, un server è un software che attende le richieste del client e le elabora di conseguenza. D’altro canto, un client è il richiedente di questo servizio. Un programma client richiede delle risorse al server e il server risponde a quella richiesta. Il socket è il punto terminale di un canale di comunicazione bidirezionale tra server e client. I socket possono comunicare all’interno di un processo, tra processi sulla stessa macchina o tra processi su macchine diverse. Per qualsiasi comunicazione con un programma remoto, dobbiamo connetterci attraverso una porta socket. L’obiettivo principale di questo tutorial di programmazione di socket è introdurti a come il server e il client di socket comunicano tra loro. Imparerai anche come scrivere un programma server di socket in Python.
Esempio di Socket Python
Abbiamo detto in precedenza che un client socket richiede alcune risorse al server socket e il server risponde a quella richiesta. Quindi progetteremo sia il server che il modello client in modo che ciascuno possa comunicare con essi. I passaggi possono essere considerati così.
- Il programma server socket Python si esegue per primo e attende eventuali richieste
- Il programma client socket Python avvierà la conversazione per primo.
- Quindi il programma server risponderà di conseguenza alle richieste del client.
- Il programma client terminerà se l’utente inserisce il messaggio “bye”. Il programma server terminerà anche quando il programma client termina, questo è facoltativo e possiamo mantenere il programma server in esecuzione indefinitamente o terminare con un comando specifico nella richiesta del client.
Server Socket Python
Salveremo il programma del server socket Python come socket_server.py
. Per utilizzare la connessione del socket Python, è necessario importare il modulo socket. Successivamente, dobbiamo eseguire alcune operazioni per stabilire la connessione tra il server e il client. Possiamo ottenere l’indirizzo dell’host utilizzando la funzione socket.gethostname()
. Si consiglia di utilizzare un numero di porta superiore a 1024 perché i numeri di porta inferiori a 1024 sono riservati per i protocolli Internet standard. Guarda il codice di esempio del server socket Python qui sotto, i commenti ti aiuteranno a capire il codice.
import socket
def server_program():
# ottieni il nome dell'host
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# guarda attentamente. La funzione bind() accetta una tupla come argomento
server_socket.bind((host, port)) # bind host address and port together
# configura quante connessioni il server può gestire contemporaneamente
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# ricevi il flusso di dati. non accetterà pacchetti di dati più grandi di 1024 byte
data = conn.recv(1024).decode()
if not data:
# se i dati non vengono ricevuti, interrompi
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
Quindi il nostro server socket Python è in esecuzione sulla porta 5000 e attenderà la richiesta del client. Se vuoi che il server non si interrompa quando la connessione del client viene chiusa, rimuovi semplicemente la condizione if e l’istruzione di interruzione. Il ciclo while di Python viene utilizzato per eseguire il programma del server indefinitamente e continuare ad attendere la richiesta del client.
Client Socket Python
Salveremo il programma client socket Python come socket_client.py
. Questo programma è simile al programma server, tranne che per il binding. La differenza principale tra il programma server e quello client è che, nel programma server, è necessario associare insieme l’indirizzo dell’host e l’indirizzo della porta. Ecco il codice di esempio del client socket Python di seguito, il commento ti aiuterà a capire il codice.
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
Output della programmazione del socket Python
Per vedere l’output, esegui prima il programma del server socket. Quindi esegui il programma del client socket. Dopo di ciò, scrivi qualcosa dal programma client. Quindi di nuovo scrivi una risposta dal programma server. Infine, scrivi bye dal programma client per terminare entrambi i programmi. Il breve video qui sotto mostrerà come ha funzionato nella mia esecuzione di test dei programmi di esempio del server e del client socket.
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
Nota che il server socket sta funzionando sulla porta 5000 ma il client richiede anche una porta socket per connettersi al server. Questa porta viene assegnata casualmente dalla chiamata di connessione del client. In questo caso, è 57822. Quindi, questo è tutto per la programmazione del socket Python, i programmi di esempio del server socket e del client socket Python. Riferimento: Documentazione Ufficiale
Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client