COMET的一些探討

Intro 
    Comet這個詞出自於 Dojo 作者 Alex Russell 在 2006/3/3 發表的Comet: Low Latency Data for the Browser 。簡單來說就是讓 Browser 跟 Server 作一個長時間不斷線的連線,然後我們要在 Web 撰寫 Rich Client 的程式就相當的容易。[1]

Benefit 
    Comet 的好處是不用像 Polling 一樣耗費太多不必要的頻寬,壞處是 Web Server 架構要修改程式成 Comet 的運作方式,在Browser 部份也有問題要修改,因為 IE 不下載完成就不顯示網頁,必須使用 iframe 或是 Flash 來幫忙做到抓取即時資料的任務。
市場
目前使用 Comet 技術比較知名公司已經有
  1. GMail's GTalk integration
  2. Jot Live 
  3. Renkoo 
  4. cgi:irc 
  5. Meebo

Comet的種類
  1. 輪詢 – Polling (每隔幾秒詢問server) 
  2. 保持連線 - Comet (Server 端的 Polling)
  3. Long Pulling 發一個長時間等待的 Request (NOW) 
  4. WebSocket (未來之星) (HTML5[目前僅CHROME支援] 、NodeJS可透過module完成)
 詳細可參考 Browser 與 Server 持續同步的作法介紹 (Polling, Comet, Long Polling, WebSocket[2]
技術介紹
  • Ajax Push Engine (APE) APE (Ajax Push Engine)
   是一個全功能的開源 Ajax Push 的解決方案。APE 包含一個 Comet 服務器端(支持主流的Linux平台)和一個 JavaScript 客戶端框架,用來在瀏覽器上實現任何的實時數據傳輸應用的需求,而無須安裝任何的客戶端軟件。 支援所有Linux OS 向客戶端發送訊息像這樣
 socket.onRead = function(data) {  
        Ape.log("Data : " + data);  
        if (chan) {  
            //向Channel裏發送數據,所有join用戶都能收到  
            chan.pipe.sendRaw('CUSTOM_RAW', JSON.parse(data), {'from': 'sserver'});   
        } else {  
            return ['109', 'UNKNOWN_PIPE'];  
        }  
    } 
客戶端要建立事件產生的程式碼
        pipe.request.send('getst', {'pipe': 'testChannel'});  
                    console.log('Sending Hello world');  
                });   
                //接收數據  
                client.onRaw('CUSTOM_RAW', function(raw, pipe) {  
                    var cell1=document.getElementById("sp");  
                    cell1.innerHTML=JSON.stringify(raw.data);  
                });  
            });  
更多請參閱官網[6]
  • Node JS 
     NodeJS 是一個高效能、易擴充的網站應用程式開發框架 (Web Application Framework) 。它誕生的原因,是為了讓開發者能夠更容易開發高延展性的網路服務,不需要經過太多複雜的調校、效能調整及程式修改,就能滿足網路服務在不同發展階段對效能的要求。
    Node.js是建築在Google Chrome所開放原始碼的V8 JavaScript引擎上,是目前最快速的JavaScript處理引擎之一,以non-blocking的概念作為基礎(與Nginx雷同),提供相對於一般網頁伺服器(像是Apache)更快速的request處理效能。[3]
    瀏覽器的 JavaScript 與實現 CommonJS 規範的 NodeJS 有何不同呢?瀏覽器的 JavaScript 提供 XMLHttpRequest ,讓程式可以和網頁伺服器建立資料傳輸連線,但這通常隻能適用於網站開發的需求,因為我們隻能用 XMLHttpRequest 與網頁伺服器通訊,卻無法利用它建立其他類型如 Telnet / FTP / NTP 的伺服器通訊。如果我們想開髮網路服務程式,例如 SMTP 電子郵件伺服器,就必須使用 Sockets 建立 TCP (某些服務則用 UDP) 監聽及連線,其他程式語言如 PHP 、 Java 、 Python 、 Perl 及 Ruby 等,在標準開發環境中皆有提供 Sockets API ,而瀏覽器的 JavaScript 基於安全及貼近網站設計需求的考量下,並未將 Sockets 列入標準函式庫之中。 CommonJS 的規範填補這種基礎函式庫功能的空缺,遵循 CommonJS 規範的 NodeJS 可以直接使用 Sockets API 建立各種網路服務程式。
var http = require('http'); 
http.createServer(function (req, res) { 
res.writeHead(200, {'Content-Type': 'text/plain'});
 res.end('Hello World\n');
 }).listen(1337, "127.0.0.1"); 
console.log('Server running at http://127.0.0.1:1337
   nodeJS 介紹[5]
  • StreamHub (The Reverse Ajax / Comet Server)
    StreamHub是一種建立在自己開發的AJAX API PUSH服務 可與許多的開發框架連結 像JAVA、NET等 屬於一種WebService服務 有自己的附載平衡 連接管理 可提供叢集伺服器使用 缺點是非開源 而且要錢 > StreamHub is a highly-scalable HTTP Comet and Reverse Ajax server allowing you to push live data to a web browser without requiring any plugins or security-policy changes. It uses a technique known as Comet or Reverse Ajax to keep a persistent connection open to the browser. HTML, Ajax, GWT, .NET, iPhone and Java clients can all receive data from StreamHub. Data can be streamed into StreamHub using the Java or .NET SDKs. StreamHub's highly-scalable architecture is used for streaming live stock quotes, spread betting, real-time monitoring, instant messaging/chat, live news/sports delivery, online gaming and a whole host of Rich Internet Applications.[7] 客戶端
var hub = new StreamHub();
hub.connect("http://localhost:7979/streamhub/");
hub.subscribe("/channel", function (sTopic, oJsonUpdate) {
    alert("Received an update on topic " + sTopic);
    alert("Contents: " + oJsonUpdate['field1']);
});
伺服端
var hub = new StreamHub();
hub.connect("http://localhost:7979/streamhub/");
hub.publish("/channel", "{'field1':'value1','field2':'value2'}");

    目前Server Push技術我們鎖定在國外最熱門,而且彈性最大的NodeJS上 下一篇會討論NodeJS的技術討論
[1]淺談 Comet PUSH Server 架構 http://lightyror.thegiive.net/2007/06/comet-push-server.html
[2]Browser 與 Server 持續同步的作法介紹 (Polling, Comet, Long Polling, WebSocket http://www.josephj.com/entry.php?id=358
[3]Node.js 究竟是什麼?http://www.ibm.com/developerworks/cn/opensource/os-nodejs/index.html?ca=drs
[4]nodejs異步IO的實現 http://cnodejs.org/blog/?p=244
[5]nodeJS 介紹http://wiki.nodejs.tw/nodejs_from_scratch/introduction
[6]Ajax Push Engine http://www.ape-project.org/demos/
[7]http://www.stream-hub.com/

留言

這個網誌中的熱門文章

Office 2021 離線安裝封裝與KMS啟動步驟

Ollama使用心得與模型導入教學

ARC下NSMutableDictionary 無法使用retainCount