<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; Comet</title>
	<atom:link href="http://blog.chonla.com/category/comet/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Wed, 08 Sep 2010 19:28:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Comet ดาวหางมาแล้ววว, Two-way Web Communication!</title>
		<link>http://blog.chonla.com/2008/10/comet-%e0%b8%94%e0%b8%b2%e0%b8%a7%e0%b8%ab%e0%b8%b2%e0%b8%87%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7-two-way-web-communication/</link>
		<comments>http://blog.chonla.com/2008/10/comet-%e0%b8%94%e0%b8%b2%e0%b8%a7%e0%b8%ab%e0%b8%b2%e0%b8%87%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7-two-way-web-communication/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 16:57:46 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Web Technologies]]></category>
		<category><![CDATA[HTTP Server Push]]></category>
		<category><![CDATA[HTTP Streaming]]></category>
		<category><![CDATA[HTTP-Binding]]></category>
		<category><![CDATA[Reverse Ajax]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=98</guid>
		<description><![CDATA[เทคโนโลยีเว็บปัจจุบันนี้ เป็นลักษณะที่ Client ซึ่งหมายถึง เว็บบราวเซอร์ ทำการติดต่อ และส่งข้อมูลไปยัง Server ซึ่งหมายถึงเว็บเซิร์ฟเวอร์ รอเซิร์ฟเวอร์ประมวลผล และส่งข้อมูลกลับมาที่เว็บบราวเซอร์ และแสดงผลแก่ผู้ใช้ จะเกิดอะไรขึ้น ถ้า Server สามารถส่งข้อมูลมายัง Client ได้เองบ้างล่ะ? น่าตื่นเต้นไม่น้อยเลยทีเดียว ถ้าทำแบบนั้นได้จริง ๆ เมื่อมีการเปลี่ยนแปลงของข้อมูลบนเว็บเฺซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะทำการส่งข้อมูลมาให้เว็บบราวเซอร์โดยอัตโนมัติ เหตุการณ์แบบนี้ ในปัจจุบันนี้ยังทำไม่ได้ครับ ด้วยสาเหตุคือ โปรโตคอล HTTP มันเป็น Stateless Connection ครับ นั่นหมายถึง การเล่นเว็บ เมื่อเว็บบราวเซอร์ได้ข้อมูลจากเว็บเซิร์ฟเวอร์กลับมาแล้วการเชื่อมต่อ (Connection) จะถูกปิดทันที ซึ่งต่างจากโปรแกรมประเภท IRC ซึ่งเป็น Stateful นั่นหมายถึงเมื่อเกิด Connection แล้ว Connection นั้นจะเปิดค้างไว้จนกว่าจะมีการสั่งให้ปิด Connection แต่ัยังไงก็ตามเหตุการณ์ที่คล้ายคลึงกันนี้ยังสามารถทำได้ครับ ผมยกตัวอย่างกรณีของหน้าการแสดงผลการสนทนาระหว่างคนกลุ่มหนึ่งผ่านเว็บ (ไม่ว่าจะเรียกว่าอะไรก็ตาม Chatbox, Shoutbox หรือชื่ออื่น ๆ) กระบวนการอย่างหนึ่งที่เกิดขึ้นคือการ [...]]]></description>
			<content:encoded><![CDATA[<p>เทคโนโลยีเว็บปัจจุบันนี้ เป็นลักษณะที่ Client ซึ่งหมายถึง เว็บบราวเซอร์ ทำการติดต่อ และส่งข้อมูลไปยัง Server ซึ่งหมายถึงเว็บเซิร์ฟเวอร์ รอเซิร์ฟเวอร์ประมวลผล และส่งข้อมูลกลับมาที่เว็บบราวเซอร์ และแสดงผลแก่ผู้ใช้ จะเกิดอะไรขึ้น ถ้า Server สามารถส่งข้อมูลมายัง Client ได้เองบ้างล่ะ?</p>
<p><span id="more-98"></span></p>
<p>น่าตื่นเต้นไม่น้อยเลยทีเดียว ถ้าทำแบบนั้นได้จริง ๆ เมื่อมีการเปลี่ยนแปลงของข้อมูลบนเว็บเฺซิร์ฟเวอร์ เซิร์ฟเวอร์ก็จะทำการส่งข้อมูลมาให้เว็บบราวเซอร์โดยอัตโนมัติ เหตุการณ์แบบนี้ ในปัจจุบันนี้ยังทำไม่ได้ครับ ด้วยสาเหตุคือ โปรโตคอล HTTP มันเป็น Stateless Connection ครับ นั่นหมายถึง การเล่นเว็บ เมื่อเว็บบราวเซอร์ได้ข้อมูลจากเว็บเซิร์ฟเวอร์กลับมาแล้วการเชื่อมต่อ (Connection) จะถูกปิดทันที ซึ่งต่างจากโปรแกรมประเภท IRC ซึ่งเป็น Stateful นั่นหมายถึงเมื่อเกิด Connection แล้ว Connection นั้นจะเปิดค้างไว้จนกว่าจะมีการสั่งให้ปิด Connection แต่ัยังไงก็ตามเหตุการณ์ที่คล้ายคลึงกันนี้ยังสามารถทำได้ครับ</p>
<p>ผมยกตัวอย่างกรณีของหน้าการแสดงผลการสนทนาระหว่างคนกลุ่มหนึ่งผ่านเว็บ (ไม่ว่าจะเรียกว่าอะไรก็ตาม Chatbox, Shoutbox หรือชื่ออื่น ๆ) กระบวนการอย่างหนึ่งที่เกิดขึ้นคือการ Polling เพื่อให้ดู Real-Time ผมตั้งระยะห่างระหว่างการ Poll แต่ละครั้งไว้ที่ 5 วินาที แสดงว่า ใน 1 นาที จะเกิดการ Poll 12 ครั้ง โดยที่ไม่สนใจว่าจะได้อะไรกลับมาบ้าง จะมีใครคุยกันหรือไม่ นี่คือเหตุการณ์สำหรับผู้ใช้ 1 คนนะครับ ถ้ามีคนเข้ามาคุย 50 คน ก็ 600 Poll ใน 1 นาที รู้สึกเยอะหรือยังครับ มันเป็นเหตุที่ทำให้เว็บเซิร์ฟเวอร์ทำงานหนักโดยไม่ได้ Throughput (งานในช่วงเวลาหนึ่ง ๆ) ที่เหมาะสมครับ</p>
<p><strong>ได้เวลาเข้าเรื่อง Comet แล้วครับ</strong></p>
<p>Comet จะเป็นเทคนิคที่ทำให้เว็บเซิร์ฟเวอร์สามารถส่งข้อมูลกลับมาให้เว็บบราวเซอร์ได้ โดยเทคนิคแล้ว จะแบ่งได้เป็น 2 วิธีหลัก ๆ คือ การทำ Streaming และการทำ Long Polling</p>
<p><span style="text-decoration: underline;">การทำ Streaming</span></p>
<p>คือ การที่ให้ Server สร้าง Connection ไปยังเว็บเซิร์ฟเวอร์ค้างไว้ โดยที่ไม่ปิด เมื่อเว็บเซิร์ฟเวอร์เกิดเหตุการณ์อะไรขึ้น ก็จะส่งกลับมาให้เว็บบราวเซอร์ทำงานได้ทันที เทคนิคง่าย ๆ ของการทำแบบ Streaming คือการทำ IFRAME ซ่อนไว้ โดยที่ใน IFRAME นั้นจะเรียกไปยังหน้าเว็บหน้าหนึ่ง ที่ไม่มีการกำหนด Timeout ไว้ เมื่อเกิด Event อะไรก็ตามที่เว็บเซิร์ฟเวอร์ เว็บเซิร์ฟเวอร์ก็เพียงส่ง script กลับมาให้ใน IFRAME และเนื่องจากมันเป็น script เมื่อได้รับกลับมาแล้วก็จะถูกแปล และประมวลผลทันที (interprete)</p>
<p><span style="text-decoration: underline;">การทำ Long Polling</span></p>
<p>วิธีนี้ ผมเคยได้ยินครั้งแรกตอนที่หัดเขียน Jabber ในชื่อของ HTTP Binding วิธีนี้มีหลักการง่าย ๆ ว่า เพิ่มระยะเวลา Timeout ของ Request Connection ออกไปให้นานที่สุด เมื่อเกิด Event ให้เว็บเซิร์ฟเวอร์ส่งข้อมูลกลับมาที่ Connection ที่เปิดไว้นั้น และทำการปิดทันทีตามลักษณะของ Stateless Connection เมื่อเว็บบราวเซอร์ได้รับ Event กลับมา ก็ให้ทำการสร้าง Connection ใหม่ขึ้นมาอีกทันที วิธีนี้ก็เหมือนกับวิธีการ Poll เพียงแค่เรายืดเวลา Timeout ในการ Poll แต่ละครั้งออกไปให้มากขึ้น</p>
<p>การทำ Long Polling ทำได้หลายวิธี ไม่ว่าจะเป็นการใช้ Ajax, XMLHTTPRequest หรือการใช้ Script Tag Long Polling คุณสามารถอ่านเพิ่มเติมได้จากแหล่งอ้างอิงท้ายบทความครับ</p>
<p><strong>บทสรุป</strong></p>
<p>ด้วยความเห็นส่วนตัวแล้ว ผมสนใจในส่วนของการทำ Long Polling มากกว่า เพราะความง่ายในการพัฒนา ดูแล้วจะไม่ซับซ้อนมากเหมือนการทำ Streaming หรือใครมีความคิดเห็นอย่างอื่นก็แลกเปลี่ยนกันได้ครับ</p>
<p><strong>แหล่งอ้างอิง</strong></p>
<ul>
<li><a title="WIKI: COMET (Programming)" href="http://en.wikipedia.org/wiki/Comet_(programming)" target="_blank">http://en.wikipedia.org/wiki/Comet_(programming)</a></li>
<li><a title="Comet: A New Approach to Ajax Applications" href="http://ajaxian.com/archives/comet-a-new-approach-to-ajax-applications" target="_blank">http://ajaxian.com/archives/comet-a-new-approach-to-ajax-applications</a></li>
<li><a title="COMET Daily" href="http://cometdaily.com/" target="_blank">http://cometdaily.com/</a></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/10/comet-%e0%b8%94%e0%b8%b2%e0%b8%a7%e0%b8%ab%e0%b8%b2%e0%b8%87%e0%b8%a1%e0%b8%b2%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7%e0%b8%a7%e0%b8%a7-two-way-web-communication/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
