mata teras
Kelebihan Acara Pengiriman Server
Web bertindak balas terhadap mesej HTTP berdasarkan permintaan-tindak balas. Pelayar anda mengeluarkan permintaan URL dan pelayan mengembalikan data. Ini boleh menyebabkan penyemak imbas membuat lebih banyak permintaan kepada imej, CSS, JavaScript, dan lain -lain, dan pelayan bertindak balas. Pelayan tidak boleh menghantar mesej secara aktif ke penyemak imbas, jadi bagaimana ia menunjukkan bahawa data telah diubah? Nasib baik, anda boleh menggunakan Server Send Events (SSE) untuk menambah ciri -ciri seperti siaran berita langsung, ramalan cuaca, dan harga saham.Ia selalu mungkin menggunakan teknologi web standard untuk mencapai kemas kini data masa nyata:
Server Send Events (SSE) membolehkan pelayan menolak data ke penyemak imbas pada bila -bila masa:
Pada dasarnya, SSE adalah aliran data tanpa had. Fikirkannya sebagai memuat turun fail yang tidak terhingga yang dimuat turun dalam kepingan kecil yang boleh anda memintas dan membaca.
SSE pada asalnya dilaksanakan pada tahun 2006 dan menyokong standard ini dalam semua pelayar utama. Ia mungkin tidak dikenali sebagai WebSockets, tetapi pelayan menghantar acara lebih mudah, menggunakan HTTP standard, menyokong komunikasi sehala, dan menyediakan penyambungan semula automatik. Tutorial ini menyediakan contoh kod Node.js tanpa modul pihak ketiga, tetapi SSE boleh digunakan dalam bahasa pelayan lain, termasuk PHP.
Permulaan cepat pelayan hantar acara
Demonstrasi berikut melaksanakan pelayan web Node.js yang mengeluarkan nombor rawak antara 1 dan 1000 pada selang rawak sekurang -kurangnya setiap tiga saat.
anda boleh mencari demo node.js SSE kami di sini.
Kod ini menggunakan modul HTTP dan URL standard Node.js untuk membuat pelayan web dan menghuraikan URL:
import http from "node:http"; import url from "node:url";
cek pelayan untuk permintaan URL masuk dan bertindak balas ketika menghadapi jalan /rawak:
const port = 8000; http.createServer(async (req, res) => { // 获取 URI 路径 const uri = url.parse(req.url).pathname; // 返回响应 switch (uri) { case "/random": sseStart(res); sseRandom(res); break; } }).listen(port); console.log(`server running: http://localhost:${port}\n\n`);
Ia pada mulanya bertindak balas dengan tajuk aliran acara SSE HTTP:
// SSE 头 function sseStart(res) { res.writeHead(200, { Content-Type: "text/event-stream", Cache-Control: "no-cache", Connection: "keep-alive" }); }
Fungsi lain kemudian menghantar nombor rawak dan memanggil dirinya selepas selang rawak berlalu:
// SSE 随机数 function sseRandom(res) { res.write("data: " + (Math.floor(Math.random() * 1000) + 1) + "\n\n"); setTimeout(() => sseRandom(res), Math.random() * 3000); }
Jika anda menjalankan kod anda secara tempatan, anda boleh menggunakan curl di terminal anda untuk menguji tindak balas:
$> curl -H Accept:text/event-stream http://localhost:8000/random data: 481 data: 127 data: 975
Tekan ctrl |. JavaScript pelanggan pelayar menghubungkan ke /uri rawak menggunakan pembina objek Eventsource:
Data masuk mencetuskan pengendali acara mesej, di mana data: rentetan selepas ia tersedia di harta .data objek acara:
// 客户端 JS const source = new EventSource("/random");
source.addEventListener('message', e => { console.log('RECEIVED', e.data); });
{ withCredentials: true }
Data mesej hanya boleh menjadi rentetan dalam data format: SSE tidak memerlukan lebih banyak kod daripada yang ditunjukkan di atas, tetapi bahagian berikut membincangkan pilihan lain.
Pelayan boleh menyediakan bilangan URL saluran SSE. Contohnya:
Pilihan lain adalah untuk menyediakan URL akhir titik, seperti /terkini, yang menghantar sebarang jenis data pada satu saluran komunikasi. Penyemak imbas boleh menunjukkan topik kepentingan dalam rentetan pertanyaan URL, seperti /terkini jenis = berita, cuaca, saham saham, supaya pelayan dapat mengehadkan respons SSE kepada mesej tertentu.
hantar data yang berbeza pada saluran tunggal
yang berkaitan yang diluluskan di atas garis event:
untuk mengenal pasti jenis maklumat tertentu: data:
import http from "node:http"; import url from "node:url";
menggunakan pengenal data
const port = 8000; http.createServer(async (req, res) => { // 获取 URI 路径 const uri = url.parse(req.url).pathname; // 返回响应 switch (uri) { case "/random": sseStart(res); sseRandom(res); break; } }).listen(port); console.log(`server running: http://localhost:${port}\n\n`);
: data:
id:
// SSE 头 function sseStart(res) { res.writeHead(200, { Content-Type: "text/event-stream", Cache-Control: "no-cache", Connection: "keep-alive" }); }
ID terkini juga boleh didapati di harta tanah.
Nyatakan Retry Delay
// SSE 随机数 function sseRandom(res) { res.write("data: " + (Math.floor(Math.random() * 1000) + 1) + "\n\n"); setTimeout(() => sseRandom(res), Math.random() * 3000); }
Selepas menerimanya, penyemak imbas akan meninggalkan sambungan SSE dan cuba menyambung semula selepas masa kelewatan telah berlalu. retry:
$> curl -H Accept:text/event-stream http://localhost:8000/random data: 481 data: 127 data: 975
Di samping "mesej" dan acara yang dinamakan, anda juga boleh membuat "pembuka" dan "ralat" pengendali dalam klien JavaScript.
Apabila sambungan pelayan gagal atau ditamatkan, peristiwa "ralat" dicetuskan. Anda boleh menyemak.
ingat, tidak perlu menyambung semula:
// 客户端 JS const source = new EventSource("/random");
menamatkan komunikasi SSE
source.addEventListener('message', e => { console.log('RECEIVED', e.data); });
Penyemak imbas boleh menamatkan komunikasi SSE menggunakan kaedah .close () objek Eventsource. Contohnya:
retry:
kelewatan, kemudian Hanya pelayar boleh mewujudkan semula sambungan dengan membuat objek Eventsource baru.
Kesimpulan
Acara sisi pelayan menyediakan cara untuk melaksanakan kemas kini halaman masa nyata, yang mungkin lebih mudah, lebih praktikal dan lebih ringan daripada mengambil Ajax pengundian berasaskan (). Kerumitan terletak di sisi pelayan. Anda mesti:
tetapi ini benar -benar di bawah kawalan anda, dan lanjutannya tidak sepatutnya lebih kompleks daripada aplikasi web lain.
Satu -satunya kelemahan adalah bahawa SSE tidak membenarkan anda menghantar mesej dari penyemak imbas ke pelayan (kecuali permintaan sambungan awal). Anda boleh menggunakan Ajax, tetapi ini terlalu lambat untuk aplikasi seperti permainan tindakan. Untuk komunikasi dua arah yang betul, anda memerlukan websocket. Sila lihat cara membuat aplikasi langsung menggunakan WebSockets di Node.js untuk mengetahui lebih lanjut!
Atas ialah kandungan terperinci Cara Menggunakan Acara Server-Sent di Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!