[Olpc-uruguay] Desafío al JAM !!
Flavio Danesse
fdanesse en gmail.com
Mie Ago 11 20:45:48 EDT 2010
*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.
*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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://lists.laptop.org/pipermail/olpc-uruguay/attachments/20100811/81c04ee6/attachment.htm
More information about the Olpc-uruguay
mailing list