我正在尝试实现套接字协议(protocol),但我不清楚如何继续。我将套接字作为 Stream 对象,并且我能够向其写入数据以在套接字上发送,并且我知道“可读”或“数据”事件可用于接收数据。但是,当协议(protocol)涉及一个主机应该发送一段数据,等待响应,然后在响应后再次发送数据的 session 时,这种方法就不太适用了。
在 block 范例中,它看起来像这样:
send some data
wait for specific data reply
massage data and send it back
send additional data
据我所知, Node 的 Stream 对象没有读取函数,该函数将异步返回请求的字节数。否则,每次等待都可以将剩余的功能放入自己的回调中。
这种类型的通信的 Node.js 范例是什么?
最佳答案
从技术上讲,有一个 Readable.read() 但不推荐(也许您无法确定大小或它会阻塞,不确定。)您可以跟踪状态,并将每个数据事件添加到您不断增量处理的缓冲区中。如果需要,您可以在 Buffer 上使用 readUInt32LE 等来读取特定的二进制数据(或者如果是文本数据,则可以转换为字符串)。 https://github.com/runvnc/metastream/blob/master/index.js
如果你想用“ block 范例”编写它,你基本上可以将某些东西作为 promise 或异步函数,然后
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 promise 将被存储并解析。
关于node.js - 套接字流对话的 Node.js 范例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41656170/