← Retour LearnBloxLearnBlox

Communiquer client ↔ serveur

Guide intermédiaire

Sur Roblox, un jeu tourne sur deux mondes séparés : le serveur (qui a l'autorité sur tout — argent, dégâts, sauvegarde) et le client, une copie sur l'ordinateur de chaque joueur (qui affiche l'interface et capte les clics). Un LocalScript ne peut jamais modifier directement l'argent d'un joueur — pour de bonnes raisons de sécurité.

Le pont entre les deux s'appelle RemoteEvent (envoi à sens unique) et RemoteFunction (envoi avec réponse). C'est la pièce technique la plus importante de tout jeu Roblox avec de l'interaction.

📦 Créer le RemoteEvent

Dans ReplicatedStorage (visible par le client ET le serveur), crée un RemoteEvent, par exemple nommé AcheterObjet.

1️⃣ Le client envoie une demande
-- LocalScript, sur un bouton "Acheter"
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteAchat = ReplicatedStorage:WaitForChild("AcheterObjet")

script.Parent.MouseButton1Click:Connect(function()
    remoteAchat:FireServer("Epee") -- envoie l'objet demandé
end)
⚠️ Le client ne fait que demander — il ne décide jamais si l'achat est valide. C'est au serveur de vérifier.
2️⃣ Le serveur reçoit et vérifie
-- Script, dans ServerScriptService
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteAchat = ReplicatedStorage:WaitForChild("AcheterObjet")

remoteAchat.OnServerEvent:Connect(function(joueur, nomObjet)
    local leaderstats = joueur:FindFirstChild("leaderstats")
    local argent = leaderstats and leaderstats:FindFirstChild("Argent")
    if not argent or argent.Value < 100 then return end -- pas assez d'argent

    argent.Value = argent.Value - 100
    print(joueur.Name .. " a acheté : " .. nomObjet)
end)
💡 Le premier paramètre reçu côté serveur est toujours le joueur qui a déclenché l'événement — Roblox l'ajoute automatiquement, pas besoin de l'envoyer soi-même.
3️⃣ Prévenir le client en retour
-- Côté serveur, après avoir traité l'achat
remoteAchat:FireClient(joueur, "Achat réussi !")

-- Côté client, écouter la réponse
remoteAchat.OnClientEvent:Connect(function(message)
    print("Serveur dit : " .. message)
end)
🔁 RemoteFunction : quand tu veux une réponse immédiate
-- Côté client : InvokeServer ATTEND la réponse
local possedeObjet = remoteVerif:InvokeServer("Epee")

-- Côté serveur : OnServerInvoke DOIT retourner une valeur
remoteVerif.OnServerInvoke = function(joueur, nomObjet)
    return true -- ou false
end
⚠️ InvokeServer bloque le script client jusqu'à la réponse — à réserver aux vérifications ponctuelles, jamais à une boucle rapide.
✅ Bonnes pratiques & erreurs fréquentes
  • Ne fais jamais confiance à ce qu'envoie le client : un tricheur peut appeler ton RemoteEvent avec n'importe quelle valeur. Vérifie toujours côté serveur (montant, possession, cooldown).
  • RemoteEvent pour une action sans réponse immédiate (acheter, tirer), RemoteFunction seulement si tu as vraiment besoin d'attendre une réponse.
  • Un RemoteEvent par action claire plutôt qu'un seul fourre-tout pour tout le jeu : plus simple à sécuriser et à déboguer.
  • Place les Remotes dans ReplicatedStorage, jamais dans ServerStorage (invisible au client) ni StarterGui.

Va plus loin : sécuriser tes échanges

Ce guide couvre le mécanisme de base. Le module RemoteEvents : Client ↔ Serveur approfondit la sécurisation contre la triche, les limites de fréquence et des exercices pratiques corrigés.

Voir le module gratuitement →