HTML5 - เหตุการณ์ที่เซิร์ฟเวอร์ส่ง
เว็บแอปพลิเคชันทั่วไปจะสร้างเหตุการณ์ที่ส่งไปยังเว็บเซิร์ฟเวอร์ ตัวอย่างเช่นการคลิกลิงก์แบบธรรมดาจะขอเพจใหม่จากเซิร์ฟเวอร์
ประเภทของเหตุการณ์ที่ไหลจากเว็บเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์อาจเรียกว่าเหตุการณ์ที่ไคลเอ็นต์ส่ง
นอกเหนือจาก HTML5 แล้วWHATWG Web Applications 1.0 จะแนะนำเหตุการณ์ที่ไหลจากเว็บเซิร์ฟเวอร์ไปยังเว็บเบราว์เซอร์และเรียกว่าเหตุการณ์ที่ส่งผ่านเซิร์ฟเวอร์ (SSE) การใช้ SSE คุณสามารถพุชเหตุการณ์ DOM จากเว็บเซิร์ฟเวอร์ของคุณไปยังเบราว์เซอร์ของผู้เยี่ยมชมได้อย่างต่อเนื่อง
วิธีการสตรีมเหตุการณ์จะเปิดการเชื่อมต่อแบบต่อเนื่องไปยังเซิร์ฟเวอร์ส่งข้อมูลไปยังไคลเอนต์เมื่อมีข้อมูลใหม่ทำให้ไม่จำเป็นต้องทำการสำรวจอย่างต่อเนื่อง
เหตุการณ์ที่เซิร์ฟเวอร์ส่งเป็นมาตรฐานในการสตรีมข้อมูลจากเซิร์ฟเวอร์ไปยังไคลเอนต์
Web Application สำหรับ SSE
ในการใช้ Server-Sent Events ในเว็บแอปพลิเคชันคุณจะต้องเพิ่มองค์ประกอบ <eventsource> ลงในเอกสาร
src แอตทริบิวต์ขององค์ประกอบ <eventsource> ควรชี้ไปที่ URL ซึ่งควรมีการเชื่อมต่อ HTTP แบบต่อเนื่องที่ส่งสตรีมข้อมูลที่มีเหตุการณ์
URL จะชี้ไปที่ PHP, PERL หรือสคริปต์ Python ใด ๆ ซึ่งจะดูแลการส่งข้อมูลเหตุการณ์อย่างสม่ำเสมอ ต่อไปนี้เป็นตัวอย่างง่ายๆของเว็บแอปพลิเคชันที่คาดว่าจะมีเวลาเซิร์ฟเวอร์
<!DOCTYPE HTML>
<html>
<head>
<script type = "text/javascript">
/* Define event handling logic here */
</script>
</head>
<body>
<div id = "sse">
<eventsource src = "/cgi-bin/ticker.cgi" />
</div>
<div id = "ticker">
<TIME>
</div>
</body>
</html>
สคริปต์ฝั่งเซิร์ฟเวอร์สำหรับ SSE
สคริปต์ฝั่งเซิร์ฟเวอร์ควรส่ง Content-typeส่วนหัวระบุชนิดtext / event-streamดังนี้
print "Content-Type: text/event-stream\n\n";
หลังจากตั้งค่า Content-Type สคริปต์ฝั่งเซิร์ฟเวอร์จะส่งไฟล์ Event: tag ตามด้วยชื่อเหตุการณ์ ตัวอย่างต่อไปนี้จะส่ง Server-Time เป็นชื่อเหตุการณ์ที่สิ้นสุดด้วยอักขระบรรทัดใหม่
print "Event: server-time\n";
ขั้นตอนสุดท้ายคือการส่งข้อมูลเหตุการณ์โดยใช้ Data: แท็กซึ่งจะตามด้วยจำนวนเต็มของค่าสตริงที่สิ้นสุดด้วยอักขระบรรทัดใหม่ดังนี้ -
$time = localtime();
print "Data: $time\n";
สุดท้ายต่อไปนี้คือ ticker.cgi ที่เขียนใน Perl -
#!/usr/bin/perl
print "Content-Type: text/event-stream\n\n";
while(true) {
print "Event: server-time\n";
$time = localtime();
print "Data: $time\n";
sleep(5);
}
จัดการเหตุการณ์ที่เซิร์ฟเวอร์ส่ง
ให้เราแก้ไขเว็บแอปพลิเคชันของเราเพื่อจัดการกับเหตุการณ์ที่เซิร์ฟเวอร์ส่ง ต่อไปนี้เป็นตัวอย่างสุดท้าย
<!DOCTYPE HTML>
<html>
<head>
<script type = "text/javascript">
document.getElementsByTagName("eventsource")[0].addEventListener("server-time",
eventHandler, false);
function eventHandler(event) {
// Alert time sent by the server
document.querySelector('#ticker').innerHTML = event.data;
}
</script>
</head>
<body>
<div id = "sse">
<eventsource src = "/cgi-bin/ticker.cgi" />
</div>
<div id = "ticker" name = "ticker">
[TIME]
</div>
</body>
</html>
ก่อนทดสอบเหตุการณ์ที่เซิร์ฟเวอร์ส่งฉันขอแนะนำให้คุณตรวจสอบให้แน่ใจว่าเว็บเบราว์เซอร์ของคุณรองรับแนวคิดนี้