Conținut curs
Python Avansat
Despre lecție
  1. 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
  2. Biblioteca socket în Python

    • Prezentarea bibliotecii socket
    • Crearea și configurarea obiectelor socket
  3. Sockets TCP

    • Stabilirea conexiunilor TCP
    • Lucrul cu servere și clienți TCP
    • Transmiterea și primirea de date prin conexiuni TCP
  4. Sockets UDP

    • Comunicații fără conexiune prin UDP
    • Lucrul cu servere și clienți UDP
    • Transmiterea și primirea de date prin UDP
  5. 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
  6. Lucrul cu multiple conexiuni în același timp

    • Introducere în conceptul de multiplexare
    • Utilizarea modulului select pentru gestionarea multiplelor conexiuni
  7. Securizarea comunicațiilor în rețea

    • Introducere în criptarea datelor și certificatele SSL/TLS
    • Utilizarea bibliotecii ssl pentru comunicații securizate

Exemple și exerciții pentru fiecare subpunct:

Exemplu: Server TCP simplu

python
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

python
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

python
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

python
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

python
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

python
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:

python
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:

python
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.