我的问题如下:我有一个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
}
我有一个想法是为 data 事件注册多个事件处理程序,但这看起来有些古怪。处理这个问题的正确方法是什么?
答案 0 :(得分:1)
在处理异步协议时,通常需要设计协议,以便每个请求都有一个唯一的ID,该ID包含在请求数据中并在响应中发回。这样,您就可以收到无序响应,甚至收到未经请求的消息。
当您发送请求时,请将请求ID放在某个列表中,以及在响应到达时将调用的回调。
当您获得数据事件时,将原始数据附加到缓冲区,然后仅从缓冲区中解析出完整的消息,留下不完整的消息以便以后完成。对于解析出的每个完整消息,请检查它是否具有请求ID。如果不是,则消息是未经请求的,因此请相应地处理。否则,在列表中查找请求ID,如果找到,则调用与之关联的回调。