Lenguaje: C ++
Mi pregunta es la siguiente: me gustaría saber cuál sería la mejor o al menos una buena forma de empacar y enviar datos del cliente al servidor y viceversa. Habrá algunos datos componiendo un solo paquete. Un paquete tendrá un "id", que define para qué sirve, luego los datos en un orden predeterminado para esa "acción" que corresponde al paquete.
Para sistemas menos dependientes del rendimiento, simplemente enviaría cadenas, que estarían separadas por un espacio, siendo ellos los datos de la "acción" y la primera "palabra", el identificador del paquete y simplemente encadenar si las declaraciones verifican cuando hay una coincidencia .
Ahora, para un sistema más crítico, lo que hasta ahora había pensado era algo como esto:
Haga una cadena con la identificación del paquete y los datos, y envíela. Luego, para desempaquetar, podría extraer el primer número entero en la cadena, y al tener una matriz de controladores de paquetes, con índices correspondientes a la identificación del paquete que manejan, y simplemente hacer algo como packetHandlers [packetID] .Process (packetData).
¿Qué opinas de él, alguna sugerencia? muy apreciado!
fuente
¿Por qué usar dos esquemas de codificación diferentes? Simplemente use el segundo para cada sistema. Solo mantenlo simple.
Considere usar la compresión delta. Es decir, enviar un valor completo y después de eso solo las cosas que cambiaron. Después de algunas iteraciones del juego, envíe un valor completo nuevamente.
Otro encodig que podría considerar es Base 128 Varint. Google Protobufs lo usa. Eche un vistazo a la página "Codificación" de su guía para desarrolladores: la codificación de búferes de protocolo podría ahorrar algunos bytes.
fuente
¿Cuál podría ser un ejemplo de los datos que está enviando? No veo ninguna razón para hacer algo demasiado elegante. Una vez que los datos están completamente cargados en el búfer del receptor, inspeccione el primero en
int
función de su valor, luego sabrá cómo procesar el resto de los datos.Por lo que un paquete que consta de cuatro partes de datos
id
,val1
,val2
, yval2
podría tener este aspecto:A medida que lee el primer byte (que sabe que siempre estará allí), decide cómo procesar el siguiente conjunto de datos. Si la primera palabra (id) es
00000001
que sabe que le siguen tres dwords más, y ese es el final del paquete. Para continuar con el ejemplo, es posible que tenga id =00000010
y su especificación se dice que para el valor de ID 2, procesarfloat
,float
,float
en ese orden, lo que podría indicar una posición del jugador en el espacio mundial.Piense en ello como si escribiera su propio sistema de archivos binarios, tiene un valor de encabezado, que describe el resto de los datos, dónde se encuentra (qué posición) y qué tipo de datos se deben tratar.
fuente