Master client-server communication in Roblox.
Roblox uses a client-server model. Scripts run either on the server or client.
-- Script (ServerScript)
-- Runs on the server
-- Full control over game
-- Cannot access client-specific things
-- LocalScript
-- Runs on the client (player's device)
-- Can access player's camera, mouse, GUI
-- Limited control over server objects
Server controls the game, clients control their local experience.
Send messages between client and server.
-- Create in ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = Instance.new("RemoteEvent")
remoteEvent.Name = "MyRemoteEvent"
remoteEvent.Parent = ReplicatedStorage
Create RemoteEvents in ReplicatedStorage so both client and server can access them.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remote = ReplicatedStorage:WaitForChild("MyRemoteEvent")
remote.OnServerEvent:Connect(function(player, message)
print(player.Name .. " said: " .. message)
-- Server receives player automatically as first argument
end)
Server listens with OnServerEvent. First parameter is always the player who sent it.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remote = ReplicatedStorage:WaitForChild("MyRemoteEvent")
-- Send to server
remote:FireServer("Hello from client!")
-- Additional arguments
remote:FireServer("Jump", 50, true)
Client fires to server using FireServer(). Can send multiple arguments.
-- Server Script
local Players = game:GetService("Players")
local remote = ReplicatedStorage.NotifyEvent
-- Send to specific player
remote:FireClient(player, "You won!")
-- Send to all players
remote:FireAllClients("Game starting!")
Server can send to one player or all players.
Always validate and secure server-side code.
remote.OnServerEvent:Connect(function(player, amount)
-- ALWAYS validate on server!
if typeof(amount) ~= "number" then return end
if amount < 0 or amount > 1000 then return end
-- Check if player can afford
if player.leaderstats.Coins.Value >= amount then
player.leaderstats.Coins.Value -= amount
print("Purchase successful")
end
end)
Never trust client data. Always validate type, range, and permissions.
Create a RemoteEvent that sends messages from client to server.
-- Server Script
local remote = ReplicatedStorage.ChatRemote
-- Listen for messages
local remote = ReplicatedStorage.ChatRemote
remote.OnServerEvent:Connect(function(player, message)
if typeof(message) == "string" and #message > 0 then
print(player.Name .. ": " .. message)
end
end)
Continue your learning journey