Introduction
Server-Sent Events (SSE) is a web technology that allows a server to push real-time updates to a client over HTTP. Unlike WebSockets, SSE is simpler to implement as it uses a one-way communication channel from the server to the browser and works over a regular HTTP connection. It is especially useful for applications requiring periodic updates, such as live scores, notifications, or real-time monitoring dashboards.
I created this demo because I’m currently developing an application where AIs discuss various topics. I wanted to implement some stream-like features and discovered the technology called "SSE".
Demo Overview
This demo showcases how Server-Sent Events (SSE) can be used to send real-time updates from an API to the browser. In this example, the browser displays a series of sample messages sent by the server. The simplicity of this demo makes it an excellent starting point for understanding how SSE works and integrating it into your projects.
Demo Video
Below is a video demonstrating how the Server-Sent Events (SSE) demo works in real time. Watching this video will give you a better understanding of how the client and server interact to provide real-time updates.
Implementation
The core implementation of the Server-Sent Events (SSE) demo is split into two parts: the frontend and the backend. The full source code is available on GitHub: sse-demo repository.
Frontend (ui/src/app/page.tsx)
The frontend is built with React and provides buttons to start and stop the SSE connection, displaying real-time messages from the server. Here are the main highlights:
-
Connecting to SSE: The handleStartConnection function creates an EventSource object connected to the /events endpoint. It listens for messages, open events, and error events:
- onmessage: Handles incoming messages and updates the messages state.
- onopen: Logs when the connection is established.
- onerror: Handles errors, logging details and closing the connection if needed.
Stopping the Connection: The handleStopConnection function closes the SSE connection and cleans up.
UI: The page includes a simple interface with start/stop buttons and a list to display messages.
"use client"; import type React from "react"; import { useState } from "react"; const App: React.FC = () => { const [messages, setMessages] = useState<string>([]); const [eventSource, setEventSource] = useState<eventsource null>(null); const handleStartConnection = () => { const newEventSource = new EventSource("http://localhost:8080/events"); const handleOnMessage = (event: MessageEvent) => { console.log("onmessage", event.data); setMessages((prev) => [...prev, event.data]); }; const handleOnOpen = () => { console.log("Connection established"); }; const handleOnError = (error: Event) => { console.error("onerror", error); console.log("readyState:", newEventSource.readyState); console.log("Connection error occurred."); newEventSource.close(); setEventSource(null); }; const handleOnClose = () => { console.log("Connection is being closed by the server."); newEventSource.close(); setEventSource(null); }; newEventSource.onmessage = handleOnMessage; newEventSource.onopen = handleOnOpen; newEventSource.onerror = handleOnError; newEventSource.addEventListener("close", handleOnClose); setEventSource(newEventSource); }; const handleStopConnection = () => { if (eventSource) { eventSource.close(); setEventSource(null); console.log("Connection closed"); } }; return ( <div> <h1 id="Server-Sent-Events-Demo">Server-Sent Events Demo</h1> <button type="button" onclick="{handleStartConnection}" disabled classname="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50"> Start Connection </button> <button type="button" onclick="{handleStopConnection}" disabled classname="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50 ml-2"> Stop Connection </button> <ul> {messages.map((message, index) => ( <li key="{`${index}-${message}`}">{message}</li> ))} </ul> </div> ); }; export default App; </eventsource></string>
Backend (api/main.go)
The backend is built using the Gin framework for Go and includes the following key features:
CORS Configuration: The backend uses the Gin CORS middleware to allow connections during debugging.
-
SSE Endpoint: The /events endpoint streams a series of pre-defined messages to the client with a delay between each message. Key components:
- Headers are set to specify the text/event-stream content type.
- Messages are sent in a loop, with a 2-second delay between each message.
- A final close event signals the end of the connection.
"use client"; import type React from "react"; import { useState } from "react"; const App: React.FC = () => { const [messages, setMessages] = useState<string>([]); const [eventSource, setEventSource] = useState<eventsource null>(null); const handleStartConnection = () => { const newEventSource = new EventSource("http://localhost:8080/events"); const handleOnMessage = (event: MessageEvent) => { console.log("onmessage", event.data); setMessages((prev) => [...prev, event.data]); }; const handleOnOpen = () => { console.log("Connection established"); }; const handleOnError = (error: Event) => { console.error("onerror", error); console.log("readyState:", newEventSource.readyState); console.log("Connection error occurred."); newEventSource.close(); setEventSource(null); }; const handleOnClose = () => { console.log("Connection is being closed by the server."); newEventSource.close(); setEventSource(null); }; newEventSource.onmessage = handleOnMessage; newEventSource.onopen = handleOnOpen; newEventSource.onerror = handleOnError; newEventSource.addEventListener("close", handleOnClose); setEventSource(newEventSource); }; const handleStopConnection = () => { if (eventSource) { eventSource.close(); setEventSource(null); console.log("Connection closed"); } }; return ( <div> <h1 id="Server-Sent-Events-Demo">Server-Sent Events Demo</h1> <button type="button" onclick="{handleStartConnection}" disabled classname="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50"> Start Connection </button> <button type="button" onclick="{handleStopConnection}" disabled classname="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded disabled:opacity-50 ml-2"> Stop Connection </button> <ul> {messages.map((message, index) => ( <li key="{`${index}-${message}`}">{message}</li> ))} </ul> </div> ); }; export default App; </eventsource></string>
How to Run It
To run this demo, please refer to the README.md file in the GitHub repository. It contains step-by-step instructions for setting up and running both the frontend and backend of the project.
Conclusion
This demo provides a simple yet effective introduction to Server-Sent Events (SSE), demonstrating how to stream real-time messages from a server to a browser. By focusing on the basics, it’s designed to help you quickly understand the core concepts and start experimenting with SSE in your own projects.
If you’re interested in trying it out or building upon this example, check out the full source code on GitHub: sse-demo repository.
The above is the detailed content of The simplest demo on SSE(Server-Send Events). For more information, please follow other related articles on the PHP Chinese website!

