node.js - 套接字流对话的 Node.js 范例是什么?

标签 node.js sockets stream

我正在尝试实现套接字协议(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/

相关文章:

c++ - C++ Linux 中的套接字超时

sockets - NSInputStream 无法从 TCP 连接读取 [TCP-Server]

c# - 为什么我的网络流下载 0 字节?

sockets - 如何使用 C 中的套接字读取流的 TCP 数据包?

node.js - npm包中的"Unknown visitor type",主角

node.js - 有没有办法在运行时更改node.js?

c - 警告 : cast to pointer from integer of different size [-Wint-to-pointer-cast]

input - 如何将数据直接流式传输到 tensorflow 中,而不是读取光盘上的文件?

javascript - 为什么 node.js 进程被杀死?

javascript - 如何使用 nodejs 打开默认浏览器并导航到特定 URL