[Olpc-uruguay] Desafío al JAM !!

Andrés Ambrois andresambrois en gmail.com
Dom Ago 15 04:30:17 EDT 2010


On Wednesday, August 11, 2010 09:45:48 pm Flavio Danesse wrote:
> *Hola gente.*
> 
> Sigo luchando con la red y la cosa está difícil de verdad, así que recurro a
> la lista por una manito ya que cada vez estoy más perdido en el tema.
> A ver si hay un alma caritativa en la lista que se apiade de mi y me tire
> unas lineas de código para destrancarme en el tema.
> En particular a Andres Ambrois si anda por acá, le hago el desafío
> (amistoso), ya que es quien maneja generalmente estos temas en la lista y
> seguramente pueda construirme rápidamente un sencillo ejemplo que funcione,
> de todas maneras, si alguien más a parte de Andres sabe de este tema,
> agradecería un ejemplo funcional.

En garde!

Te mando lo que pude hacer de ejemplo. 

Hay muchas cosas que explicar para poner en un mail, así que creo que lo mejor 
sería que leas el código, la documentación de asyncore, y preguntes las dudas 
que te queden.

El problema de hacer todo a mano es que hay muchos detalles que tener en 
cuenta. La performance (tanto del cliente como de la red) debe ser de los 
temas más importantes en un juego, aunque no le presté ninguna atención en 
este ejemplo. Otro tema es que nada que hagas va a funcionar atrás de una NAT 
(como la que hay en todas las escuelas), sin un esquema de NAT Traversal.

Saludos!

P.D.: Para que corra precisa una imágen 'tank.png' en el mismo directorio.
> *Explico:*
> Según todo lo que he leído, para hacer un juego en red salvo raras
> excepciones debe utilizarse UDP (por diferentes motivos).
> Así que en el juego que estoy haciendo, necesito que un jugador cree el
> juego en la red y los demás se conecten a él.
> Luego debo tener una lista de todos los jugadores dentro del juego para
> poder enviarles los datos y además asignar puntajes y demás.
> Y por último, actualizarlos a todos cada cierto tiempo, pero mientras tanto
> tengo que mantener el servidor levantado en escucha por si alguien más se
> une al juego.
> 
> Así que implementé un servidor UDP que escucha permanentemente a los nuevos
> jugadores que se unen al juego, el problema es que nunca pasa de ahí, es
> decir queda siempre esperando nuevas conexiones y el juego nunca se inicia.
> El juego debiera iniciarse aunque solo estuviera el jugador local en él y
> cuando se conectara otro, este debiera aparecer en el juego, poder jugar
> ambos y así por siempre. He probado de todo un poco, de hecho sobre TCP
> funciona pero solo con 2 jugadores, de todas maneras ese es otro tema,
> también probé múltiples formas multihilo y ninguna funciona como
> teóricamente debiera (o según lo que yo entendí).
> 
> *Lo que busco es: *
> 
>    - Jugar y escuchar al mismo tiempo.
>    - Mantener en correspondencia cada conexión con sus objetos en el juego
>    (y otras cosas que vendrán después de solucionar estas).
> 
> Dejo ejemplo básico de mi servidor y más abajo el del cliente básico para
> él.
> 
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
> 
> import SocketServer
> import gobject
> 
> import sys
> import time
> import datetime
> HOST, PORT = "localhost", 9999
> 
> *class Servidor():
> 
>     def __init__(self):*
> 
>         self.server = None
>         self.get_server()
> *
>     def get_server(self):*
>     # Levanta el Servidor
> 
>         # http://docs.python.org/library/socketserver.html
>         # 20.17.2. Server Objects
> 
>         self.server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler) #
> Instancia de Servidor UDP con su controlador
>         self.server.serve_forever() # handle_request() o serve_forever()
> para procesar uno o muchos pedidos.
> 
> *class MyUDPHandler(SocketServer.BaseRequestHandler):
> 
>     def handle(self):*
> 
>         print "Conexion establecida con: " , self.client_address
> 
>         data = self.request[0].strip() # strip elimina espacios vacios al
> inicio y al final de una cadena
>         socket = self.request[1]
> 
>         socket.sendto("ok", self.client_address)
> 
> *    def setup(self):*
>     # Llamado antes de la handle() para realizar acciones de inicialización
> necesaria. La implementación predeterminada no hace nada.
>         print "Configurando Conección"
> 
> *    def finish(self):*
>     # Llamado despues de la handle() para realizar cualquier método de
> limpieza. La implementación predeterminada no hace nada.
>         print "Finalizando Solicitud"
> *
> if __name__ == "__main__":*
>     Servidor()
> 
> *Cliente:*
> 
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
> 
> import socket
> import sys
> 
> HOST, PORT = "localhost", 9999
> 
> data = "Envio del cliente"
> 
> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> 
> sock.sendto(data, (HOST, PORT))
> recibido = sock.recv(1024)
> 
> print "Enviado:     %s" % data
> print "Recibido: %s" % recibido
> 

-- 
  -Andrés
------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : tanks.py
Tipo       : text/x-python
Tamaño     : 5543 bytes
Descripción: no disponible
Url        : http://lists.laptop.org/pipermail/olpc-uruguay/attachments/20100815/c4928db6/attachment.py 
------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre     : no disponible
Tipo       : application/pgp-signature
Tamaño     : 198 bytes
Descripción: This is a digitally signed message part.
Url        : http://lists.laptop.org/pipermail/olpc-uruguay/attachments/20100815/c4928db6/attachment.pgp 


More information about the Olpc-uruguay mailing list