GS-Zone

[ DESTACADO ] Protocolo Binario Ir al Indice

Moderadores: Moderadores de Argentum, Especialistas de Argentum, Especialistas de Programación

25

Nota » 29 Ago 2010 17:59

Aca les pienso explicar un poco el funcionamiento del protocolo binario. No lo use mucho pero con esto no me ha generado ningun error hasta el momento lo que indica que funciona.

Primero vamos a ver como se envia un Comando del Servidor hacia el Cliente. Es un poco mas largo que en verciones anteriores, pero no es mas complicado.

Lo primero que hacemos:

Declaramos el ServerPacketID

Existe un Enum llamado ServerPacketID


Aqui se guardan los identificadores de los paquetes.

Entonces lo que vamos a hacer es crear un nuevo identificador:



Este lo Agregamos al final del Enum.


Ahora llegamos al punto de tener que usar el identificador, ya sea para enviar mas datos o para accionar algo en el cliente.

Entonces lo que hacemos es crear el Sub Correspondiente que enviara el dato.

Para esto se crea un Write (Se utiliza el Write para reconocer facilmente la escritura de datos. Tambien se puede usar el que uno quiera) + Nombre del Indetificador

Entonces nos quedaria algo como:

WritePrueba

Esto es un Sub en donde se graban los datos a enviar.

Lo que hay que hacer es bastante sensillo:

  1. On Error GoTo Errhandler
  2.      
  3.         Call UserList(UserIndex).outgoingData.WriteByte(ServerPacketID.Ejemplo)
  4. Call UserList(UserIndex).outgoingData.WriteLong(123123123)
  5. Call UserList(UserIndex).outgoingData.WriteInteger(32000)
  6. Call UserList(UserIndex).outgoingData.WriteASCIIString("Yo tengo un sapo que se llama pepe")
  7. Exit Sub
  8.  
  9. Errhandler:
  10.     If Err.Number = UserList(UserIndex).outgoingData.NotEnoughSpaceErrCode Then
  11.         Call FlushBuffer(UserIndex)
  12.         Resume
  13.     End If



Explicacion:



Aca le estamos diciendo que si hay algun error valla al manejador de errores.

  1. Call UserList(UserIndex).outgoingData.WriteByte(ServerPacketID.Ejemplo)


Aca estamos enviandole al cliente el serverpacketid. Con esto el cliente sabra donde posicionarse para hacer la accion.

  1. Call UserList(UserIndex).outgoingData.WriteLong(123123123)
  2. Call UserList(UserIndex).outgoingData.WriteInteger(32000)
  3. Call UserList(UserIndex).outgoingData.WriteASCIIString("Yo tengo un sapo que se llama pepe")


Aca le estamos enviando los datos al cliente.

Lo unico a tener en cuenta es que tienen que saber que datos se estan enviado para poder grabar con su correspondiente valor. Por ejemplo un WriteByte no va a enviar un Entero Largo.

Si tienen dudas en cual usar miren la clase ClsByteQueue

Ya con esto armamos el "ENVIO" del paquete, pero si el cliente no se entera para que le sirven estos datos no sirve para nada..

Entonces ahora vamos al cliente:

Del mismo modo que en el servidor declaramos el ServerPacketID justo en la misma posicion que lo Pusieron en el servidor(Al final).


Ahora llega la parte en la que el cliente tiene que saber de que paquete se esta hablando:

Entonces buscamos el Select Case ServerPacketID

Y le Agregamos el caso correspondiente:

Case serverpacketid.Prueba

A continuacion en una nueva linea debajo del case le agregamos:

call HandlePrueba (Puede ser Handle como pepito. )

Pero.. QUe tiene el handle?

No es mas ni menos que la lectura de los valores que le envio el servidor:

  1. Public Sub HandleEjemplo()
  2.  
  3.     Call incomingData.ReadByte
  4.  
  5. Oro= incomingData.ReadLong()
  6. Vida=incomingData.ReadInteger()
  7. Nombre=incomingData.ReadASCIIString()
  8.  
  9.  
  10. End sub
  11.  