In Go programming, ways to effectively manage errors include: 1) using error values instead of exceptions, 2) using error wrapping techniques, 3) defining custom error types, 4) reusing error values for performance, 5) using panic and recovery with caution, 6) ensuring that error messages are clear and consistent, 7) recording error handling strategies, 8) treating errors as first-class citizens, 9) using error channels to handle asynchronous errors. These practices and patterns help write more robust, maintainable and efficient code.

Implementing concurrency in Go can be achieved by using goroutines and channels. 1) Use goroutines to perform tasks in parallel, such as enjoying music and observing friends at the same time in the example. 2) Securely transfer data between goroutines through channels, such as producer and consumer models. 3) Avoid excessive use of goroutines and deadlocks, and design the system reasonably to optimize concurrent programs.

Gooffersmultipleapproachesforbuildingconcurrentdatastructures,includingmutexes,channels,andatomicoperations.1)Mutexesprovidesimplethreadsafetybutcancauseperformancebottlenecks.2)Channelsofferscalabilitybutmayblockiffullorempty.3)Atomicoperationsareef

Go'serrorhandlingisexplicit,treatingerrorsasreturnedvaluesratherthanexceptions,unlikePythonandJava.1)Go'sapproachensureserrorawarenessbutcanleadtoverbosecode.2)PythonandJavauseexceptionsforcleanercodebutmaymisserrors.3)Go'smethodpromotesrobustnessand

WhentestingGocodewithinitfunctions,useexplicitsetupfunctionsorseparatetestfilestoavoiddependencyoninitfunctionsideeffects.1)Useexplicitsetupfunctionstocontrolglobalvariableinitialization.2)Createseparatetestfilestobypassinitfunctionsandsetupthetesten

Go'serrorhandlingreturnserrorsasvalues,unlikeJavaandPythonwhichuseexceptions.1)Go'smethodensuresexpliciterrorhandling,promotingrobustcodebutincreasingverbosity.2)JavaandPython'sexceptionsallowforcleanercodebutcanleadtooverlookederrorsifnotmanagedcare

AneffectiveinterfaceinGoisminimal,clear,andpromotesloosecoupling.1)Minimizetheinterfaceforflexibilityandeaseofimplementation.2)Useinterfacesforabstractiontoswapimplementationswithoutchangingcallingcode.3)Designfortestabilitybyusinginterfacestomockdep

Centralized error handling can improve the readability and maintainability of code in Go language. Its implementation methods and advantages include: 1. Separate error handling logic from business logic and simplify code. 2. Ensure the consistency of error handling by centrally handling. 3. Use defer and recover to capture and process panics to enhance program robustness.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

WebStorm Mac version
Useful JavaScript development tools

SublimeText3 Chinese version
Chinese version, very easy to use

Dreamweaver CS6
Visual web development tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.
