2012-03-23 87 views
1

我在node.js中啓動了一個學校項目。這是一個由兩個通過TCP套接字連接的node.js服務器組成的系統。通過node.js中的TCP實現可靠的消息傳遞

我嘗試了一些TCP庫(來自節點本身的net模塊,來自nodejitsu的nssocket,現在我正在試驗zeromq),但它們似乎沒有一個重要特性:消息傳遞確認。

我想有一些類型的庫,允許做這樣的事情:

client.connect(server, port); 
client.send(data, function callback(err, res) { ... }); 

將消息傳遞或當壞事(超時,網絡故障後的回調函數將被稱爲)在發送過程中發生。

我在想我會通過TCP編寫我自己的協議,但我更喜歡somethink更強大和測試。

感謝任何建設性的答案:)

+0

我想你可以送東西回了句「是的,我明白了」可以肯定。即使它到達最終的物理目的地,緩衝等等呢?再加上這是TCP,沒有「信息」這樣的東西。這是一個流。 – 2012-03-23 14:57:50

+0

是的,我想到了這樣的事情。但是現在我應該怎麼辦?「是的,我知道了」包丟失了?緩衝不是一個真正的問題(我認爲) - 我使用處理它的nssocket庫(或者我可以簡單地寫一些包裝器來爲數據添加分隔符)。我正在尋找的是某種類型的庫,它通過TCP提供「消息抽象」,並確保消息是交付還是丟失......這個要求對我來說是絕對至關重要的(我不認爲這是異域風情:)我幾乎可以肯定其他人也必須處理它......) – kobza 2012-03-23 15:33:51

+0

Err,TCP中沒有「丟失的數據包」,或者確實是「數據包」之類的東西。它是一個流,並且該流中字節的傳遞和順序是_guaranteed_(顯然,除非套接字關閉或其他)。不能保證的是,數據是分散的還是集中在一起的。 – 2012-03-23 15:40:35

回答

0

這不是真的很方便,因爲當你去A->B罰款會發生什麼,但收到確認失敗(B->A)?總之,這是很容易推出自己的,像(僞):

發件人

var callbacks = {}; 
function send (msg, callback) { 
    // assign unique request id 
    msg.msgId = uuid.v4(); 
    msg.timestamp = new Date(); 
    callbacks[msg.msgId] = callback; 

    // send over TCP 
} 

socket.on("confirmation", function (msg) { 
    callbacks[msg.msgId](null); 
    delete callbacks[msg.msgId]; 
}); 

// now you'll need some polling mechanism that checks for messages that take 
// more than the timeout and clean them 

接收機

socket.on("message", function (msg) { 
    // send confirmation to sender 
    socket.emit("confirmation", { msgId: msg.msgId }); 
});