Lo que estamos haciendo aca es lo siguiente:




Ahi removemos el ServerPacketID que le enviamos para identificar al paquete.



Aca estamos leyendo el primer valor que mandamos. Como mandamos un Long leemos un Long



Aca estamos leyendo el segundo valor que le enviamos. Como era un Integer, leemos un integer.

  1. Nombre=incomingData.ReadASCIIString()


Aqui Leemos el ultimo valor enviado, y como era Texto lo leemos como tal.

Ahora ya le asignamos los valores de los datos enviados a variables propias.

Y ahora solo queda hacer lo que harian normalmente:

Ejemplo

Despues de esas lineas agregas:



Bueno Ahi finaliza la Guia para Enviar un Comando del Servidor al Cliente.

Cuando tenga tiempo le agrego la otra parte. Es igual solo cambian dos lineas como mucho pero para despistados lo pongo luego.

Cualquier Sugerencia y/o error me avisan por favor.

PARTE 2: protocolo_binario_parte_2_tiNs.html

Por mAthi
Este mensaje ha obtenido 11 Monedas de Oro.


Imagen
Imagen
Imagen
Emociona hasta las lágrimas la lucha de este guerrero;
40 millones de huevos en un solo corazón.
Deja la vida por River. River para él es la vida.
Gracias Matias Jesus por tanto.
RATA BLANCA RIVER PLATE
290 (+2)
Moderador AO
Señor Moderador (3) Señor Reglamento (1) Aportes (2) Embajador (3) Detector de Bugs (1)
Premios: 10
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Villa adelina, Vicente Lopez.
Mensajes: 13474
Aportes: 298

Nota » 29 Ago 2010 18:04

Excelente guía Franeg ^^, con esto se debería disipar las multitudes de dudas que surgen cuando migran de versión.


Te lo pongo como destacado, va de una ;) (y aporte, claro está).

"El patriotismo es un egoísmo en masa."

-Grafiti del Mayo Francés
La venganza es un placer
215
Moderador Global
Campeón de Truco (1)
Premios: 1
Registrado: 5 Años de membresía!
Mensajes: 7953
Aportes: 26

Nota » 29 Ago 2010 19:03

Buenísimo Franeg.
Ya me lo pongo a leer ya que me interesa mucho está versión. Ahora voy a ver si puedo hacer algo bueno ^^

Imagen
pro55 escribió:esto llega a ser top y me corto la pija y subo certificada


Programming my world
210
Moderador AO
Embajador (2)
Premios: 2
Registrado: Años de membresíaAños de membresía
Ubicación: Buenos Aires> Lanus Oeste
Mensajes: 3127
Aportes: 50

Nota » 29 Ago 2010 21:08

Pregunto, Disculpen la Ignorancia... Pero para que serviria esto.?

About escribió:Off: Ah, so corte war lvl 49 en la vida real. Re duro.com

On: ¿?

Imagen
Imagen
191
Destructor de Mentes [6]
Embajador (1)
Premios: 1
Registrado: Años de membresía
Mensajes: 780
Aportes: 2

Nota » 29 Ago 2010 21:14

Hermoso y muy fácil de entender, hace un tiempo un amigo me había hecho una guía parecida, MUY UTIL...

All we need is love
185
Oraculo [4]
Mister Programador AO (1)
Premios: 1
Registrado: Años de membresíaAños de membresía
Ubicación: Mar del Plata
Mensajes: 1894
Aportes: 30

Nota » 29 Ago 2010 21:24

Shycker escribió:Pregunto, Disculpen la Ignorancia... Pero para que serviria esto.?

Entender el protocolo que utiliza la versión 0.12 y 0.13 del Argentum Online.


A ver si alguien me puede responder esta duda que me persigue desde hace tiempo. ¿Qué ocurre si envío dos variables del mismo tipo? ¿Cómo hago para leerlas?

