Comunicación de bajo nivel con sockets TCP en Python: crear sockets, cliente (connect/send/recv), servidor (bind/listen/accept) y manejo de ConnectionError.
recv(buffer) lee los bytes que han llegado al socket; buffer es el máximo a leer (se recomienda una potencia de 2 pequeña, como 4096). Finalmente, siempre hay que cerrar con close() para liberar recursos.data = sock.recv(4096)print(data.decode('utf-8'))sock.close()recv(4096) entrega como máximo 4096 bytes, pero puede entregar menos: solo los que hayan llegado en ese momento. No asumas que recibiste todo de una vez.
El cliente no hace bind: el sistema operativo le asigna un puerto automáticamente al hacer connect. El bind es cosa del servidor, que necesita un puerto conocido y fijo.
Cerrar el socket en un bloque finally asegura que no queden conexiones abiertas consumiendo recursos, incluso si el envío o la recepción fallan.