7.2.3 Esempio

Ecco quattro programmi di esempio minimali che usano il protocollo TCP/IP: un server che fa l'echo di tutti i dati ricevuti (servendo un unico client), ed un client che lo sfrutta. Notare che un server deve eseguire la sequenza socket(), bind(), listen(), accept() (possibilmente ripetendo la accept() per servire più di un client), mentre un client necessita della sola sequenza socket(), connect(). Notare inoltre che il server non effettua le send()/recv() sul socket sul quale sta ascoltando, ma sul nuovo socket restituito dalla accept().

I primi due esempi supportano solo l'IPv4.

# Programma server Echo 
import socket

HOST = ''                 # Nome simbolico che rappresenta il nodo locale
PORT = 50007              # Porta non privilegiata arbitraria 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

# Programma client Echo
import socket

HOST = 'daring.cwi.nl'    # Il nodo remoto
PORT = 50007              # The La stessa porta usata dal server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', `data`

I prossimi due esempi sono identici ai due sopra, ma supportano sia IPv4 che IPv6. Il lato server ascolterà sulla prima famiglia di indirizzi disponibile (dovrebbe ascoltare con entrambe). Su molti dei sistemi IPv6-ready, IPv6 avrà la precedenza ed il server potrebbe non accettare il traffico IPv4. Il lato client proverà a connettersi a tutti gli indirizzi restituiti come risultato della risoluzione del nome, ed invierà il suo traffico alla prima connessione utile.

# Programma server Echo
import socket
import sys

HOST = ''                 # Nome simbolico che rappresenta il nodo locale
PORT = 50007              # Porta non privilegiata arbitraria
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
	s = socket.socket(af, socktype, proto)
    except socket.error, msg:
	s = None
	continue
    try:
	s.bind(sa)
	s.listen(1)
    except socket.error, msg:
	s.close()
	s = None
	continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

# Programma client Echo
import socket
import sys

HOST = 'daring.cwi.nl'    # Il nodo remoto
PORT = 50007              # La stessa porta usata dal server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
	s = socket.socket(af, socktype, proto)
    except socket.error, msg:
	s = None
	continue
    try:
	s.connect(sa)
    except socket.error, msg:
	s.close()
	s = None
	continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', `data`
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.