"El patriotismo es un egoísmo en masa."

-Grafiti del Mayo Francés
La venganza es un placer
215
Moderador Global
Campeón de Truco (1)
Premios: 1
Registrado: 5 Años de membresía!
Mensajes: 7953
Aportes: 26

Nota » 29 Ago 2010 21:29

Mira como puse aca:

Call UserList(UserIndex).outgoingData.WriteLong(123123123)
Call UserList(UserIndex).outgoingData.WriteInteger(32000)
Call UserList(UserIndex).outgoingData.WriteASCIIString("Yo tengo un sapo que se llama pepe")

Ahi estoy Mandandole 3 datos.

En el Cliente lo resibo del mismo modo que lo envio (En el mismo orden)

Oro= incomingData.ReadLong()
Vida=incomingData.ReadInteger()
Nombre=incomingData.ReadASCIIString()

Era eso lo que preguntabas?

Imagen
Imagen
Imagen
Emociona hasta las lágrimas la lucha de este guerrero;
40 millones de huevos en un solo corazón.
Deja la vida por River. River para él es la vida.
Gracias Matias Jesus por tanto.
RATA BLANCA RIVER PLATE
290 (+2)
Moderador AO
Señor Moderador (3) Señor Reglamento (1) Aportes (2) Embajador (3) Detector de Bugs (1)
Premios: 10
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Villa adelina, Vicente Lopez.
Mensajes: 13474
Aportes: 298

Nota » 29 Ago 2010 21:33

Franeg95 escribió:Mira como puse aca:

Call UserList(UserIndex).outgoingData.WriteLong(123123123)
Call UserList(UserIndex).outgoingData.WriteInteger(32000)
Call UserList(UserIndex).outgoingData.WriteASCIIString("Yo tengo un sapo que se llama pepe")

Ahi estoy Mandandole 3 datos.

En el Cliente lo resibo del mismo modo que lo envio (En el mismo orden)

Oro= incomingData.ReadLong()
Vida=incomingData.ReadInteger()
Nombre=incomingData.ReadASCIIString()

Era eso lo que preguntabas?



creo que se refiere a que si envia por ejemplo

Call UserList(UserIndex).outgoingData.WriteInteger(32000)
Call UserList(UserIndex).outgoingData.WriteInteger(31000)

dos WriteIneger... creo

Imagen
Mi firma es la original, el resto son todos Ripeos.
Lord Fers escribió:llegué a llorar muchas veces por el AO, cuando salí con 100k y pico y en 4 ladris me robaron hasta dejarme en 93k por ahí. Apareció tremendo PK, y me metió un Apoca que nunca más me lo olvidé. TODO EL ORO A LA MIERDA.

JAJAJAJAJAJA
Pensar Distinto.
7
Oraculo [2]
Mister S.O.S. (1) Embajador (1)
Premios: 2
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Olivos.
Mensajes: 1446
Aportes: 12

Nota » 29 Ago 2010 21:34

Si es eso se hace siempre lo mismo:

readinteger

readinteger

Imagen
Imagen
Imagen
Emociona hasta las lágrimas la lucha de este guerrero;
40 millones de huevos en un solo corazón.
Deja la vida por River. River para él es la vida.
Gracias Matias Jesus por tanto.
RATA BLANCA RIVER PLATE
290 (+2)
Moderador AO
Señor Moderador (3) Señor Reglamento (1) Aportes (2) Embajador (3) Detector de Bugs (1)
Premios: 10
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Villa adelina, Vicente Lopez.
Mensajes: 13474
Aportes: 298

Nota » 29 Ago 2010 21:40

Franeg95 escribió:Si es eso se hace siempre lo mismo:

readinteger

readinteger

¿Entonces se envían en orden? Sería como esto:
  1. Call SendData(ToIndex, UserIndex, 0, "HOLA" & Var1 & "," & Var2 & "," & Var3 & "," & Var4)

