什么是Node.js套接字流对话的范式



我正在尝试实现套接字协议,但我不清楚如何进行。 我将套接字作为 Stream 对象,并且我能够向其写入 () 数据以发送到套接字上,并且我知道"可读"或"数据"事件可用于接收数据。 但是,当协议涉及一个主机应该发送一段数据,等待响应,然后在响应后再次发送数据的会话时,这并不有效。

在块范式中,它看起来像这样:

send some data
wait for specific data reply
massage data and send it back
send additional data

据我所知,node的Stream对象没有读取函数,该函数将异步返回请求的字节数。 否则,每次等待都可能只是将剩余的功能放在自己的回调中。

这种通信的节点.js范式是什么?

从技术上讲,有一个 Readable.read(),但不推荐它(也许你不能确定大小或它阻止,不确定。您可以跟踪状态,并在每个数据事件上添加到您以增量方式处理的缓冲区中。 如果需要,您可以在缓冲区上使用readUInt32LE等来读取特定的二进制数据片段(或者如果其文本数据,则可以转换为字符串)。 https://github.com/runvnc/metastream/blob/master/index.js

如果你想用你的"块范式"写它,你基本上可以让一些东西成为承诺或异步函数,然后

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 承诺在通过解析收到特定消息后存储和解析的位置。

最新更新