Envío/Recibo de datos. [11.x/9.x]

Ir abajo

Envío/Recibo de datos. [11.x/9.x]

Mensaje por Toyz el 6/1/2017, 2:06 am

Bueno tuve que hacer algunos trabajos para esta versión y me tuve que poner a ver cómo funciona el protocolo de esta versión. Sé que más de uno lo sabe pero para los que son nuevos y empiezan en esta versión o los que se pasan de 12.x/13.x para estas versiones les va a venir más que bien :p

Primero que nada aviso que tendrán que saber qué es:
Método.
Llamadas.
Variables.
Parámetros.
Las funciones:
UCase()
Left()
CBool()
CInt()
CLong()
Len()
Asc()
Todas se encuentran en la MSDN y son fáciles de entender.

Segunda cosa: no recomiendo usar esta versión.

Un thread que los puede ayudar: http://www.gs-zone.org/temas/conceptos-basicos-sobre-visual-basic.5388/

Como enviar datos desde el cliente al servidor:

Varias veces se envía datos desde el cliente al servidor, como por ejemplo cuando se ejecuta un comando, cuando se mueve el personaje, cuando tirás un hechizo, etc.

¿Cómo se logra esto?

En el cliente cada vez que hacemos una acción tenemos que mandar una cadena de caracteres al servidor.

¿Cómo envío en una cadena de caracteres al servidor? ¿Qué mando en esa cadena?

En el cliente tenemos un método que se llama SendData el mismo tiene un parámetro en donde tenemos que pasar la cadena que va a ir al servidor. En esa cadena tenemos que enviar un identificador como un "CADENA1" más toda la información que queramos que el servidor reciba. La información que vos querés enviar al servidor debe estar separada por "-" menos el identificador.

Un ejemplo para ser más claro.
Ponele que yo quiero enviar un reto a otro usuario, lo que debo hacer es:
Código:

Dim Cadena as String

Cadena = "RETO1VS1PEPITO-10000-0"
Que se traduce a:

"Reto 1vs1 (identificador), nick al que envío, cantidad de oro, caen o no objetos"

Y esto lo podemos aplicar a un formulario por ejemplo:

Un text en donde tengamos que poner el nombre del oponente llamado "oponente_txt"
Un text en donde tengamos que poner la cantidad de oro a retar "oro_txt"
Un check en donde tengamos que poner si caen o no objetos "objetos_check"
Un botón en donde tengamos que apretar para enviar el reto "EnviarReto_cmd"

Entonces al apretar en el botón ponemos:
Código:

Private Sub EnviarReto_cmd_Click()
Dim strData as String '<- Para almacenar lo que vamos a enviar y que sea un poquito más ordenado.

'Acá llenamos la variable con toda nuestra información.
StrData = "RETO1VS1" & oponente_txt.text & "-" & oro_txt.text  & "-" & objetos_check.value
Call SendData(strData) '<- Enviamos la variable que almacena toda la data.
End Sub

Ahora tenemos que ir a la parte del servidor.

En el servidor tenemos un método que recibe la data que acabamos de enviar en el cliente:

Que es este:
Código:

Sub HandleData(UserIndex As Integer, ByVal rdata As String)
Userindex es el usuario que lo mandó y rdata la información que mandó.

En el mismo método abajo de todo esto:

Código:

Dim Procesado As Boolean

If UserList(UserIndex).Counters.Saliendo Then
    UserList(UserIndex).Counters.Saliendo = False
    UserList(UserIndex).Counters.Salir = 0
    Call SendData(ToIndex, UserIndex, 0, "{A")
End If

If Left$(rdata, 1) <> "#" Then
    Call HandleData1(UserIndex, rdata, Procesado)
    If Procesado Then Exit Sub
Else
    Call HandleData2(UserIndex, rdata, Procesado)
    If Procesado Then Exit Sub
End If

Tenemos que identificar qué información mandamos desde el cliente que esta ahora se almacena en "RDATA", si recuerdan tenían que enviar un identificador en la data, bueno, ese identificador sirve para saber qué acción debemos hacer con la información enviada.

Ahora... ¿Cómo sabemos qué acción debemos hacer?

Tenemos que saber si el identificador de RDATA es el mismo que enviamos desde el cliente.

¿Cómo hacemos esto?

Hay que cortarle a rdata (que, repito, es la información que mandamos desde el cliente) la cantidad de caracteres que tiene nuestro identificador y pasar toda esa cadena cortada a mayúscula. Una vez hecho esto tenemos que comparar la cadena que nos quedó con nuestro identificador.

Ejemplo:
Código:

If UCase$(Left$(rdata, 8)) = "RETO1VS1" Then

¿Qué hace ese código?

Lo siguiente:

Corta, con la función left, la cadena rdata desde izquierda a derecha la cantidad de caracteres que tiene nuestro identificador. Después con UCase$ lo pasamos a mayúscula, toda esa cadena que nos queda la comparamos con RETO1VS1.

Entonces ahora... si concuerda ¿Qué hacemos?

Si la data que tenemos tiene datos adicionales tenemos que sacar el "retos1vs1" de la cadena e ir separando la cadena con readfield e ir poniendo toda la información en variables.

