HTML5サーバーセントイベント(SSE)APIは、Webサーバーがクライアントのブラウザにリアルタイムで更新をプッシュするためのシンプルで効率的な方法を提供します。 WebSocketsなどのテクノロジーとは異なり、SSEは単方向です。サーバーはクライアントにデータを送信しますが、クライアントは同じ接続を介してサーバーにデータを送信することはできません。このシンプルさにより、ストックティッカー、ライブスコア、チャットアプリケーション(クライアントがメッセージを受信する必要がある場合)など、サーバーがクライアントに更新をプッシュする必要があるシナリオに最適です。
SSEを使用するには、JavaScriptコードでEventSource
オブジェクトを作成する必要があります。このオブジェクトは、イベントをストリーミングするサーバー側のエンドポイントへの永続的な接続を確立します。これが基本的な例です。
<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>
このコードは/events
に接続されたEventSource
を作成します。 onmessage
イベントハンドラーは、サーバーから送信されたデータを受信し、 onerror
ハンドラーはエラーをキャッチします。サーバーは、AT /events
を設定する必要があります。正しいSSE形式でデータを送信するように構成する必要があります(これについては、以下のサーバー側のセクションで詳しく説明します)。潜在的なエラーを処理し、再接続ロジックを実装することを忘れないでください(後のセクションで詳しく説明してください)。サーバーは、クライアントまたはサーバーのいずれかによって接続が閉じられるまで、この接続に対してデータを継続的に送信します。
SSEは、WebSocketsのような他のリアルタイム通信技術よりもいくつかの利点を提供します。
ただし、双方向通信が必要な場合、WebSocketは優れています。 SSEの単方向性は、クライアントがサーバーに積極的にデータを送信する必要があるシナリオでの適用性を制限します。
SSEには再試行メカニズムが組み込まれていますが、堅牢なアプリケーションは、より制御されたレスポンシブエクスペリエンスのために、カスタムエラー処理と再接続ロジックを実装する必要があります。これが強化された例です:
<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>
この改善された例が追加されます:
SSEのサーバー側の実装は、使用されるテクノロジー(node.js、python、java)に依存します。ただし、コア原則は同じままです。サーバーは、正しいSSE形式でデータを送信する必要があります。この形式には、特定のHTTPヘッダー( Content-Type: text/event-stream
)と特定のデリミターでフォーマットされたデータが必要です。 Expressを使用してnode.jsを使用した基本的な例を次に示します。
<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>
このnode.jsコードは/events
でエンドポイントを設定します。 res.writeHead
関数は、必要なHTTPヘッダーを設定します。 setInterval
関数は、毎秒データを送信することをシミュレートします。重要なことに、各データメッセージの後に、SSE仕様で必要とされる2つのNewline文字( \n\n
)が続きます。 req.on('close')
イベントハンドラーは、切断を記録するために重要です。このコードを選択したサーバー側のテクノロジーとデータソースに適応させることを忘れないでください。効率的なスケーリングについては、ロードバランサーや非同期フレームワークなど、多くの同時接続を処理するために設計されたテクノロジーの使用を検討してください。
以上がサーバーからのリアルタイムアップデートにHTML5サーバーセントイベント(SSE)APIを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。