2014-07-08 116 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,如果找到,则调用与其关联的回调。