O sea, el "," se usa como identificador para ver los paquetes que llegan y utilizar el Readfield. Acá se omitiría el tema del Readfield pero se seguiría mandando en orden.

Curioso...

"El patriotismo es un egoísmo en masa."

-Grafiti del Mayo Francés
La venganza es un placer
215
Moderador Global
Campeón de Truco (1)
Premios: 1
Registrado: 5 Años de membresía!
Mensajes: 7953
Aportes: 26

Nota » 29 Ago 2010 21:49

  1. Call SendData(ToIndex, UserIndex, 0, "HOLA" & Var1 & "," & Var2 & "," & Var3 & "," & Var4)


Eso lo mandas asi:

Primero:

Le mandamos el paquete:

Writebyte(ClientPacketID.Paquete)

Luego le mandas asi:

WriteASCIIString("HOLA")

WriteTipodeDAto(var1)
WriteTipodeDAto(var2)
WriteTipodeDAto(var3)
WriteTipodeDAto(var4)

Esto sirve, ahora si hay mejores metodos, eso no lo vi.

Por ejemplo esto se emplea en el servidor en lo que seria el nuevo senduserstatsbox

Imagen
Imagen
Imagen
Emociona hasta las lágrimas la lucha de este guerrero;
40 millones de huevos en un solo corazón.
Deja la vida por River. River para él es la vida.
Gracias Matias Jesus por tanto.
RATA BLANCA RIVER PLATE
290 (+2)
Moderador AO
Señor Moderador (3) Señor Reglamento (1) Aportes (2) Embajador (3) Detector de Bugs (1)
Premios: 10
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Villa adelina, Vicente Lopez.
Mensajes: 13474
Aportes: 298

Nota » 29 Ago 2010 22:19

Buenisimo Franeg :D, sirve de mucho esto ! :D...

Saludos

Imagen
By Francoxe
^[ Inbooker Ao ]^ Busca Programador con mucha exp.
35
Oraculo [2]
Embajador (1)
Premios: 1
Registrado: Años de membresía
Mensajes: 1355
Aportes: 5

Nota » 29 Ago 2010 23:16

Buenisimo!!!, ya tenia idea de esto pero para la 13.0 cambia, asi que gracias !!!

Imagen
:!: :!: :!: :!:
18 (+5)
Oraculo [1]
Registrado: Años de membresía
Mensajes: 1194
Aportes: 13

Nota » 31 Ago 2010 08:35

la verdad qe muy buena guia fran! sobre todo para los qe recién empiezan en esto qe es programación de ao =P

lo del cliente al servidor es todavía más fácil! pero bueno como hay muchos qe no saben , les vendría bien una "guía" como esta.

Nunca entendí para que se usa el asciistringfixed =$

maTih.-

mAnco programEr
297 (+5)
Oraculo [5]
Registrado: Años de membresía
Ubicación: Bolivia
Mensajes: 1994
Aportes: 90

Nota » 31 Ago 2010 10:30

maTih.- escribió:la verdad qe muy buena guia fran! sobre todo para los qe recién empiezan en esto qe es programación de ao =P

lo del cliente al servidor es todavía más fácil! pero bueno como hay muchos qe no saben , les vendría bien una "guía" como esta.

Nunca entendí para que se usa el asciistringfixed =$

maTih.-


Sirve para mandar cadenas de una longitud fija.
Por ej:
writeasciistringfixed ("HOLA")
--
miString = readasciistringfixed (4)

Tenes que saber la longitud de la cadena a leer.
Última edición por TwIsT el 31 Ago 2010 10:30, editado 1 vez en total

GrafionAO.com.ar
196
Destructor de Mentes [8]
Embajador (1)
Premios: 1
Registrado: Años de membresíaAños de membresíaAños de membresíaAños de membresía
Mensajes: 895
Aportes: 2

Siguiente

Volver a AO 0.13.x

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados