watcher studio nsd android sockets connection p2p

studio - Android P2P(conexión directa) a través de Internet(detrás de NAT)



peer to peer android (3)

Estás bastante obligado a usar un intermediario. Puedes buscar en Natblaster un mecanismo que funcione para establecer conexiones TCP entre algunos dispositivos con NAT, pero no es algo que puedas usar en Android sin enraizar ambos dispositivos. Y aun así, es experimental.

Lo mejor es probablemente usar un sistema de mensajería federada existente como jabber.

Estoy empezando un pequeño proyecto, básicamente una variación multijugador (como en más de dos jugadores) del clásico juego de Battleship.

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 usar un servidor HTTP central como el centro central para la comunicación (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 que tenga acceso a Internet, debería funcionar perfectamente, ya sea que esté detrás de un NAT o no.

Sin embargo, la solución propuesta tiene la desventaja de que existe un único punto de falla / carga adicional (el servidor web). Así que me gustaría probar otras opciones. Pensé en hacer conexiones directas utilizando Sockets entre los clientes (con el servidor web recién utilizado como punto de encuentro inicial), sin embargo, esto solo funcionaría bien si todos los dispositivos estuvieran en la misma red. Teniendo en cuenta que hoy casi siempre estamos detrás del NAT de un enrutador, ¿cómo puedo lograr una comunicación directa? He estado leyendo sobre perforaciones, pero no puedo encontrar ninguna buena biblioteca que esté bien documentada (que contenga buenos ejemplos de uso) y que funcione en Android con seguridad. Además, la mayoría de las técnicas de perforación (si no todas) (STUN, ICE, etc ...) ampliamente disponibles solo funcionan con UDP, lo cual está bien para juegos de multijugador de audio / video y 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).

Entonces, ¿alguna idea de cómo lograr una perforación confiable (preferiblemente a través de TCP) entre dispositivos Android detrás de NAT? No tiene que funcionar en el 100% de los casos (es posible que algunos NAT desconocidos no sean compatibles), pero sería bueno si funcionara en la mayoría de los casos.


UDP no es una entrega confiable, pero puede hacerlo confiable al requerir que el envío de paquetes UDP requiera que se envíen reconocimientos. Esto, junto con algunos otros requisitos, es lo que hace que TCP sea confiable a través de IP (que para empezar no es confiable).

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


utilizar xmpp a través de smack sobre 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 hacerlo jugar 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.