2014-07-08 68 views
0

我的問題如下:我有一個TCP套接字,我在其上基於專有協議異步發送消息。在收到消息響應後,我需要確保數據被髮送回最初發送消息的功能。問題是我只能監聽套接字上的「數據」事件(在本例中是在Node.js中)的響應,而且我無法輕鬆確定哪些響應對應於哪些消息。異步處理插座響應

下面是一個例子,我希望能給你一個我想要完成的想法。

function getTemperature (callback) { 
    socket.write(message); 

    // Good? 
    socket.on('data', callback); 
} 

function getVoltage (callback) { 
    socket.write(message); 

    // Other way to invoke callback? 
} 

getTemperature(function (err, temperature) {}); 

getVoltage(function (err, voltage) {}); 

socket.on('data', handleData function (data) { 
    // Somehow send data to correct function 
} 

我有一個想法是註冊多個事件處理程序數據事件,但這似乎有點古怪。處理這個問題的正確方法是什麼?

回答

1

在處理異步協議時,通常需要設計協議,以便每個請求都有一個唯一的ID,該ID包含在請求數據中並在響應中返回。這樣,您可以按順序收到回覆,甚至可以收到未經請求的消息。

當您發送請求時,請將請求ID放在某處的列表中,以及迴應到達時將調用的回調。

當您收到數據事件時,將原始數據附加到緩衝區,然後解析出緩衝區中只有完整的消息,留下不完整的消息供以後完成。對於解析出的每個完整消息,檢查它是否有請求標識。如果否,則該消息是主動提供的,因此相應地處理它。否則,請在列表中查找請求ID,如果找到,則調用與其關聯的回調。