2013-05-19 78 views
1

我想了解Web套接字如何工作。我確實有一個基本的理解,即與web插座中的AJAX不同,連接總是打開,這對實時應用程序很方便。Web套接字多個請求

這是非常基本的例子使用襪子:

var sock = new SockJS('http://mydomain.com/my_prefix'); 

    sock.onopen = function() { 
     console.log('open'); 
    }; 

    sock.send("request to send (JSON)"); 

    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 

    sock.onclose = function() { 
     console.log('close'); 
    }; 

要求:我有多個控件來顯示實時數據,所以我想每個插件訂閱JSON請求/服務,保持連接開放,必要時取消訂閱。

問題:在這種情況下,我們如何處理多個請求,就像我們使用典型的AJAX設置一樣?

我會很感激,如果有人能指導我正確的方向,給我一個例子或指南的鏈接。

有人嗎?

回答

2

的事情是,與當你發送多個請求,說reqAreqBreqC,那麼服務器必須響應以相同的順序這些請求resAresBresC(這是在假設keep-alive是HTTP ,參見the specification)。然後瀏覽器知道哪個請求是哪個響應。

但是對於WebSockets,您必須手動編寫此代碼。還有其他選項。例如其中一個有趣的想法是使用事件系統。服務器將接受形式爲

{ 
    "event": "test", 
    "data": ["foo"] 
} 

並且它將以相同的形式向客戶端發送數據。在這種情況下,你可以做這樣的事情:

var EventManager = // some code here; 
sock.onmessage = function(e) { 
    var msg = JSON.parse(e.data); 
    EventManager.trigger(msg.event, msg.data); 
}; 

,你可以簡單地做

EventManager.on("test", function(data) { 
    // handle "test" event here 
}); 

當然,你必須實現EventManager事件註冊。對於您可以使用現有的實現方式之一,像Backbone.js也可以實現它自己的,喜歡這裏:

Implementing events in my own object

+0

正是我一直在尋找。一旦我實施我的解決方案後,我會回覆。謝謝 –

+0

我敢打賭,以前有人必須這樣做,你知道一些github回購? –

+0

@ fe-ninja我認爲Socket.IO使用類似的想法(但它與服務器端集成)。我沒有意識到任何客戶端的唯一庫。那麼,首先這並不難。 – freakish