2012-04-04 12 views
15

Estoy comenzando un proyecto pequeño, básicamente una variación multijugador (como en más de dos jugadores) del clásico juego Battleship.Android P2P (conexión directa) a través de Internet (detrás de NAT)

Un problema que estoy tratando de resolver antes de sumergirme en la codificación es el problema de la comunicación entre los múltiples jugadores. Una posibilidad actual es utilizar un servidor HTTP central como el centro de comunicación central (junto con la API C2DM de Android para permitir la comunicación de inserción desde el servidor HTTP a los dispositivos). Esta parece una buena solución, porque en teoría, siempre y cuando tengas acceso a Internet, debería funcionar perfectamente, tanto si estás detrás de un NAT como si no.

Sin embargo, la solución propuesta tiene la desventaja de que existe un único punto de falla/carga adicional (el servidor web). Entonces me gustaría probar otras opciones. Pensé en hacer conexiones directas usando Sockets entre los clientes (con el servidor web solo siendo utilizado como punto de encuentro inicial), sin embargo, esto solo funcionaría si todos los dispositivos estuvieran en la misma red. Teniendo en cuenta que hoy estamos casi siempre detrás de la NAT de un enrutador, ¿cómo puedo lograr la comunicación directa? He estado leyendo sobre agujeros perforados, pero no encuentro ninguna buena biblioteca que esté bien documentada (contiene buenos ejemplos de uso) y eso funciona con seguridad en Android. También la mayoría (si no todas) las técnicas de perforación (STUN, ICE, etc ...) ampliamente disponibles solo funcionan con UDP, lo cual está bien para audio/video y juegos multijugador en tiempo real que pueden perder algunos mensajes, pero para un turno multijugador es importante garantizar la entrega de los datos de cada turno (algo que no es posible directamente con UDP).

¿Alguna idea de cómo lograr una perforación fiable (preferiblemente sobre TCP) entre dispositivos Android detrás de NAT? No tiene que funcionar en el 100% de los casos (algunos NAT extraños pueden no ser compatibles) pero sería bueno si funcionara en la mayoría de los casos.

+0

La solución presentada por Win Myo Htet tiene un gran potencial (usa la propia infraestructura de Google). Sin embargo, todavía estoy interesado en una buena solución para TCP y/o perforación UDP en Android. – petersaints

+0

¿Qué terminaste con @petersaints? – kishu27

Respuesta

8

utiliza xmpp a través de smack over gtalk. No tiene que preocuparse por el servidor y el punto único de falla. deja que Google se preocupe por eso! He escrito Tetris para que juegue contra dos jugadores usando gtalk como capa de comunicación. http://code.google.com/p/tetrads-drop-lite/ Puedes probar MUC si quieres más jugador.

+0

También pensé en usar XMPP. ¿Qué versión de Smack has usado? Parece que el proyecto original no está diseñado para Android, pero hay algunos puertos. Además, ¿es fácil enviar datos a través de XMPP? ¿Solo puede enviar texto o es posible enviar datos binarios? – petersaints

+0

No utilizo el binario pero la fuente para la que tengo que hacer algunos cambios. Puede enviar el binario como una transferencia de archivos entre dos jugadores, no para el MUC.Sin embargo, en ese momento, la transferencia binaria no es tan robusta debido a las diferencias en la forma en que Google implementó el protocolo y la implementación misma no es muy robusta. Una buena noticia es que la nueva versión de smack se ha publicado recientemente y que se ha ocupado de la transferencia de archivos, según he oído. Aún no lo he comprobado. –

+0

Bueno, sí! Aquello podría funcionar. Gracias por los consejos. ¿Podrías decir si la versión de Smack que usaste era de aquí (creo que es la oficial): http://www.igniterealtime.org/downloads/index.jsp#smack Si no, ¿qué puerto de Android usaste? Voy a marcar el mensaje como aceptado más tarde. Porque todavía estoy interesado en la conexión TCP/UDP directa, pero esta es una buena solución (y probablemente menos hacky que la perforación). – petersaints

0

Usted se ve muy obligado a usar un intermediario. Puede buscar Natblaster para un mecanismo que funcione para establecer conexiones TCP entre algunos dispositivos NAT, pero no es algo que pueda usar en Android sin rootear ambos dispositivos. E incluso entonces, es experimental.

Lo mejor es probablemente utilizar un sistema de mensajería federado existente como jabber.

0

UDP no es una entrega confiable pero puede hacerlo confiable al requerir que los paquetes UDP de envío requieran que se devuelvan los reconocimientos. Esto, junto con algunos otros requisitos, es lo que hace que TCP sea confiable sobre IP (lo cual no es confiable para empezar).

Como nota, esto es posible de implementar, pero probablemente llevará mucho tiempo y el costo/beneficio puede no funcionar en su situación.

Cuestiones relacionadas