==== Blokkoló socket szerver ====
Nézzük meg hogyan implementálja a Python a socketeket.
Egyszerű blokkoló TCP szerver és a hozzá tartozó kliens létrehozásával szemléltetjük a blokkoló socket megközelítés különbségét Pythonban. Ez a szerver egyszerre egy kapcsolatot kezel blokkoló módon, ami azt jelenti, hogy vár (vagy blokkol) az I/O műveletekre, mint például új kapcsolatok elfogadása vagy adatok fogadása.
import socket
HOST = '127.0.0.1' # Standard loopback interfész cím (localhost)
PORT = 65432 # Figyelt port (nem privilegizált portok > 1023)
# Socket létrehozása
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.bind((HOST, PORT))
server_socket.listen()
print(f"A szerver figyel a következőn: {HOST}:{PORT}")
while True:
# Új kapcsolat elfogadása
conn, addr = server_socket.accept()
with conn:
print(f"Kapcsolódva {addr} címről")
while True:
data = conn.recv(1024)
if not data:
break # Nincs több adat a klienstől, kapcsolat bontása
print(f"Fogadott adat: {data.decode()} innen: {addr}")
response = "Válasz a szervertől.".encode()
conn.sendall(response)
==== Blokkoló kliens ====
import socket
HOST = '127.0.0.1' # A szerver hosztneve vagy IP címe
PORT = 65432 # A szerver által használt port
# Socket létrehozása
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
print("Kapcsolódva a szerverhez")
# Adat küldése
message = 'Helló, szerver'.encode()
s.sendall(message)
print("Üzenet elküldve a szervernek")
# Várakozás válaszra
data = s.recv(1024)
print("Válasz fogadva a szervertől")
print(f"Fogadott adat: {data.decode()}")
----
==== Nem blokkoló szerver ====
Egy nem blokkoló TCP socket szerver létrehozása Pythonban magában foglalja egy olyan socket beállítását, amely kapcsolatokra figyel anélkül, hogy blokkolná a program fő végrehajtási szálát. Íme egy egyszerű példa egy nem blokkoló TCP szerverre, amely több klienskapcsolatot fogad és aszinkron módon kezeli őket. Ez a szerver a select metódust használja, amely lehetővé teszi több kapcsolat kezelését anélkül, hogy bármelyiken is blokkolódna.
import socket
import select
HOST = '127.0.0.1' # Standard loopback interfész cím (localhost)
PORT = 65432 # Figyelt port (nem privilegizált portok > 1023)
# Socket létrehozása
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# A socket címhez és porthoz kötése
server_socket.bind((HOST, PORT))
# Kapcsolatokra való figyelés
server_socket.listen()
print(f"Figyelés itt: {HOST}:{PORT}")
# A szerver socket beállítása nem blokkoló módba
server_socket.setblocking(0)
# Bemeneti socketek nyomon követése
inputs = [server_socket]
outputs = []
while inputs:
# Várakozás legalább egy socket készenlétére a feldolgozáshoz
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for s in readable:
if s is server_socket:
# Új kapcsolat elfogadása
connection, client_address = s.accept()
print(f"Új kapcsolat innen: {client_address}")
connection.setblocking(0)
inputs.append(connection)
else:
data = s.recv(1024)
if data:
# Olvasható kliens socketnek van adata
print(f"Fogadott adat: {data} innen: {s.getpeername()}")
# Válaszcsatorna hozzáadása a válaszhoz
if s not in outputs:
outputs.append(s)
else:
# Üres eredmény mint a kapcsolat bontása
print(f"Kapcsolat bontása: {client_address}")
if s in outputs:
outputs.remove(s)
inputs.remove(s)
s.close()
for s in writable:
response = b'Válasz a szervertől.'
s.send(response)
# Miután a választ elküldtük, már nem kell írnunk többet
outputs.remove(s)
for s in exceptional:
print(f"Kivételes állapot kezelése itt: {s.getpeername()}")
# Bemenet figyelésének leállítása a kapcsolaton
inputs.remove(s)
if s in outputs:
outputs.remove(s)
s.close()
==== Python nem blokkoló kliens ====
A nem blokkoló TCP szerver teszteléséhez létrehozhatunk egy egyszerű klienst, amely kapcsolódik a szerverhez, üzenetet küld, majd vár egy válaszra. Ez egy alap TCP kliens példa Pythonban, amely interakcióba lép a nem blokkoló szerverünkkel. Látunk különbséget a blokkoló klienssel összehasonlítva?
import socket
HOST = '127.0.0.1' # A szerver hosztneve vagy IP címe
PORT = 65432 # A szerver által használt port
# Socket létrehozása
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# Kapcsolódás a szerverhez
s.connect((HOST, PORT))
print("Kapcsolódva a szerverhez")
# Adat küldése
message = 'Helló, szerver'.encode()
s.sendall(message)
print("Üzenet elküldve a szervernek")
# Várakozás válaszra
data = s.recv(1024)
print("Válasz fogadva a szervertől")
print(f"Fogadott adat: {data.decode()}")