套接字响应的异步处理

时间:2014-07-08 22:46:51

标签: sockets asynchronous tcp

我的问题如下:我有一个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 事件注册多个事件处理程序,但这看起来有些古怪。处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

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

当您发送请求时,请将请求ID放在某个列表中,以及在响应到达时将调用的回调。

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