Sigamos con el ejemplo de retos1vs1:

Código:

If UCase$(Left$(rdata, 8)) = "RETO1VS1" Then
    Dim Oponente as String
    Dim Oro as Long
    Dim CaenObjetos as Boolean

    rdata = Right$(rdata, Len(rdata) -
    Oponente = Readfield(1, rData, Asc("-"))
    Oro = CLng(2, rData, Asc("-"))
    CaenObjetos = CBool(3, rData, Asc("-"))

    Exit Sub
End If

¿Qué hicimos con esto?

   rdata = Right$(rdata, Len(rdata) - Cool

Cortamos el "RETO1VS1" de la cadena. Ahora la cadena queda así: "OPONENTE-ORO-CAENOBJETOS"

  Oponente = Readfield(1, rData, Asc("-"))

Con esto cortamos la cadena hasta el primer "-" y lo guardamos en la variable oponente.

   Oro = CLng(2, rData, Asc("-"))

Con esto cortamos la cadena desde el primer "-" hasta el segundo "-" y convertimos esa cadena en Long y lo guardamos en la variable.

   CaenObjetos = CBool(3, rData, Asc("-"))

Con estos cortamos la cadena desde el segundo "-" hasta el tercer "-" y convertimos esa cadena en Boolean.

   Exit Sub

Con esto salimos del método ya que logramos encontrar el identificador, por lo tanto no es necesario seguir buscándolo.

Con esto ya enviamos la data que necesitábamos desde el cliente al servidor. Esto ya es todo, después ustedes manejan esa información como quieren.

Ahora como enviar datos del servidor al cliente, esto va a ser más fácil ya que tenemos varios conceptos aclarados.

En el servidor tenemos un método igual que el cliente  SendData(sndRoute As Byte, sndIndex As Integer, sndMap As Integer, sndData As String) paso a explicar los parámetros.

sndRoute, este parámetro sirve para saber a qué usuario/s le vas a mandar, tiene varias opciones:

ToIndex que es para enviarle a un sólo usuario.
ToMap que es para enviarle a todos los que estén en el mapa.
ToPCArea que es para enviarle a todos los que están dentro del área del usuario que recibe la información.
ToAll que es para enviarle a todos los usuarios.
Hay bastantes más que lo podés ver dentro del método SendData pero los que nombré son los más utilizados.

Después tenemos a sndIndex que es el usuario que va a recibir la data (a este parámetro se le puede poner 0 cuando usamos ToAll o ToMap).

sndMap es al mapa que queremos que envíe la data (en caso de que se use ToMap, se pone en 0 si se usa ToAll)

sndData que es lo que le vamos a enviar al cliente.

Acá un ejemplo:
Código:

Call SendData(ToAll, 0, 0, Data que enviamos al cliente)
Como hacíamos de cliente a servidor, en este caso también tendremos que enviar un identificador al cliente.

Ejemplo:
Código:

Public Sub Test(Byval UserIndex as Integer)
Dim Cadena as String '<--- Variable

Cadena = "TESTHola" '<--- Almacenamos lo que vamos a enviar. IDENTIFICADOR + DATA

Call SendData(ToIndex, UserIndex, 0, Cadena) '<---- Lo enviamos.

End Sub
Ahora tenemos que pasar al cliente.

En el cliente tenemos esto:
Código:

Sub HandleData(ByVal Rdata As String)
El parámetro rData es lo que enviamos desde el servidor, en este caso, "TEST Hola" (sin comillas)

En el mismo método tenemos varios select case que ya cortan la cadena una cierta cantidad de caracteres para poder encontrar el identificador más rápido.

En el mismo método podemos encontrar desde select case que tengan para comparar desde 1 caracter hasta 9. En este caso el identificador tiene sólo 4 caracteres por lo tanto buscaremos el que select case que busque desde 4 caracteres que en este caso es:  
Código:

Select Case Left$(sdata, 4)
Ahí mismo agregamos:

Case "TEST"

y a partir de eso manejamos la información como queramos, por ejemplo:
Código:

Case "TEST"
Msgbox "El mensaje enviado desde el servidor es " & rdata
Recuerden que al enviar más de 3 datos tienen que separar la cadena con "-" para poder separarla con readfield cuando llegue al cliente (tal como lo hicimos del cliente al servidor). El identificador ya lo corta el mismo select case.


Espero que les sirva el aporte, si hay alguna parte que no entiende me avisan y la pongo más explícita. Si encuentran un error de redacción me avisan así lo arreglo. Si hay algo erróneo en la explicación también avisen :p

Adiós.


Última edición por Toyz el 30/8/2017, 1:36 am, editado 1 vez


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: Envío/Recibo de datos. [11.x/9.x]

Mensaje por eennrii el 24/2/2017, 5:02 pm

Muy bueno la verdad y muy bien Explicado.

para los q recien empezamos nos sirve

eennrii
Nivel 1
Nivel 1

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 6
Localización : corrientes
Fecha de inscripción : 15/11/2015

Ver perfil de usuario

Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.