-¿Cual es al diferencia entre programar un juego con modo individual y uno con modo multijugador?
-Ahora, con Java RMI (Java Remote Method Invocation), ninguna.
-¿Y qué es eso Java RMI?
–Es un mecanismo de los programas en Java, para comunicar diferentes máquinas, utilizado en las aplicaciones distribuidas. Para saber mas [1]
-¿Como empiezo a utilizar Java RMI en mis aplicaciones distribuidas?
-Muy fácil, el guión a seguir, sin entrar detalles técnicos, sería:
- Codifique su clase, instánciela y márquela como remota para que esté accesible a través de la red.
- Invoque un método de dicha clase desde cualquier otra máquina.
- Espere el resultado del método (si es que devuelve algún valor) Bibliografia [2][3]
En la situación anterior, si nos encontramos en una partida on-line, sabemos:
- El servidor, el escenario/tablero/circuito y los personajes/fichas/vehículos estarán en el servidor.
- En cada máquina del jugador tendremos un aplicación cliente, que controla los eventos de teclado/ratón/gamepad para enviarlos al servidor.
Para realizar esta comunicación, el caso normal es generar un sistema de comunicación UDP o TCP, con sus socket y métodos, para cuando el jugador quiera comunicar a su personaje (alojado en el servidor)
Pues, Java RMI, ya nos da esa implementación sobre TCP, y gracias a ello nos olvidamos de socket y demás. Simplemente debemos de definir mediante una interfaz, que métodos (en el ejemplo setMovimiento(tipoMovimiento)) podrán ser utilizados remotamente. Creamos el objeto que implemente esa interfaz, en caso del ejemplo: Personaje, creamos una instancia y la registramos en rmiregistry, obtendremos una referencia de objeto remoto, la cual usará el Jugador, para llamar a los métodos remotos que definimos anteriormente. Además, los métodos remotos definidos, pueden lanzar RemoteException, para dar soporte a cualquier tipo de error que pudiera surgir en la llamada, o dentro de la ejecución del método.
Lo importante de todo esto, no es intentar explicar qué y cómo es Java RMI (hay miles de tutoriales por internet), si no saber lo fácil y cómodo que resulta utilizarlo. Me parece muy simple el diseño de las aplicaciones, y por extensión, rápido de entender. En contra veo, puede ser mas lento que la implementación tradicional mediante socket UDP/TCP, ya que cada llamada a un método remoto, implica establecimiento de comunicación TCP, envio y confirmación.
En mi proyecto en cuestión, lo estoy utilizando en muchas funcionalidades a implementar, por ejmplo:
- Un Jugador comprueba si existe un servidor de partidas en una IP determinada, se traduce en un metodo remoto, devolviendo información a cerca del servidor, o RemoteException, si no existe o está disponible dicho servidor
- El jugador anterior, pide unirse al servidor anterior (después de comprobar que está disponible) el método remoto del servidor, le devuelve la referencia del Personaje asignado que entra en la partida.
- En el desarrollo de una partida, un jugador pide constantemente la situación de la partida, devolviendo el servidor un objeto con toda la información de situación de los demás contrincantes.
Páginas web:
[1] Java RMI en la web de Oracle Documentación, artículos técnicos, bugs, tutoriales…
Bibliografia:
[2] Java RMI. Autor: William Grosso Muy bueno, te lo explica desde las bases de RMI sin dejarte ninguna duda técnica.
[3] Aplicaciones distribuidas en Java Bueno para una primera toma de contacto con RMI, se centra demasiado en el ejemplo central. En español.