No es la primera vez que hablo de Node.js o de Socket.io en el blog, ni creo que sea la ultima, en esta ocasión he realizado una pequeña aplicación para jugar al tres en raya mientras hablamos con el resto de jugadores mediante un chat.

Su funcionalidad en sí en bastante sencilla, solo se permite una partida a la vez ya que no hago uso de “rooms” (salas), cosa que me gustaría tocar en el blog pronto. Para empezar introducimos nuestro nombre y ingresamos al chat, el tablero de juego es visible desde el comienzo, si hay jugadores en plena partida podemos observar como evoluciona ésta, si no hay jugadores podemos unirnos y esperar un contrincante. El chat nos indica quien entra o sale de la aplicación y quien gana y pierde la partida en curso.

Vamos a lo interesante, la tecnología que hay detrás de la aplicación, he tratado de comentar todo lo posible el codigo así que explicaré ligeramente solo algunos detalles.

Primero el cliente; Como verás en el código no he usado ningún sistema de plantillas, simplemente sirvo un fichero html que se encuentra en el directorio “/public”. En esta ocasión tampoco he usado el elemento canvas, sino que uso divs y los altero mediante Javascript (Jquery), mostrando así lo que el servidor le indica a través de los websockets. He usado LessCSS para el estilo, pero es todo muy minimalista, lo uso por comodidad realmente.

La aplicación no usa base de datos, por lo que para almacenar los nombres de usuarios online y no repetirlos uso un array, que se comprueba cada vez que ingresa un nuevo jugador, sobra decir que al cerrar y abrir la app perdemos todos los usuarios, además para evitar inyección de código he usado el modulo “sanitizer”.

Lo mejor de Socket.io es que la información referente al socket está en formato JSON por lo que aprovecho para guardar el nombre del usuario como parte de el, en socket.nick, y así poder identificar al usuario fácilmente. Por ejemplo es útil cuando se desconecta un usuario compruebo el nick y lo elimino del array de usuarios y anuncio su desconexión al resto de jugadores.

Otro punto que me gustaría comentar es el uso de callbacks al emitir información mediante socket.io, yo lo he usado por ejemplo para medir la latencia, pero es realmente útil. Normalmente vemos ejemplos en los que emitimos un evento mediante socket.emit y recibimos respuesta mediante socket.on, algo así:

Cliente:

socket.emit('hola', true); socket.on('hola', function(){});

Server:

socket.on('hola', function(data){ 
    if(data)socket.emit('hola', true); 
});

Pero si nuestro propósito es enviar una información y dependiendo de la respuesta realizar una determinada acción siendo siempre el mismo usuario, ¿Por que no usar un callback?, sería mucho más eficiente:

Cliente:

socket.emit('hola', true, function(data){});

Server:

socket.on('hola', function(data, callback){ 
    if(data){ 
        if(callback && typeof callback == 'function'){
            callback(data); 
        } 
    }
});

No me quiero enredar demasiado ni explicar cosas que ya estén explicadas en el código, así que os dejo un enlace a la demostración y al código alojado en github.

Github:https://github.com/Nazariglez/3enraya-nodejs-socketio
Demo:http://www.estoycreando.com/3enraya/