Maison > interface Web > Tutoriel H5 > Comment utiliser l'API HTML5 Server-Sent Events) pour les mises à jour en temps réel du serveur?

Comment utiliser l'API HTML5 Server-Sent Events) pour les mises à jour en temps réel du serveur?

Robert Michael Kim
Libérer: 2025-03-12 15:19:18
original
147 Les gens l'ont consulté

Comment utiliser l'API HTML5 Server-Sent Events) pour les mises à jour en temps réel du serveur

L'API Events (SSE) du HTML5 Server-Sent (SSE) fournit un moyen simple et efficace pour un serveur Web de pousser les mises à jour du navigateur d'un client en temps réel. Contrairement aux technologies comme WebSockets, SSE est unidirectionnelle - le serveur envoie des données au client, mais le client ne peut pas renvoyer des données au serveur sur la même connexion. Cette simplicité le rend idéal pour les scénarios où le serveur doit pousser les mises à jour du client, telles que les tickers de stock, les scores en direct ou les applications de chat (où le client n'a besoin que de messages).

Pour utiliser SSE, vous devez créer un objet EventSource dans votre code JavaScript. Cet objet établit une connexion persistante à un point de terminaison côté serveur qui diffuse des événements. Voici un exemple de base:

 <code class="javascript">const eventSource = new EventSource('/events'); eventSource.onmessage = function(event) { console.log('Received event:', event.data); // Process the received data here, eg, update the UI }; eventSource.onerror = function(error) { console.error('EventSource failed:', error); };</code>
Copier après la connexion

Ce code crée un EventSource connecté aux /events . Le gestionnaire d'événements onmessage reçoit les données envoyées par le serveur et le gestionnaire onerror capte toutes les erreurs. Le serveur, AT /events , doit être configuré pour envoyer des données dans le format SSE correct (plus à ce sujet dans la section côté serveur ci-dessous). N'oubliez pas de gérer les erreurs potentielles et d'implémenter la logique de reconnexion (comme détaillé dans une section ultérieure). Le serveur enverra en continu des données sur cette connexion jusqu'à ce que la connexion soit fermée soit par le client ou le serveur.

Avantages de l'utilisation d'événements envoyés par serveur (SSE) par rapport à d'autres technologies de communication en temps réel comme WebSockets

SSE offre plusieurs avantages par rapport aux autres technologies de communication en temps réel comme WebSockets:

  • Simplicité: SSE est nettement plus simple à implémenter aux côtés du client et du serveur. L'API est simple et le protocole est moins complexe que WebSockets. Cela réduit le temps de développement et la complexité.
  • Efficacité: SSE est plus efficace pour la communication unidirectionnelle. Étant donné qu'il permet uniquement la communication serveur à client, il évite les frais généraux associés à des protocoles de communication bidirectionnels comme WebSockets. Cela se traduit par une consommation de bande passante inférieure et une charge de serveur réduite, en particulier lorsqu'il s'agit de nombreux clients.
  • Basé sur HTTP: SSE exploite l'infrastructure HTTP existante, ce qui facilite l'intégration des serveurs Web et de l'infrastructure existants. Cela élimine le besoin d'installations ou de protocoles spécialisés.
  • Mécanisme de réessayer intégré: SSE comprend un mécanisme de nouvelle tentative intégré. Si la connexion est perdue, le client tentera automatiquement de se reconnecter au serveur après un retard spécifié. Cela simplifie la gestion des erreurs et assure la robustesse. (Bien que vous puissiez toujours personnaliser ce comportement).

Cependant, WebSockets est supérieur lorsque la communication bidirectionnelle est requise. La nature unidirectionnelle de SSE limite son applicabilité dans les scénarios où les clients doivent renvoyer activement des données au serveur.

Implémentation de la logique de gestion des erreurs et de reconnexion dans mon application client SSE

Bien que SSE dispose d'un mécanisme de réessayer intégré, des applications robustes devraient implémenter la gestion des erreurs personnalisées et la logique de reconnexion pour une expérience plus contrôlée et réactive. Voici un exemple amélioré:

 <code class="javascript">const eventSource = new EventSource('/events'); let reconnectAttempts = 0; const maxReconnectAttempts = 5; eventSource.onmessage = function(event) { console.log('Received event:', event.data); reconnectAttempts = 0; // Reset on successful message }; eventSource.onerror = function(error) { console.error('EventSource failed:', error); if (reconnectAttempts  { eventSource.close(); eventSource = new EventSource('/events'); // Reconnect reconnectAttempts ; }, retryDelay); } else { console.error('Max reconnect attempts reached. Giving up.'); // Handle the failure appropriately, eg, display an error message to the user } };</code>
Copier après la connexion

Cet exemple amélioré ajoute:

  • Reconnecter les tentatives: limite le nombre de tentatives de reconnexion pour empêcher les boucles infinies.
  • Backoff exponentiel: augmente le délai de réessayer de façon exponentielle à chaque tentative, réduisant la charge du serveur pendant les problèmes de connexion.
  • Manipulation des échecs: fournit un mécanisme pour gérer la situation où le nombre maximal de tentatives de reconnexion est atteint.

Structurer mon code côté serveur pour envoyer efficacement les événements à l'aide de l'API des événements de serveur (SSE)

L'implémentation côté serveur de SSE dépend de la technologie utilisée (par exemple, Node.js, Python, Java). Cependant, le principe de base reste le même: le serveur doit envoyer des données dans le format SSE correct. Ce format nécessite un en-tête HTTP spécifique ( Content-Type: text/event-stream ) et formaté des données avec des délimiteurs spécifiques. Voici un exemple de base en utilisant Node.js avec Express:

 <code class="javascript">const express = require('express'); const app = express(); const port = 3000; app.get('/events', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); // Simulate sending events every second setInterval(() => { const data = `data: ${new Date().toISOString()}\n\n`; res.write(data); }, 1000); req.on('close', () => { console.log('Client disconnected'); }); }); app.listen(port, () => { console.log(`Server listening on port ${port}`); });</code>
Copier après la connexion

Ce code Node.js met en place un point de terminaison aux /events . La fonction res.writeHead définit les en-têtes HTTP nécessaires. La fonction setInterval simule l'envoi de données chaque seconde. Surtout, chaque message de données est suivi de deux caractères Newline ( \n\n ) comme requis par la spécification SSE. Le gestionnaire d'événements req.on('close') est important pour les déconnexions de journaux. N'oubliez pas d'adapter ce code à la technologie et à la source de données côté serveur choisi. Pour une mise à l'échelle efficace, envisagez d'utiliser des technologies conçues pour gérer de nombreuses connexions simultanées, telles que les équilibreurs de charge et les cadres asynchrones.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal