Sockets 套接字响应的异步处理

Sockets 套接字响应的异步处理,sockets,asynchronous,tcp,Sockets,Asynchronous,Tcp,我的问题如下:我有一个TCP套接字,在该套接字上我根据专有协议异步发送消息。收到消息响应后,我需要确保数据被发送回最初发送消息的函数。问题是我只能监听套接字上的“数据”事件的响应(在本例中是在Node.js中),我无法轻松确定哪些响应对应于哪些消息 下面是一个例子,我希望它能让你了解我正在努力实现的目标 function getTemperature (callback) { socket.write(message); // Good? socket.on('data', cal

我的问题如下:我有一个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
}

我的一个想法是为数据事件注册多个事件处理程序,但这似乎有点古怪。正确的处理方法是什么?

在处理异步协议时,通常需要设计协议,以便每个请求都有一个唯一的ID,该ID包含在请求数据中,并在响应中发回。这样,您就可以收到无序的响应,甚至可以收到未经请求的消息

发送请求时,将请求ID与响应到达时将调用的回调一起放在某个位置的列表中

当您获得一个数据事件时,将原始数据附加到缓冲区,然后从缓冲区中只解析出完整的消息,留下不完整的消息供以后完成。对于解析出来的每个完整消息,检查它是否有请求ID。如果没有,则消息是未经请求的,因此相应地处理它。否则,在列表中查找请求ID,如果找到,则调用与其关联的回调