เทคโนโลยีเว็บปัจจุบันนี้ เป็นลักษณะที่ Client ซึ่งหมายถึง เว็บบราวเซอร์ ทำการติดต่อ และส่งข้อมูลไปยัง Server ซึ่งหมายถึงเว็บเซิร์ฟเวอร์ รอเซิร์ฟเวอร์ประมวลผล และส่งข้อมูลกลับมาที่เว็บบราวเซอร์ และแสดงผลแก่ผู้ใช้ จะเกิดอะไรขึ้น ถ้า Server สามารถส่งข้อมูลมายัง Client ได้เองบ้างล่ะ?
น่าตื่นเต้นไม่น้อยเลยทีเดียว ถ้าทำแบบนั้นได้จริง ๆ เมื่อมีการเปลี่ยนแปลงของข้อมูลบนเว็บเฺซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะทำการส่งข้อมูลมาให้เว็บบราวเซอร์โดยอัตโนมัติ เหตุการณ์แบบนี้ ในปัจจุบันนี้ยังทำไม่ได้ครับ ด้วยสาเหตุคือ โปรโตคอล HTTP มันเป็น Stateless Connection ครับ นั่นหมายถึง การเล่นเว็บ เมื่อเว็บบราวเซอร์ได้ข้อมูลจากเว็บเซิร์ฟเวอร์กลับมาแล้วการเชื่อมต่อ (Connection) จะถูกปิดทันที ซึ่งต่างจากโปรแกรมประเภท IRC ซึ่งเป็น Stateful นั่นหมายถึงเมื่อเกิด Connection แล้ว Connection นั้นจะเปิดค้างไว้จนกว่าจะมีการสั่งให้ปิด Connection แต่ัยังไงก็ตามเหตุการณ์ที่คล้ายคลึงกันนี้ยังสามารถทำได้ครับ
ผมยกตัวอย่างกรณีของหน้าการแสดงผลการสนทนาระหว่างคนกลุ่มหนึ่งผ่านเว็บ (ไม่ว่าจะเรียกว่าอะไรก็ตาม Chatbox, Shoutbox หรือชื่ออื่น ๆ) กระบวนการอย่างหนึ่งที่เกิดขึ้นคือการ Polling เพื่อให้ดู Real-Time ผมตั้งระยะห่างระหว่างการ Poll แต่ละครั้งไว้ที่ 5 วินาที แสดงว่า ใน 1 นาที จะเกิดการ Poll 12 ครั้ง โดยที่ไม่สนใจว่าจะได้อะไรกลับมาบ้าง จะมีใครคุยกันหรือไม่ นี่คือเหตุการณ์สำหรับผู้ใช้ 1 คนนะครับ ถ้ามีคนเข้ามาคุย 50 คน ก็ 600 Poll ใน 1 นาที รู้สึกเยอะหรือยังครับ มันเป็นเหตุที่ทำให้เว็บเซิร์ฟเวอร์ทำงานหนักโดยไม่ได้ Throughput (งานในช่วงเวลาหนึ่ง ๆ) ที่เหมาะสมครับ
ได้เวลาเข้าเรื่อง Comet แล้วครับ
Comet จะเป็นเทคนิคที่ทำให้เว็บเซิร์ฟเวอร์สามารถส่งข้อมูลกลับมาให้เว็บบราวเซอร์ได้ โดยเทคนิคแล้ว จะแบ่งได้เป็น 2 วิธีหลัก ๆ คือ การทำ Streaming และการทำ Long Polling
การทำ Streaming
คือ การที่ให้ Server สร้าง Connection ไปยังเว็บเซิร์ฟเวอร์ค้างไว้ โดยที่ไม่ปิด เมื่อเว็บเซิร์ฟเวอร์เกิดเหตุการณ์อะไรขึ้น ก็จะส่งกลับมาให้เว็บบราวเซอร์ทำงานได้ทันที เทคนิคง่าย ๆ ของการทำแบบ Streaming คือการทำ IFRAME ซ่อนไว้ โดยที่ใน IFRAME นั้นจะเรียกไปยังหน้าเว็บหน้าหนึ่ง ที่ไม่มีการกำหนด Timeout ไว้ เมื่อเกิด Event อะไรก็ตามที่เว็บเซิร์ฟเวอร์ เว็บเซิร์ฟเวอร์ก็เพียงส่ง script กลับมาให้ใน IFRAME และเนื่องจากมันเป็น script เมื่อได้รับกลับมาแล้วก็จะถูกแปล และประมวลผลทันที (interprete)
การทำ Long Polling
วิธีนี้ ผมเคยได้ยินครั้งแรกตอนที่หัดเขียน Jabber ในชื่อของ HTTP Binding วิธีนี้มีหลักการง่าย ๆ ว่า เพิ่มระยะเวลา Timeout ของ Request Connection ออกไปให้นานที่สุด เมื่อเกิด Event ให้เว็บเซิร์ฟเวอร์ส่งข้อมูลกลับมาที่ Connection ที่เปิดไว้นั้น และทำการปิดทันทีตามลักษณะของ Stateless Connection เมื่อเว็บบราวเซอร์ได้รับ Event กลับมา ก็ให้ทำการสร้าง Connection ใหม่ขึ้นมาอีกทันที วิธีนี้ก็เหมือนกับวิธีการ Poll เพียงแค่เรายืดเวลา Timeout ในการ Poll แต่ละครั้งออกไปให้มากขึ้น
การทำ Long Polling ทำได้หลายวิธี ไม่ว่าจะเป็นการใช้ Ajax, XMLHTTPRequest หรือการใช้ Script Tag Long Polling คุณสามารถอ่านเพิ่มเติมได้จากแหล่งอ้างอิงท้ายบทความครับ
บทสรุป
ด้วยความเห็นส่วนตัวแล้ว ผมสนใจในส่วนของการทำ Long Polling มากกว่า เพราะความง่ายในการพัฒนา ดูแล้วจะไม่ซับซ้อนมากเหมือนการทำ Streaming หรือใครมีความคิดเห็นอย่างอื่นก็แลกเปลี่ยนกันได้ครับ
แหล่งอ้างอิง
อันนี้ ผมบอกตรง ว่าไม่เข้าใจเลย
มันคืออะไรเหริอ ขอศึกษา ก่อนนะครับท่าน อิอิ
ครับ ตามสบายครับ
น่าสนใจดีครับ ตอนนี้มีไหนบ้างครับ มีตัวอย่างหรือเปล่าคับ
เข้าใจว่า IM ที่เป็น XMPP อย่างเช่น Google Chat หรือ Jabber ก็ใช้อยู่ครับ
ผมว่าวิธีแรกเข้าใจง่ายกว่าไม่ต้องใช้ ajax
สี
ตัวหนา
ขีดเส้น
hello
ชอบแบบ ajax อ่ะคับ (เพราะไม่เข้าใจหลัก stream อิอิ) คือกำลังศึกษา ajax อยู่พอดีคับ