-
Introducere în comunicațiile în rețea
- Conceptul de rețea de calculatoare
- Protocoale de comunicație în rețea: TCP și UDP
- Adrese IP și porturi
-
Biblioteca socket în Python
- Prezentarea bibliotecii socket
- Crearea și configurarea obiectelor socket
-
Sockets TCP
- Stabilirea conexiunilor TCP
- Lucrul cu servere și clienți TCP
- Transmiterea și primirea de date prin conexiuni TCP
-
Sockets UDP
- Comunicații fără conexiune prin UDP
- Lucrul cu servere și clienți UDP
- Transmiterea și primirea de date prin UDP
-
Gestionarea erorilor și a excepțiilor în comunicații în rețea
- Identificarea și tratarea erorilor comune
- Utilizarea blocurilor try-except pentru gestionarea excepțiilor
-
Lucrul cu multiple conexiuni în același timp
- Introducere în conceptul de multiplexare
- Utilizarea modulului
selectpentru gestionarea multiplelor conexiuni
-
Securizarea comunicațiilor în rețea
- Introducere în criptarea datelor și certificatele SSL/TLS
- Utilizarea bibliotecii
sslpentru comunicații securizate
Exemple și exerciții pentru fiecare subpunct:
Exemplu: Server TCP simplu
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Serverul așteaptă conexiuni...")
connection, client_address = server_socket.accept()
print(f"Conexiune de la {client_address}")
data = connection.recv(1024)
print(f"Date primite: {data.decode()}")
connection.sendall(b'Mesaj primit')
connection.close()
server_socket.close()
Exemplu: Client TCP simplu
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
client_socket.sendall(b'Acesta este un mesaj de test')
data = client_socket.recv(1024)
print(f"Date primite: {data.decode()}")
client_socket.close()
Exercițiu:
Creați un server și un client TCP care să comunice între ele, trimițând și primind mesaje.
Exemplu: Server UDP simplu
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 12345))
print("Serverul așteaptă mesaje...")
data, client_address = server_socket.recvfrom(1024)
print(f"Mesaj primit de la {client_address}: {data.decode()}")
server_socket.sendto(b'Mesaj primit', client_address)
server_socket.close()
Exemplu: Client UDP simplu
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.sendto(b'Acesta este un mesaj de test', ('localhost', 12345))
data, server_address = client_socket.recvfrom(1024)
print(f"Date primite: {data.decode()}")
client_socket.close()
Exercițiu:
Creați un server și un client UDP care să comunice între ele, trimițând și primind mesaje.
Exemplu: Gestionarea erorilor și excepțiilor în comunicațiile în rețea
import socket
import sys
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print(f"Nu s-a putut crea socket-ul: {e}")
sys.exit(1)
try:
client_socket.connect(('localhost', 12345))
except socket.error as e:
print(f"Conexiune eșuată: {e}")
sys.exit(1)
try:
client_socket.sendall(b'Acesta este un mesaj de test')
except socket.error as e:
print(f"Nu s-a putut trimite mesajul: {e}")
sys.exit(1)
try:
data = client_socket.recv(1024)
print(f"Date primite: {data.decode()}")
except socket.error as e:
print(f"Nu s-au putut primi datele: {e}")
sys.exit(1)
client_socket.close()
Exercițiu:
Modificați exemplele anterioare de server și client TCP/UDP pentru a gestiona erorile și excepțiile.
Exemplu: Server TCP cu multiple conexiuni folosind modulul select
import socket
import select
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(5)
print("Serverul așteaptă conexiuni...")
input_sockets = [server_socket]
output_sockets = []
message_queues = {}
while input_sockets:
readable, writable, exceptional = select.select(input_sockets, output_sockets, input_sockets)
for s in readable:
if s is server_socket:
connection, client_address = s.accept()
input_sockets.append(connection)
print(f"Conexiune de la {client_address}")
else:
data = s.recv(1024)
if data:
print(f"Date primite de la {s.getpeername()}: {data.decode()}")
if s not in output_sockets:
output_sockets.append(s)
else:
if s in output_sockets:
output_sockets.remove(s)
input_sockets.remove(s)
s.close()
for s in writable:
s.sendall(b'Mesaj primit')
output_sockets.remove(s)
for s in exceptional:
input_sockets.remove(s)
if s in output_sockets:
output_sockets.remove(s)
s.close()
server_socket.close()
Exercițiu:
Creați un server TCP care să accepte și să gestioneze multiple conexiuni simultan.
Exemplu: Server și client TCP securizat cu SSL/TLS
Server TCP securizat:
import socket
import ssl
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(1)
print("Serverul așteaptă conexiuni securizate...")
connection, client_address = server_socket.accept()
secure_socket = ssl.wrap_socket(
connection,
keyfile='server-key.pem',
certfile='server-cert.pem',
server_side=True,
ssl_version=ssl.PROTOCOL_TLS,
)
data = secure_socket.recv(1024)
print(f"Date primite: {data.decode()}")
secure_socket.sendall(b'Mesaj primit securizat')
secure_socket.close()
server_socket.close()
Client TCP securizat:
import socket
import ssl
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))
secure_socket = ssl.wrap_socket(
client_socket,
keyfile=None,
certfile=None,
server_side=False,
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLS,
)
secure_socket.sendall(b'Acesta este un mesaj de test securizat')
data = secure_socket.recv(1024)
print(f"Date primite: {data.decode()}")
secure_socket.close()
client_socket.close()
Exercițiu:
Creați un server și un client TCP securizat care să comunice între ele folosind criptarea SSL/TLS.