[Python-es] socket + udp

Ricardo Cárdenes Medina ricardo.cardenes en gmail.com
Mie Feb 3 23:33:58 CET 2010


2010/2/3 Michael Ibarra <michael.ibarra en gmail.com>:
>
> hola, estoy viendo sockets con python.. lo cual quiero hacer un
> pequeño programa enviando un directorio a listar a un server y este
> devuelve el listado.
> http://pastebin.com/m362078e6

Veo un par de problemas.

1) En el servidor...

        for dir in dir:
                s.sendto(message, address)

Ese "for dir in dir" no es muy adecuado. No deberías usar el mismo
nombre para el objeto sobre el que iteras y la variable del bucle. En
este caso es más bien por cuestiones de elegancia, porque a ti no te
afecta (no usas "dir" más adelante).

Tampoco deberías usar "dir", de todas maneras, porque es el nombre de
una función builtin.

Pero... al grano: estás mandando de vuelta el directorio que solicitó
el cliente!! Es por eso que si has ejecutado el cliente pidiendo un
listado de "/", estás viendo de vuelta "////////". Sin modificar nada
más del servidor, esto lo arreglaría.

        for dir in dir:
                s.sendto(dir, address)

2) En el cliente:

while 1:
        message, address=s.recvfrom(2048)
        if not len(message):
                break
        sys.stdout.write(message)

Éste lo vamos a subdividir :P

2.1) sys.stdout.write(message)

Eso escribe un mensaje a salida estándar, pero lo escribe tal cual,
sin añadir un retorno de carro/avance de línea, lo que significa que
como la salida suele ser con búfer, hasta que no se llene (es decir,
hasta que no escribas muchísimo texto), no verás nada.

Se soluciona fácilmente:

   sys.stdout.write(message + '\n')

o, para simplificar

   print message

2.2) Has creado un bucle infinito que tiene como condición de salida:

        if not len(message):
                break

Eso no te vale. Con ficheros y otros objetos "file-like" sí, pero
cuando tratas con sockets a tan bajo nivel, a menos que el otro
extremo cierre adecuadamente el socket, no tienes manera alguna de
saber que has llegado al "final" del stream.

¡Pero espera! Eso es para socket orientados a la conexión, como TCP,
¡y tú estás usando UDP!. Tu programa podría estar esperando hasta el
día del juicio (o un timeout, si lo programases). Sería mejor que
introdujeses algún tipo de protocolo.



Más información sobre la lista de distribución Python-es