jueves, 14 de marzo de 2013

4- El Servidor


Ahora deberías haber comprendido la conexión TCP. Ya con esto es hora de poner manos a la obra.
  Primero que nada, comienza con una base GMK con todas las funciones ya cargadas:


Si observas la rica colección de Scripts, verá miles de cosas.
 Para nuestro juego Online vamos a atrabajar con los comandos TCP (o Scripts que se encuentran en la carpeta Sockets/TCP).

El objeto Server_init inicia el servidor, es decir, lo pone en marcha. En el evento Create, necesitamos colocar el siguiente código:
dllinit(0, true, true);
servertcp = tcpliste(8080,10,1);
En el código anterior, dllinit() es la función requerida para inicializar la DLL, el primer argumento, 0 (cero), tan solo significa que vamos a utilizar el nombre estándar de la DLL "39dll.dll".
Luego, el segundo argumento, un valor booleano, true significa que queremos cargar las funciones para sockets. Los cuales básicamente son esenciales en una conexión TCP. El último parámetro, false, es para cargar las utilidades (Otras funciones, las cuales no entraré en detalles).

Luego creamos la variable "Servertcp", ésta contiene el valor del puerto TCP al cual estamos escuchando. Vemos la funcion tcplisten(8080,10,1), el primer argumento es el puerto que vamos a abrir. Por ejemplo, yo he colocado 8080. Por favor cámbialo, algunas aplicaciones usan dicho número de puerto.
El segundo parámetro, 10, es el máximo de conexiones permitidas. El tercer parámetro:
Se encarga de definir el modo en que funcionará el script al establecer la conexión, tiene 3 modos: - Modo de Bloqueo (Valor del argumento: 0): Al intentar conectar y alestablecer conexión, se congelará la ejecución del juego

- Modo de No Bloqueo [1] (Valor del argumento: 1): Al intentar conectar se pararála ejecución del juego, pero al establecer conexión volverá a la ejecución normal

- Modo de No Bloqueo [2] (Valor del argumento: 2): Nunca se parará laejecución del juego, ni al intentar conectar ni al establecer conexión[...]
Ahora, nuestro objeto Server_init debe tener un evento Step, por cada step verificará si hay una conexión de algún cliente.

 stcp = tcpaccept(servertcp, true);
 if (stcp) {
stsync (stcp,0);
o = instnace_create(x,y,player);
o.tcp = stcp;
setsync(stcp,1); 
 
El  código anterior es ejecutado cada Step. La variable "stcp" es una variable temporal que almacena el ID TCP del cliente. Entraremos en detalle luego...
tcpaccept() acepta la conexión entrante, el primer argumento es el puerto abierto al cual escuchamos si hay conexiones nuevas, el segundo argumento es el modo de bloqueo.


Luego, el comando "Setsync" coloca el bloqueo en off. No tienes que preocuparte mucho por esto.

Nuestro siguiente comando crea un nuevo jugador(No importa donde se cree, este es solo un representante dentro del servidor).
Importante: en el objeto player, cada función del servidor lleva a cabo para cada cliente, cada objeto jugador representa un cliente en la vida real, es decir a otra computadora conectada. O sea, si tienes 13 personas conectadas, debe haber 13 objetos player en el Servidor.

Nota: El cliente, cada vez que envíe datos al servidor, lo estará haciendo al objeto player dentro del servidor ,le corresponda. Este objeto player será quien reciba y envíe los datos. Esto se hará evidente más adelante.

El comando o.tcp = stcp le da al jugador un TCP ID. Esta TCP ID es para identificar como único al objeto jugador (es la forma en que se identifica como único, cada objeto player).
El objeto sabe que es único con esta TCP ID. Haré otro diagrama para ayudarles a visualizar esto.
 Otra vez setsync() coloca el bloqueo en off.




Si comprendes totalmente todo hasta ahora, estás listo para seguir con el resto del tutorial. Si aún tienes problemas lee nuevamente las secciones anteriores.



(Nota como los clientes no se conectan en orden. Primero se conecta el de más arriba y luego el del último. Sin embargo, observa que cada objeto tiene una TCP ID única)


Ahora que entiendes los fundamentos de crear un Hosting (dicho de otra forma, poner en funcionamiento un Servidor) y a esperar conexiones, vamos a echar un vistazo al objeto player.

Lo que hay en el evento Create no tiene mucho sentido ahora.
El evento Step del objeto player es en donde realmente está la gracia, el funcionamiento. Escribiré el código debajo y luego lo explicaré. Por favor si no estás familiarizado con la estructura de control switch y la sentencia break lee el manual de Game Maker.


while(1){ // Loop infinito
msize = receivemessage(tcp);
if (msize == 0) instance_destroy(); 
if (msize <= 0) break;
Switch(mid)
{
case 0: 
break;


case 1:
break; 
}
}
Primero, un while(1) o while(true) es un bucle infinito (o ciclo infinito). Nuestro primer comando "receivemessage()" almacena el mensaje en espera, en la variable "mszie".
Los mensajes que se reciben provienen de tcp, que si recuerdas, lo definimos y declaramos en en "o.tcp = stcp"

El if que le sigue, verifica si "msize" es igual a 0, esto solo ocurrirá si el jugador se desconecta de forma espontánea sin razón. Si no se controla esto los objetos player se acumularían, lo cual no queremos que suceda.

Luego las instrucciones "if (msize <= 0) break;" básicamente verifica si no hay  mensajes que estén en espera. Entonces, si no hay mensajes nuevos, el bucle se reinicia con "break;" luego al comenzar de nuevo el ciclo, verifica si hay nuevos mensajes.

Bien... ahora es donde comienzan los malos entendidos. La declaración "mid = readbyte();" almacena (o guarda) el primer elemento del mensaje en espera, que es un byte Este byte, el primer byte que encabeza le dice al programa qué debe leer como mensaje. No necesariamente debe ser un byte, sin embargo es necesario que el cliente o el servidor conozca el orden de los datos dentro del mensaje. Sigue leyendo hasta la siguiente sección para saber a que se refiere exactamente.

No hay comentarios:

Publicar un comentario