Rumah >hujung hadapan web >Tutorial H5 >Bagaimanakah saya menggunakan API HTML5 Server-Sent Events (SSE) untuk kemas kini masa nyata dari pelayan?
API Server-Sent Events (SSE) HTML5 menyediakan cara yang mudah dan cekap untuk pelayan web untuk menolak kemas kini kepada penyemak imbas klien secara real-time. Tidak seperti teknologi seperti WebSockets, SSE adalah Unidirectional - pelayan menghantar data kepada klien, tetapi pelanggan tidak dapat menghantar data kembali ke pelayan melalui sambungan yang sama. Kesederhanaan ini menjadikannya sesuai untuk senario di mana pelayan perlu menolak kemas kini kepada pelanggan, seperti ticker saham, skor langsung, atau aplikasi sembang (di mana pelanggan hanya perlu menerima mesej).
Untuk menggunakan SSE, anda perlu membuat objek EventSource
dalam kod JavaScript anda. Objek ini mewujudkan sambungan berterusan ke titik akhir pelayan yang mengalir peristiwa. Inilah contoh asas:
<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>
Kod ini mewujudkan EventSource
yang disambungkan ke /events
. Pengendali acara onmessage
menerima data yang dihantar oleh pelayan, dan pengendali onerror
menangkap sebarang kesilapan. Pelayan, di /events
, harus dikonfigurasi untuk menghantar data dalam format SSE yang betul (lebih lanjut mengenai ini di bahagian pelayan di bawah). Ingatlah untuk mengendalikan kesilapan yang berpotensi dan melaksanakan logik penyambungan semula (seperti yang terperinci dalam bahagian kemudian). Pelayan akan terus menghantar data ke atas sambungan ini sehingga sambungan ditutup sama ada oleh klien atau pelayan.
SSE menawarkan beberapa kelebihan mengenai teknologi komunikasi masa nyata yang lain seperti WebSockets:
Walau bagaimanapun, websocket lebih unggul apabila komunikasi dua arah diperlukan. Sifat unidirectional SSE mengehadkan kebolehgunaannya dalam senario di mana pelanggan perlu menghantar data kembali ke pelayan secara aktif.
Walaupun SSE mempunyai mekanisme semula terbina dalam, aplikasi yang mantap harus melaksanakan pengendalian ralat tersuai dan logik penyambungan semula untuk pengalaman yang lebih terkawal dan responsif. Inilah contoh yang dipertingkatkan:
<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>
Contoh yang lebih baik ini menambah:
Pelaksanaan pelayan SSE bergantung kepada teknologi yang digunakan (misalnya, Node.js, Python, Java). Walau bagaimanapun, prinsip teras tetap sama: pelayan perlu menghantar data dalam format SSE yang betul. Format ini memerlukan header HTTP tertentu ( Content-Type: text/event-stream
) dan data yang diformat dengan pembatas tertentu. Berikut adalah contoh asas menggunakan node.js dengan ekspres:
<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>
Kod Node.js ini menetapkan titik akhir pada /events
. Fungsi res.writeHead
menetapkan tajuk HTTP yang diperlukan. Fungsi setInterval
mensimulasikan data setiap saat. Secara kritis, setiap mesej data diikuti oleh dua aksara baru ( \n\n
) seperti yang dikehendaki oleh spesifikasi SSE. Pengendali acara req.on('close')
adalah penting untuk log pemotongan. Ingatlah untuk menyesuaikan kod ini ke teknologi dan sumber data pelayan yang dipilih. Untuk skala yang cekap, pertimbangkan untuk menggunakan teknologi yang direka untuk mengendalikan banyak sambungan serentak, seperti pengimbang beban dan rangka kerja asynchronous.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan API HTML5 Server-Sent Events (SSE) untuk kemas kini masa nyata dari pelayan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!