advanced
35 min

RemoteEvents & RemoteFunctions

Master client-server communication in Roblox.

Client-Server ModelRemote EventsSecurity

1
Client-Server Architecture

Roblox uses a client-server model. Scripts run either on the server or client.

Script Types

-- 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.

💡 Tips:

  • • Server has authority - never trust the client
  • • Use RemoteEvents for communication
  • • Validate all client requests on the server

2
RemoteEvents

Send messages between client and server.

Creating RemoteEvent

-- 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.

Server Script - Listening

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.

LocalScript - Firing

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 to Client

-- 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.

3
Security Best Practices

Always validate and secure server-side code.

Server Validation

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.

💡 Tips:

  • • NEVER handle important logic on the client
  • • Always validate data sent from the client
  • • Check player permissions before actions
  • • Implement rate limiting for RemoteEvents

Practice Exercises

Exercise 1: Chat System

Create a RemoteEvent that sends messages from client to server.

Starter Code:

-- Server Script
local remote = ReplicatedStorage.ChatRemote

-- Listen for messages
Show Solution
local remote = ReplicatedStorage.ChatRemote

remote.OnServerEvent:Connect(function(player, message)
  if typeof(message) == "string" and #message > 0 then
    print(player.Name .. ": " .. message)
  end
end)

Ready for more?

Continue your learning journey

Executors.Online - Your Roblox Developer Hub