creas un mensaje.
indicas lo que quieres preguntar..
añades parametros, variables o lo que necesites..
lo lanzas..
El solo se encarga de llegar.. "o reintentarlo hasta que llegue con ACK".. y lo mas importante.. se queda esperando la respuesta..
Para captar este tipo de envios solo necesitas pasar los paquetes tipo net_msg a esta funcion que hace de interprete de mensajes:
[Codebox=gemix file=Untitled.gemix]//===========================================================================
function netMessageReceived( netMsg m )
private
int atenderMensaje = false;
begin
// tener en cuenta que todos los campos del objeto netMessage son STRING!!
// incoluso el ORIGEN que indica el id_player que envia el mensaje..
if(exists(idPlayer))
///* SI EL MENSAJE ES PARA MI POR SLOT */
if( m.destino == PHOTON_PLAYER_ID )
atenderMensaje = true;
end
///* SI EL MENSAJE ES PARA TODOS */
if( m.destino < 0 )
atenderMensaje = true;
end
end
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
///* SI TOCA ATENDER EL MENSJAE POR UNO DE LOS MOTIVOS ANTERIORES */
if( atenderMensaje )
switch( m.accion )
/* MENSAJES DE CHAT */
case "chat":
if(STRSTR(net_msg_id_stack.str, m.PacketID) > -1)
//idChat.println("Ya existe en stack!");
else
//idChat.println("tag nuevo! se ha añadido al stack!");
net_msg_id_stack.add(m.PacketID);
idChat.println( strGetToken(m.msg, "#", 1) );
end
end
/* MENSAJES DE TILES DE ZONA */
case "getZone":
//idChat2.println("Cliente: " + itoa(m.origen) + " pide world.zone[" + strGetToken(m.msg,'#', 1) + "," + strGetToken(m.msg,'#', 2) + "]" );
// esta funcion esta en modNetwork.prg..
netSendZone( m.origen, atoi( strGetToken(m.msg,'#', 1) ), atoi( strGetToken(m.msg,'#', 2) ), m.PacketID );
end
/* MENSAJES DE OBJETOS DE ZONA */
case "getObjs":
//idChat2.println("Cliente: " + itoa(m.origen) + " pide objs[" + strGetToken(m.msg,'#', 1) + "," + strGetToken(m.msg,'#', 2) + "]" );
// esta funcion esta en modNetwork.prg..
netSendObjs( m.origen, atoi( strGetToken(m.msg,'#', 1) ), atoi( strGetToken(m.msg,'#', 2) ), m.PacketID );
end
/* MENSAJES DE RECOGIDA DE OBJETOS */
case "getObject":
if(STRSTR(net_msg_id_stack.str, m.PacketID) > -1)
//idChat.println("Ya existe en stack!");
else
net_msg_id_stack.add(m.PacketID);
cx_ = atoi( strGetToken(m.msg,'#', 1) ); // celda X de la recogida del item..
cy_ = atoi( strGetToken(m.msg,'#', 2) ); // celda Y de la recogida del item..
z = world.zone[ xZone, yZone ].objs[ cx_, cy_ ];
idChat.println( players[m.origen].nick + " has get: " + itoa(z) );
world.zone[ xZone, yZone ].objs[ cx_, cy_ ] = atoi( strGetToken(m.msg,'#', 3) ); // item que suelta el player si transportaba algo..
z = world.zone[ xZone, yZone ].objs[ cx_, cy_ ];
if(z == 0)
//idChat2.println( players[m.origen].nick + " no leaves nothing.." ); // si no dejo nada..
else
//idChat2.println( players[m.origen].nick + " leaves: " + itoa(z) ); // si dejo algun objeto..
z = world.zone[ xZone, yZone ].objs[ x, y ];
object( cx_, cy_, z ); // celdaX celdaY graph..
end
updateZoneMapObjects();
netSendACK( m.PacketID, m.origen );
end
end
end
end
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
// + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
return(0);
end
//===========================================================================
//===========================================================================[/Codebox]
Ves, en función de la "accion añadida al mensaje" puedes procesar la peticion, generar un resultado, y enviarlo al que lo ha solicitado.
Los netMessages tienen este cuerpo:
[Codebox=gemix file=Untitled.gemix] /* USER DEFINED NET DATA PACKET */
type netMsg // paquete personalizado..
int packetType = NET_PACKET_MSG;
string PacketID[8]; // identificador de paquete..
string msg[640] = "";
int origen;
int destino;
string accion[32] = "";
end[/Codebox]
Contienen su origen, su destino, la accion que quieren, y en msg[] los parametros.
No falla ni un envio.. mira el codigo de un mensaje:
[Codebox=gemix file=Untitled.gemix]process netMessage( int destino )
private
netMsg myMessage;
string delimitier = "#";
Photon_Packed paquete;
int timeout;
int retry = 3;
int client_target[1] = 0;
methods
//------------------------------------------------------------------------------------
method callback initialize()
begin
timeout = (2*photon_server_ping) + 50; // timeout del mensaje
msgIdCounter = msgIdCounter + 1;
PacketID = itoa(PHOTON_PLAYER_ID) + "-" + itoa(msgIdCounter);
end
//------------------------------------------------------------------------------------
method public setTimeout(int ms)
begin
timeout = ms;
end
//------------------------------------------------------------------------------------
method public add(string s)
begin
myMessage.msg += s;
myMessage.msg += delimitier;
return(0);
end
//------------------------------------------------------------------------------------
method public string get(int num)
begin
//strGetToken( msg, delimiter, num );
return( strGetToken( myMessage.msg, delimitier, num ) );
end
//------------------------------------------------------------------------------------
method public setAction( string action )
begin
myMessage.accion = action;
return(0);
end
//------------------------------------------------------------------------------------
method public size()
begin
return( strtokencount( myMessage.msg, delimitier ) );
end
//------------------------------------------------------------------------------------
method public send()
begin
client_target[0] = destino;
myMessage.PacketID = PacketID;
myMessage.origen = PHOTON_PLAYER_ID; // indica el jugador que crea el mensaje.. necesario para responderle luego..
myMessage.destino = destino; // indica el jugador al que va dirigido el mensaje..
paquete.data = &myMessage; // indica el inicio del mensaje..
paquete.data_length = sizeof(netMsg); // indica el final del mensaje..
if( destino > 0 ) // SI EL DESTINO ES UN SIMPLE NUMERO DE SLOT..
PHOTON_PACK_SENDGROUP( &paquete, true, &client_target, 0); // envio el mensaje a su destinatario..
else
PHOTON_PACK_SEND( &paquete , true); // envio el mensaje a todos los clientes conectados..
end
st = 10;
return(0);
end
//------------------------------------------------------------------------------------
method public delete()
begin
signal(this, s_kill);
return(0);
end
//------------------------------------------------------------------------------------
begin
loop
switch(st)
case 0:
// wait to send msg..
end
case 10:
// msg just sended..
z = GET_MILLISECS();
st = 20;
end
case 20:
// if disconnect from network..
if( !PHOTON_CONNECTED )
signal(this, s_kill);
end
// if timeout..
if( (GET_MILLISECS() - z) > timeout )
if(retry > 0)
retry--;
send();
else
signal(this, s_kill);
end
end
end
end
frame;
end
end[/Codebox]
Conclusion, sistema de mensajes emulando TCP bajo la tecnologia photon jeje, la verdad es que funciona a las mil maravillas
