La bibliothèque net - Partie 4

Envoyer et recevoir des données sous format binaire

La bibliothèque net - Partie 4

Envoyer et recevoir des données sous format binaire

Crée le 18 mars 2021

Envoyer et recevoir des données binaires

Dans cette partie, nous allons parler de l'envoi et la réception de données binaires, ce qui vous permet d'envoyer ce que vous voulez entre le client et serveur.

Attention: il faut éviter d'envoyer des messages trop gros, ceux-ci pourraient déconnecter les joueurs ou tout le serveur La taille maximum d'un message est de 64 kilo-octets (environ 65535 bits)

Compresser des données à envoyer.

La fonction util.Compress() permet de compresser un string en binaire. Ceci est principalement utilisé pour envoyer un string assez large par réseau (comme une table convertie en JSON) ou sauvegarder un fichier plus petit.

Vous pouvez décompresser des données compressées avec util.Decompress().

local json = util.TableToJSON(maTable)
local compressed = util.Compress(json)
local size = #compressed

-- Le net.WriteData() a comme deuxième argument la taille des données à envoyer
-- Pour que le client sache la longueur des données à lire, nous allons l'écrire juste avant.
net.Start("SendTableToClient")
	net.WriteUInt(size , 16)
	net.WriteData(compressed, size)
net.Send(otherPlayer)

-- Coté client
net.Receive("SendTableToClient", function(len, ply)
	local size = net.ReadUInt(16)
	local compressedData = net.ReadData(size)
	
	local json = util.Decompress(compressedData)
	local tbl = util.JSONToTable(json)
	-- Faire quelque chose avec la table compressée reçue
end)

Ces fonctions peuvent être utilisées pour envoyer n'importe quel type de données compressées, pas nécessairement du JSON.

HASH-DOS, ou pourquoi il ne faut pas envoyer des tables en JSON du client au serveur.

Il ne faut surtout pas compresser une table en JSON du client et l'envoyer au serveur.

Bon, j'abuse un petit peu, vous pouvez le faire, et cela fonctionnera parfaitement pour votre utilisation.

Cependant, n'oublions pas les tricheurs. Un tricheur avec un client modifié pourrait s'amuser à convertir une table géante en JSON, la compresser, et l'envoyer au serveur via un de vos messages net.

Votre message net s'attend à une table en JSON compressée et va la décompresser. Première erreur:

  • util.Compress() et util.Decompress() ne sont pas gratuits en performance, et vont prendre du temps. Généralement presque instantané tant qu'il n'y a pas beaucoup de données.
  • Même chose pour util.JSONToTable() et util.TableToJSON(), plus la table et grande, plus cela prendra du temps.

Disons que notre tricheur vous envoie une table en JSON compressé qui contient 50 000 valeurs. Votre serveur va complètement se bloquer pour la lire, et risque bel et bien de planter. Voilà pourquoi il ne faut jamais tenter de convertir une table JSON reçue du client, et éviter la réception de données compressées côté serveur.

Comment envoyer une table de manière optimisée et propre?

Ceci est ce que nous allons aborder dans la prochaine partie de cette série. Bien sûr, nous allons parler de net.WriteTable() et pourquoi il ne faut surtout pas l'utiliser.

Oui, vous pouvez suer, je sais bien que vous l'utilisez tout partout. Ne vous inquiétez pas, nous allons parler d'une alternative plus optimisée.

Envie de lire la suite de ce tutoriel ?

Connecte-toi dès maintenant, et accède entièrement à tous les tutoriels de GCA !

#Garry's Mod

#gLua

#dev

Écrit par Erlite#1337

5

Sommaire