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!

Python - Socket Programming

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