什么';socket流对话的node.js范例是什么?

什么';socket流对话的node.js范例是什么?,node.js,sockets,stream,Node.js,Sockets,Stream,我正在尝试实现一个套接字协议,但我不清楚如何继续。我将套接字作为一个流对象,我能够向它写入()数据以在套接字上发送,并且我知道“可读”或“数据”事件可以用于接收数据。但是,如果协议涉及一个对话,其中一个主机应该发送一段数据,等待响应,然后在响应后再次发送数据,那么这种方法就不能很好地工作 在块范例中,它将如下所示: send some data wait for specific data reply massage data and send it back send additional d

我正在尝试实现一个套接字协议,但我不清楚如何继续。我将套接字作为一个流对象,我能够向它写入()数据以在套接字上发送,并且我知道“可读”或“数据”事件可以用于接收数据。但是,如果协议涉及一个对话,其中一个主机应该发送一段数据,等待响应,然后在响应后再次发送数据,那么这种方法就不能很好地工作

在块范例中,它将如下所示:

send some data
wait for specific data reply
massage data and send it back
send additional data
据我所知,节点的Stream对象没有一个read函数,该函数将异步返回请求的字节数。否则,每次等待只能将剩余的功能放在自己的回调中


这种类型的通信的node.js范例是什么?

技术上有一个Readable.read(),但不建议使用它(可能您无法确定大小或它阻塞,不确定)。您可以跟踪状态,并在每个数据事件上添加一个缓冲区,以增量方式进行处理。如果需要,您可以在缓冲区上使用readUInt32LE等来读取特定的二进制数据段(或者,如果是文本数据,您可以将其转换为字符串)

如果您想在“块范例”中编写它,基本上可以将某些东西作为承诺或异步函数,然后

let specialReplyRes = null;

waitForSpecialReply = f => new Promise( res => specialReplyRes = res);

stream.on('data', (buff) => {
  if (buff.toString().indexOf('special')>=0) specialReplyRes(buff.toString());
});

// ...

async function proto() {
  stream.write(data);
  let reply = await waitForSpecialReply();
  const message = massage(reply);
  stream.write(message);
}

您的waitForSpecialReply承诺在通过解析接收到特定消息后被存储和解析。

技术上有一个可读的.read(),但不建议使用它(可能您无法确定其大小或它会阻塞,不确定)您可以跟踪状态,并在每个数据事件上添加一个以增量方式处理的缓冲区。如果需要,您可以在缓冲区上使用readUInt32LE等来读取特定的二进制数据段(或者,如果是文本数据,您可以将其转换为字符串)

如果您想在“块范例”中编写它,基本上可以将某些东西作为承诺或异步函数,然后

let specialReplyRes = null;

waitForSpecialReply = f => new Promise( res => specialReplyRes = res);

stream.on('data', (buff) => {
  if (buff.toString().indexOf('special')>=0) specialReplyRes(buff.toString());
});

// ...

async function proto() {
  stream.write(data);
  let reply = await waitForSpecialReply();
  const message = massage(reply);
  stream.write(message);
}

您的waitForSpecialReply承诺被存储并在通过您的解析收到某条消息后解析。

我还没有真正了解承诺。。。关于基于状态的方法,我在服务器端就是这样做的,我需要做的就是获取一个请求并发送一个回复,但在客户端,它有点复杂,因为我必须发送、接收、发送然后接收,所以我必须以某种方式同步发送和接收。我还没有真正把我的头围绕在承诺上。。。关于基于状态的方法,我在服务器端就是这样做的,我需要做的就是获取一个请求并发送一个回复,但是在客户端它有点复杂,因为我必须发送、接收、发送然后接收,所以我必须以某种方式同步发送和接收。