【问题标题】:What's the node.js paradigm for socket stream conversation?套接字流对话的 node.js 范式是什么?
【发布时间】:2017-05-30 02:21:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: node.js sockets stream


    【解决方案1】:

    从技术上讲,有一个 Readable.read() 但不推荐它(也许你不能确定大小或它阻塞,不确定。)你可以跟踪状态并在每个数据事件上添加到缓冲区你不断地处理。如果需要,可以在 Buffer 上使用 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 承诺存储和解析的位置。

    【讨论】:

    • 我还没有真正理解承诺...关于基于状态的方法,这就是我在服务器端的做法,我需要做的就是获取请求并发送回复,但在客户端它有点复杂,因为我必须发送、接收、发送然后接收,所以我必须以某种方式同步发送和接收。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2013-06-25
    • 2010-12-16
    • 2014-04-26
    相关资源
    最近更新 更多