El 3 de febrero de 2010 17:33, Ricardo Cárdenes Medina <
ricardo.carde...@gmail.com> escribió:

> 2010/2/3 Michael Ibarra <michael.iba...@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.
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>


Gracias por los datos, solo era un borrador porque xq tengo la misma
aplicacion sobre TCP y funcionaba.
-- 
Michael Ibarra
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a