Beginner-friendly ESP32 WebSocket tutorial covering server, client, async WebSocket, ESP32-CAM streaming, real-time control, and complete step-by-step examples.
Learn WebSockets on ESP32 like you’re chatting with a friend over coffee.
If you’ve ever tried building real-time IoT projects, you already know the struggle. You change a sensor value or press a button, and then… the browser takes a second to refresh. That’s the traditional HTTP way. It works, but it’s far from smooth.
Now imagine your browser talking to your ESP32 instantly almost like a WhatsApp chat. No refreshing. No constant requests. Just pure, real-time communication.
That’s exactly what esp32 websocket gives you. In this tutorial, we’ll start from zero and walk step by step until you build fast, responsive, real-time apps using esp32 websockets, esp32 websocket server, esp32 websocket client, ESP32 Arduino WebSocket client, and even ESP32 CAM WebSocket streaming.
By the time you reach the end, you’ll understand everything from concepts to real code even if you’re a beginner.
Let’s dive in.
What Is a WebSocket?
Let’s forget technical terms for a moment.
Think of HTTP as placing an order at a restaurant.
You ask for food → Wait → Food arrives → End.
Now think of WebSocket as sitting on a group chat.
Everyone sends and receives messages instantly.
WebSockets create a two-way connection between your ESP32 and a browser (or phone, laptop, or anything connected).
No need to “request” repeatedly.
Both sides can send data anytime.
That’s why esp32 websockets are perfect for:
- live sensor dashboards
- real-time motor control
- smart home switches
- live ESP32 CAM video streaming
- multiplayer games
- home automation control panels
If your project needs speed and instant updates, WebSocket > HTTP. Every time.
Why Use WebSockets on ESP32?
Let’s keep it simple — WebSockets solve three big problems:
1. Real-time updates
With HTTP, the browser only gets new data when it asks for it.
With WebSockets, your ESP32 pushes updates instantly.
2. Less network load
Traditional HTTP polling floods your network with requests.
WebSockets keep one connection open and fast.
3. Two-way communication
Perfect for control dashboards where you want to send AND receive.
This is why frameworks like esp32 async websocket, arduino esp32 websocket, and websocket arduino esp32 are so popular.
Understanding ESP32 WebSocket Architecture
Here’s the coffee-table explanation.
ESP32 WebSocket Server
ESP32 creates the connection.
Browser connects to ESP32.
ESP32 reacts and pushes updates.
Used for:
- dashboards
- IoT control panels
- sensor monitoring
This is called an esp32 websocket server example when shown in code.
ESP32 WebSocket Client
ESP32 connects to another WebSocket server.
For example:
- Cloud WebSocket service
- Node.js server
- Remote automation system
This is where terms like esp32 websocket client, esp32 websocket client arduino, and esp32 arduino websocket client fit naturally.
Tools You Need Before Starting
ESP32 board
Any ESP32 board works (NodeMCU ESP32, ESP32-DevKit, etc.)
Arduino IDE
Easiest way for beginners.
WebSocket Library
We’ll use:
ESPAsyncWebServer
AsyncTCP
These make esp32 async websocket fast and reliable.
Basic HTML knowledge
(If not, don’t worry — I’ll explain clearly.)
ESP32 WebSocket vs HTTP: What’s the Real Difference?
| Feature | HTTP | WebSocket |
|---|---|---|
| Two-way communication | ❌ No | ✅ Yes |
| Real-time updates | ❌ Slow | ✅ Instant |
| Connection type | Request-Response | Always connected |
| ESP32 load | High | Low |
| Use case | Simple apps | Smart, dynamic apps |
If your project needs live updates, esp32 websocket is the way to go.
Setting Up ESP32 WebSocket Server
This is the most common setup.
Let’s build the simplest esp32 websocket server example that sends and receives messages.
Install these libraries first:
Library 1: ESPAsyncWebServer
Library 2: AsyncTCP
You can install them from GitHub or through ZIP install.
ESP32 WebSocket Example Code
Here is the cleanest esp32 websocket example you can start with:
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "YOUR_WIFI";
const char* password = "YOUR_PASS";
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client,
AwsEventType type, void *arg, uint8_t *data, size_t len) {
if (type == WS_EVT_CONNECT) {
Serial.println("Client connected");
}
else if (type == WS_EVT_DATA) {
Serial.print("Message received: ");
Serial.println((char*)data);
// Echo back message
client->text("ESP32 received: " + String((char*)data));
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.println(WiFi.localIP());
ws.onEvent(onEvent);
server.addHandler(&ws);
server.begin();
}
void loop() {
// Nothing required here
}
This is the simplest form of:
- esp32 websocket
- esp32 websocket server
- esp32 async websocket
- websocket esp32
All rolled into one working example.
HTML Client Code to Connect to ESP32 WebSocket
Save this as index.html:
<!DOCTYPE html>
<html>
<body>
<h2>ESP32 WebSocket Demo</h2>
<input id="msg" placeholder="Type message">
<button onclick="sendMsg()">Send</button>
<p id="output"></p>
<script>
let socket = new WebSocket("ws://" + location.host + "/ws");
socket.onmessage = function(event) {
document.getElementById("output").innerHTML +=
"<br>ESP32 says: " + event.data;
};
function sendMsg() {
let text = document.getElementById("msg").value;
socket.send(text);
}
</script>
</body>
</html>
This works with:
- esp32 arduino websocket
- websocket arduino esp32
- esp32 websocket client example
Your browser now talks to the ESP32 instantly.
Using ESP32 WebSockets for Sensor Data (Real Project)
Let’s send:
- temperature
- humidity
- motion
- light values
…or any sensor data from ESP32 to your browser in real time.
Replace this part:
client->text("ESP32 received: " + String((char*)data));
With something like:
ws.textAll("Temperature: " + String(tempValue));
Your browser updates instantly without refreshing.
This setup is the core of many IoT dashboards.
ESP32 WebSocket Client Example (Cloud / Server Connection)
Sometimes ESP32 needs to connect to a remote WebSocket server.
Here’s a tiny esp32 websocket client example:
#include <ArduinoWebsockets.h>
using namespace websockets;
WebsocketsClient client;
void setup() {
Serial.begin(115200);
client.connect("ws://yourserver.com:8080");
client.onMessage([](WebsocketsMessage message) {
Serial.println("Server: " + message.data());
});
client.send("Hello from ESP32");
}
void loop() {
client.poll();
}
ESP32 CAM WebSocket Streaming
WebSockets aren’t just for text. You can stream camera frames too — and the ESP32-CAM becomes much more powerful when you use WebSockets instead of traditional MJPEG HTTP streaming.
Typical HTTP video stream from ESP32-CAM struggles because:
- connection resets happen often
- latency jumps
- bandwidth spikes
- browser freezes with high FPS
But esp32 cam websocket streaming sends frames as small packets, keeping video:
- smoother
- faster
- more stable
- more responsive
Here’s the idea:
- ESP32-CAM captures a frame
- ESP32 encodes it to JPEG
- Sends it over WebSocket
- Browser draws the frame on a
<canvas>in your webpage
This is exactly how modern IoT camera dashboards work.
This real-time flow is exactly how modern IoT camera dashboards work. And if you’re just starting with WebSockets, you can follow this ESP32 WebSocket tutorial that covers server, client, async WebSocket, ESP32-CAM streaming, real-time control, and complete step-by-step examples check it out here: ESP32 Web Server
Simple ESP32 CAM WebSocket Example (Concept Only)
camera_fb_t * fb = esp_camera_fb_get();
ws.binaryAll(fb->buf, fb->len);
esp_camera_fb_return(fb);
That’s it.
Just three lines — now your ESP32 CAM sends frames directly through WebSocket.
Your webpage then uses JavaScript like:
socket.onmessage = function(event) {
let blob = new Blob([event.data], {type: "image/jpeg"});
let url = URL.createObjectURL(blob);
document.getElementById("cam").src = url;
};
This is the heart of esp32 cam websocket stream.
ESP32 Async WebSocket (Why It’s Best for Beginners)
If you search online, you’ll see two ways to implement WebSockets:
1. Synchronous (blocking)
Slower, can freeze the ESP32 when handling many clients.
2. Asynchronous (non-blocking)
Fast, scalable, smooth.
This is where esp32 async websocket shines.
It uses AsyncTCP in the background — so your:
- sensor loops
- GPIO tasks
- LED patterns
- motors
- timers
…all continue to run smoothly while WebSockets handle clients.
With async WebSockets:
- multiple clients can connect
- UI updates happen instantly
- ESP32 doesn’t freeze under load
That’s why most developers choose:
ESPAsyncWebServer
AsyncWebSocket
This combination is by far the most popular esp32 websocket library.
Understanding the ESP32 WebSocket Library
When you install ESPAsyncWebServer, you automatically get:
Classes you’ll use often:
| Class | Purpose |
|---|---|
AsyncWebServer | Creates your web server |
AsyncWebSocket | Creates your WebSocket endpoint |
AsyncWebSocketClient | Represents each connected client |
AsyncWebSocketMessageBuffer | Handles large messages safely |
You also get helpful methods:
.textAll(msg)→ send message to all clients.text(clientID, msg)→ send to one client.binaryAll(data, len)→ send binary files (used in esp32 cam websocket).ping()→ keep connection alive.cleanupClients()→ remove disconnected clients
The library lets you build everything from:
- chat apps
- IoT dashboards
- ESP32 smart home panels
- sensor monitoring systems
…all the way to live video streaming.
Real-World Use Case: ESP32 WebSocket Home Automation Panel
Here’s a simple but powerful setup.
ESP32 Controls:
- fan
- bulb
- relay module
- LED strip
HTML Dashboard (WebSocket client):
- real-time button toggles
- instant state updates
- color picker for LED strip
Why WebSockets make this superior:
- changes reflect instantly
- mobile browser becomes a remote
- zero page refresh
- ESP32 sends updates when GPIO changes
- you can control it over the same Wi-Fi network
This is where phrases like:
websocket esp32websocket arduino esp32esp32 arduino websocket
naturally fit in real-world projects.
ESP32 Arduino WebSocket Client: When ESP32 Connects to Another Server
Sometimes, ESP32 isn’t the “main server.”
Instead, you want ESP32 to connect to:
- a Node.js server
- a cloud WebSocket endpoint
- another ESP32
- a Python WebSocket server
Here’s a clean esp32 arduino websocket client example snippet:
client.onMessage([](WebsocketsMessage message) {
Serial.print("From Server: ");
Serial.println(message.data());
});
This works perfectly for:
- remote automation
- connecting ESP32 devices to a central server
- live control from mobile apps
- multi-room home automation systems
Many beginners prefer this because it lets you scale easily.
ESP32 WebSocket Client Arduino Example (Full Code)
Here’s an even more complete example (still simple):
#include <WiFi.h>
#include <ArduinoWebsockets.h>
using namespace websockets;
const char* ssid = "YOUR_SSID";
const char* pass = "YOUR_PASS";
WebsocketsClient client;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
client.connect("ws://192.168.1.10:8080");
client.onMessage([](WebsocketsMessage msg){
Serial.println("Server: " + msg.data());
});
client.onEvent([](WebsocketsEvent event, String data){
if(event == WebsocketsEvent::ConnectionOpened){
Serial.println("Connected to Server");
}
});
client.send("ESP32 Hello!");
}
void loop() {
client.poll(); // must be called
}
This covers the keyword set:
- esp32 websocket client
- esp32 websocket client example
- websocket client esp32
ESP32 WebSocket Security Basics
Most beginners worry about:
- “Is WebSocket safe?”
- “Can someone hack my ESP32?”
Let’s break it down.
Local Wi-Fi = Safe
If your ESP32 and user dashboard are on the same Wi-Fi network, you are already protected by the router.
Password protect ESP32 Wi-Fi AP mode
If your ESP32 creates a Wi-Fi hotspot, ALWAYS set a password.
Use WebSocket Ping
Sends small packets to keep the connection alive.
HTTPS + WSS (Advanced)
You can use encrypted WebSocket connections (wss://), but for beginners, HTTP is fine.
Adding Multiple WebSocket Endpoints on ESP32
Yes, you can have multiple.
Example:
AsyncWebSocket sensorWS("/sensor");
AsyncWebSocket chatWS("/chat");
This helps when building complex dashboards.
/sensor→ live sensor values/chat→ user messages/camera→ video stream
ESP32 handles them all smoothly because async TCP works in the background.
WebSocket Troubleshooting Guide (Fix 99% of Issues)
1. Browser not connecting?
Check this:
ws://your-esp32-ip/ws
If your endpoint is /ws, you must match it in JavaScript.
2. ESP32 keeps restarting?
Your heap is low.
ESP32 CAM especially suffers with low memory.
Fix:
ws.cleanupClients();
Use it every 10 seconds.
3. Messages not received?
Make sure:
socket.onmessage = ...
is correctly written.
4. AsyncWebServer not installed correctly?
Make sure you installed both:
- ESPAsyncWebServer
- AsyncTCP
5. HTML not loading?
Serve your HTML using:
server.serveStatic("/", SPIFFS, "/");
or embed it as a string.
ESP32 WebSocket Best Practices (For Smooth Performance)
- use asynchronous WebSockets
- send small messages
- clean up disconnected clients
- avoid large JSON objects
- compress camera frames
- do not update UI every millisecond
- batch sensor values into one message
These tips prevent lag and memory issues.
ESP32 WebSocket + Arduino + HTML: Final Combined Mini Project
This is a simple beginner-friendly project where:
- ESP32 hosts a WebSocket server
- A webpage shows live temperature
- You can toggle an LED from the browser
- Updates happen instantly
This single project uses many keywords naturally:
- esp32 websockets
- esp32 websocket server
- esp32 websocket example
- arduino esp32 websocket
- websocket arduino esp32
- esp32 websocket library
FAQ : ESP32 WebSocket
What is an ESP32 WebSocket and why is it used?
An ESP32 WebSocket is a communication method that keeps a constant connection open between your ESP32 and a browser or another device. Instead of sending one request at a time like HTTP, WebSockets let both sides talk instantly. This makes them perfect for real-time dashboards, sensor monitoring, ESP32 CAM video streaming, and home automation projects where fast updates matter.
How is ESP32 WebSocket different from normal HTTP communication?
HTTP works like a question-answer system; you send a request and wait. ESP32 WebSockets stay connected the whole time, so your ESP32 can push sensor data instantly. This is why dashboards update in real time and why ESP32 CAM WebSocket stream feels smoother than normal MJPEG streaming.
Do I need a special ESP32 WebSocket library?
Yes. The most popular choice is ESPAsyncWebServer paired with AsyncWebSocket. This library handles multiple connections smoothly and makes your ESP32 projects faster. If you prefer the Arduino approach, you can also use the lightweight ArduinoWebsockets library for building an ESP32 WebSocket client.
What is the difference between ESP32 WebSocket Server and ESP32 WebSocket Client?
An ESP32 WebSocket server accepts connections from browsers and apps.
An ESP32 WebSocket client connects to another server such as Node.js, Python, or even another ESP32.
You use a server when you want ESP32 to host a dashboard.
You use a client when ESP32 needs to send data to the cloud or communicate with a central controller.
Can ESP32 work as a WebSocket client in Arduino?
Absolutely. Many developers use the esp32 arduino websocket client setup to send live data to a backend server. It works with Node.js websockets, Python websockets, and cloud WebSocket endpoints too. It’s perfect for large systems where multiple ESP32 boards send data to one backend.
Is ESP32 Async WebSocket better than the normal (synchronous) approach?
Yes. esp32 async websocket is much faster because it doesn’t block other tasks. Your ESP32 can handle Wi-Fi, sensors, timers, and WebSockets at the same time. This is why real-time dashboards and live ESP32 CAM WebSocket streams perform better with asynchronous libraries.
Can I build a WebSocket Arduino ESP32 project without hosting a website on ESP32?
Yes. You can host the website anywhere—GitHub Pages, Node.js server, or your laptop—and connect directly to the websocket arduino esp32 endpoint. This is helpful when your website is large or when the ESP32 doesn’t have enough storage for HTML files.
Why is ESP32 CAM WebSocket streaming so popular?
ESP32 CAM WebSocket streaming is popular because it reduces delay, improves frame rate, and sends compressed images more efficiently. Unlike old HTTP video streams, WebSockets send JPEG frames as binary data, giving you smoother video for security cameras, robots, or FPV projects.
How many clients can ESP32 WebSocket support at once?
Most projects run 2–6 clients smoothly. With async libraries, the ESP32 can even handle 10+ lightweight connections. Heavy tasks like ESP32 CAM WebSocket streaming reduce this number, but for normal sensor and LED control dashboards, the ESP32 works great with multiple users.
Why is my ESP32 WebSocket disconnecting frequently?
Common reasons include weak Wi-Fi, incorrect WebSocket endpoint, sending too much data too fast, or running out of memory. Using async libraries, adding ws.cleanupClients(), reducing frame size for ESP32 CAM, and enabling ping messages usually fix all disconnect issues.
Can I use WebSockets with both ESP32 and ESP8266?
Yes, the same WebSocket concepts work for ESP8266 too, but the ESP32 handles more clients and bigger data. If you’re building a dashboard or camera project, always pick ESP32 because it has better memory and dual-core processing.
Is WebSocket safe for IoT projects?
When ESP32 WebSocket runs inside your home Wi-Fi, it is very safe. For public access, you can enable secure connections using wss://, strong passwords, and token verification. Most beginners don’t need advanced security when all devices stay inside the same network.
Can ESP32 WebSocket be used for home automation?
Yes. Many people build instant-control smart systems using esp32 websockets, because turning on lights, fans, relays, or LEDs happens in real time. Unlike HTTP buttons, WebSocket updates feel faster and more reliable, especially when controlling multiple devices.
What is the easiest ESP32 WebSocket example for beginners?
The simplest setup is a basic esp32 websocket server example that toggles an LED and sends sensor values to a webpage. It uses AsyncWebServer, AsyncWebSocket, and a small HTML file. Beginners love this project because it updates instantly without page refresh.
Can I stream sensor data to a mobile phone using ESP32 WebSocket?
Yes—your phone browser can connect directly to the ESP32 WebSocket server. You can stream temperature, humidity, gas sensor values, or motion alerts with zero delay. This is the simplest way to make your own real-time IoT dashboard.
Does WebSocket work with ESP32 Bluetooth or only Wi-Fi?
WebSocket only works over Wi-Fi. If you need Bluetooth communication, you would use BLE characteristics or classic Bluetooth, not WebSockets. But for fast, stable IoT dashboards, Wi-Fi + WebSocket is the best combination.
Can I connect two ESP32 devices using WebSocket?
Yes. One ESP32 acts as the WebSocket server and the second works as the websocket client esp32. This setup is super useful when you want one device to collect data and another device to control hardware like motors or relays.
Is ESP32 WebSocket good for gaming dashboards or joystick control?
Yes. Because WebSockets send messages instantly, you can make joystick-controlled robots, car projects, ESP32 CAM FPV, and even browser-based mini games that interact with real hardware. HTTP is too slow for this, but WebSockets handle it easily.
Why should beginners learn ESP32 WebSocket instead of HTTP polling?
WebSockets use less bandwidth, respond faster, and feel smoother. Beginners often start with HTTP but quickly move to websocket esp32 because everything happens in real time: LEDs toggle instantly, video streams smoothly, and sensor dashboards refresh without page reload.
Mr. Raj Kumar is a highly experienced Technical Content Engineer with 7 years of dedicated expertise in the intricate field of embedded systems. At Embedded Prep, Raj is at the forefront of creating and curating high-quality technical content designed to educate and empower aspiring and seasoned professionals in the embedded domain.
Throughout his career, Raj has honed a unique skill set that bridges the gap between deep technical understanding and effective communication. His work encompasses a wide range of educational materials, including in-depth tutorials, practical guides, course modules, and insightful articles focused on embedded hardware and software solutions. He possesses a strong grasp of embedded architectures, microcontrollers, real-time operating systems (RTOS), firmware development, and various communication protocols relevant to the embedded industry.
Raj is adept at collaborating closely with subject matter experts, engineers, and instructional designers to ensure the accuracy, completeness, and pedagogical effectiveness of the content. His meticulous attention to detail and commitment to clarity are instrumental in transforming complex embedded concepts into easily digestible and engaging learning experiences. At Embedded Prep, he plays a crucial role in building a robust knowledge base that helps learners master the complexities of embedded technologies.
