Veremos los dos últimos ejemplos a modo ilustrativo de cómo se establecen los parámetros para una comunicación basada en datagramas UDP y, de esta manera, probar la transmisión de conexión no segura en la que no es necesario establecer una conexión; simplemente, con abrir un socket y enviar al destino es suficiente.
En el ejemplo de abajo se establece un servidor que básicamente se pone a la escucha y ante cualquier envío de datos por parte de un cliente lo recoge y toma referencia del socket que los ha enviado a través de la dirección en el otro extremo. Posteriormente, envía al remitente un mensaje al remitente.
El socket lo declaramos de tipo datagram en su instanciación. Sí observamos la gran diferencia con los ejemplos de transmisión TCP de los ejemplos anteriores, podemos constatar que NO existe una instrucción de accept() para establecer una conexión con el cliente.
En su lugar, el servidor permanece a la escucha de cualquier envío de datos a través del método bloqueante recvfrom(), el cual es similar a recv() visto con anterioridad. La gran diferencia estriba en que, además de los datos, nos indica la dirección desde la que se han recibido. Esa dirección es una lista con un par de elementos que en IPV4 se corresponden con la dirección IP y el puerto de origen de la transmisión.
De forma similar y complementaria funciona el método sendto(), en el que además de los datos para enviar debemos indicar la dirección (IP + puerto) destino. Al igual que send(), devuelve el número de bytes enviados.
Por último, cabe recordar que recvfrom() es bloqueante y, por tanto, la ejecución se queda paralizada coma hasta que nos lleguen datos a través de la red.
import socket
HOST = ''
PORT = 2000
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s_addr = (HOST, PORT)
s.bind(s_addr)
#recibir
datos, addr = s.recvfrom(1024) #línea bloqueante
print('recibidos {} bytes de {}'.format(len(datos), addr))
print(datos)
#enviar
if datos:
sent = s.sendto(b"Saludos desde el Servidor UDP", addr)
print('enviados {} bytes de vuelta a {}'.format(sent, addr))
Para probar este programa sería a través de nc o netcat (linux), nc es una herramienta de línea de comandos que sirve para escribir y leer datos en la red.
En windows no existe dicho programa por lo que hay que descargarlo aquí (password del zip nc). No obstante hay que añadir dicho programa como una excepción al antivirus para que funcione.