如何在NodeJS中编码双向双工stream

在最新的几个版本的NodeJS(v0.10.X截止撰写)中,Streams API经历了一个可喜的重新devise,现在我想开始使用它。

我想用一个实现一个协议的对象包装一个套接字的input输出。

所谓的Duplex接口,似乎只是任何可读写的stream(如套接字)。

目前尚不清楚Duplexes是否应该像A或B一样,还是不重要。

+---+ +---+ -->| A |--> | |--> +---+ | B | | |<-- +---+ 

对于有两个可写和两个可读的对象,什么是正确的代码结构/接口?

 +--------+ +----------+ +---- | r|-->|wr|-->|w | socket | | protocol | | rest of app | w|<--|rw|<--|r +--------+ +----------+ +---- 

上图的问题是protocol对象需要两个独立的read方法和两个write方法。

在我的头顶,我可以使协议产生“左”和“右”双工对象,或者“进出”双工对象(以不同的方式)。

这些都是首选的方法,还是有更好的解决scheme?

  | app | +---------------+ ^ | | V +-----+ +-----+ | | | | +----------| |-| |-+ | protocol | .up | |.down| | +----------| |-| |-+ | | | | +-----+ +-----+ ^ | | V +---------------+ | socket | 

我的解决scheme是创build一个协议类,它创build了一个上Transform和下Transform

在构造Up和Down变换时,Protocol构造函数传递一个引用(自身)。 每个上下变换中的_transform方法都可以根据需要调用本身,另一个Transform或两者。 通用状态可以保存在Protocol对象中。

双向stream就像你的图B,至less对于用户来说。 一个更完整的stream视图将包括消费者(用户)的生产者(源)。 看到我以前的答案 。 尽量不要从消费者的angular度来思考读写。

你正在做的是在协议的socket上build立一个薄层,所以你的devise是正确的:

  -------+ +----------+ +------ r|---->| r|---->| socket | | protocol | | rest of app w|<----| w|<----| -------+ +----------+ +------ 

您可以使用双工或协议部分转换。

  +---------+--------+---------+ +------------------+ | _write->| | |r | Transform -> |r |-----------Duplex-----------| +------------------+ | | | <-_read |w | <- Transform |w +---------+--------+---------+ +------------------+ 

进程是使用内部_read,_write处理传入/传出数据的协议相关处理。 或者你可以转换stream。 你会协议到套接字和套接字协议。

Interesting Posts