Python - Programmazione dei Socket
Ciao a tutti, futuri maghi di Python! Oggi ci immergeremo nel mondo emozionante della programmazione dei socket. Non preoccupatevi se siete nuovi a questo; inizieremo dalle basi e poi cresciamo di livello. Alla fine di questo tutorial, sarete in grado di creare le vostre applicazioni di rete come un professionista!
Cos'è un Socket?
Immaginate di voler parlare a un amico che vive lontano. avete bisogno di un modo per inviare il vostro messaggio e ricevere la loro risposta. Nel mondo dei computer, i socket svolgono questo ruolo. Sono come le linee telefoniche che permettono ai computer di comunicare tra loro su una rete.
I socket sono i punti finali di un collegamento di comunicazione bidirezionale tra due programmi in esecuzione su una rete. Sono il modo in cui inviate messaggi tra un client (come il vostro browser web) e un server (come un sito web).
Il Modulo Python socket
Python rende la programmazione dei socket un gioco da ragazzi con il suo modulo integrato socket
. Iniziamo importandolo:
import socket
Questa semplice linea ci dà accesso a tutte le funzionalità dei socket di cui abbiamo bisogno. È come aprire il nostro cassetto degli attrezzi prima di iniziare a costruire!
Metodi del Socket del Server
Quando creiamo un server, dobbiamo utilizzare metodi specifici per impostarlo. Ecco una tabella dei metodi del socket del server più comuni:
Metodo | Descrizione |
---|---|
socket() |
Crea un nuovo socket |
bind() |
Collega il socket a un indirizzo e porta specifici |
listen() |
Mette il server in modalità di ascolto |
accept() |
Accetta una connessione da un client |
Vediamo questi in azione con un esempio semplice:
import socket
# Crea un oggetto socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Collega il socket a un indirizzo e porta specifici
server_socket.bind(('localhost', 12345))
# Ascolta le connessioni in arrivo
server_socket.listen(1)
print("Server in ascolto...")
# Accetta una connessione
client_socket, address = server_socket.accept()
print(f"Connessione da {address} è stata stabilita!")
# Chiude la connessione
client_socket.close()
In questo esempio, creiamo un socket, lo colleghiamo a 'localhost' sulla porta 12345, iniziamo l'ascolto e poi attendiamo che un client si connetta. Quando una connessione è stabilita, stampiamo un messaggio e poi chiudiamo la connessione.
Metodi del Socket del Client
Ora, diamo un'occhiata dal lato client. Ecco i principali metodi che utilizziamo quando creiamo un client:
Metodo | Descrizione |
---|---|
socket() |
Crea un nuovo socket |
connect() |
Si connette a un socket remoto a un indirizzo specifico |
send() |
Invia dati al socket connesso |
recv() |
Riceve dati dal socket connesso |
Ecco un esempio di client semplice:
import socket
# Crea un oggetto socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Si connette al server
client_socket.connect(('localhost', 12345))
print("Connesso al server!")
# Chiude la connessione
client_socket.close()
Questo client crea un socket, si connette al nostro server (che dovrebbe essere in esecuzione) e poi chiude la connessione.
Python - Server Socket
Espandiamo il nostro esempio di server per fare qualcosa di utile:
import socket
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Server in ascolto...")
while True:
client_socket, address = server_socket.accept()
print(f"Connessione da {address} è stata stabilita!")
message = "Benvenuto nel server!"
client_socket.send(message.encode())
client_socket.close()
start_server()
Questo server将继续运行,接受连接,发送欢迎信息,然后关闭连接。
Python - Client Socket
Ora creiamo un client che possa ricevere il messaggio del server:
import socket
def start_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
message = client_socket.recv(1024).decode()
print(f" Messaggio dal server: {message}")
client_socket.close()
start_client()
Questo client si connette al nostro server, riceve il messaggio di benvenuto, lo stampa e poi chiude la connessione.
Trasferimento di File con il Modulo Socket di Python
Una applicazione pratica della programmazione dei socket è il trasferimento di file. Ecco un esempio semplice di come inviare un file da un client a un server:
Server:
import socket
def receive_file():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Server in attesa del file...")
client_socket, address = server_socket.accept()
print(f"Connessione da {address} è stata stabilita!")
with open('received_file.txt', 'wb') as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print("File ricevuto con successo!")
client_socket.close()
receive_file()
Client:
import socket
def send_file():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
with open('file_to_send.txt', 'rb') as file:
data = file.read(1024)
while data:
client_socket.send(data)
data = file.read(1024)
print("File inviato con successo!")
client_socket.close()
send_file()
Questo esempio dimostra come inviare un file dal client al server utilizzando i socket.
Il Modulo Python socketserver
Per applicazioni server più complesse, Python fornisce il modulo socketserver
. Questo modulo semplifica il processo di scrittura dei server di rete. Ecco un esempio semplice:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print(f"Ricevuto: {self.data.decode()}")
self.request.sendall("Messaggio ricevuto".encode())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
print("Server in esecuzione...")
server.serve_forever()
Questo server utilizza il modulo socketserver
per creare un server TCP che rimanda indietro qualsiasi messaggio riceve.
E voilà, ragazzi! Abbiamo coperto le basi della programmazione dei socket in Python, dalla creazione di clienti e server semplici al trasferimento di file e l'uso del modulo socketserver
. Ricorda, la pratica rende perfetti, quindi non aver paura di sperimentare con questi concetti. Buon coding!
Credits: Image by storyset