2013-10-16 56 views
6

在最新的幾個NodeJS版本(v0.10.X截止撰寫)中,Streams API經歷了一次可喜的重新設計,現在我想開始使用它。如何在NodeJS中對雙向雙工流進行編碼

我想包裝輸入套接字的輸出與實現協議的對象。

所謂的Duplex接口,似乎只是任何可讀寫的流(如套接字)。

目前尚不清楚Duplexes是否應該像A或B一樣,還是不重要。

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

對於具有兩個可寫和兩個可讀的對象,正確的代碼結構/接口是什麼?

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

與上面的圖中的問題是,對象需要兩個單獨的read方法和兩個write方法。我可以使協議產生'左'和'右'雙工對象,或者'進入'和'出'雙工對象(以不同的方式對其進行切片)。

這些都是首選的方法,還是有更好的解決方案?

回答

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

我的解決辦法是讓一個協議類,它創建了一個向上Transform和一個向下Transform

當構造Up和Down變換時,Protocol構造函數傳遞一個引用(自身)。然後,每個向上和向下變換中的_transform方法可以根據需要在其自身上,在另一個Transform或兩者上調用push。常見狀態可以保存在Protocol對象中。

1

一個雙工流就像你的圖B,至少對用戶來說。一個更完整的流視圖將包括消費者(用戶)的生產者(源)。看我以前的answer。儘量不要從消費者的角度來思考讀寫。

你在做什麼是建築在插座協議薄薄的一層,所以你的設計是正確的:

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

您可以使用雙面或變換的協議的一部分。

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

進程是使用內部_read,_write對傳入/傳出數據進行協議相關處理。或者你可以轉換流。您將協議傳遞給套接字和套接字協議。

+0

協議需要在兩次轉換之間共享狀態。如何做到這一點最好? – fadedbee

+0

您可以設置標誌來表示狀態或存儲數據流中的數據。請參閱[simpleprotocolv2](http://nodejs.org/api/stream.html#stream_example_simpleprotocol_parser_v2)示例。你用這個'this._sawFirstCr = false; this._rawHeader = [];' – user568109

+0

對於您的任務,最好用雙工完成,因爲兩個流都可以輕鬆看到標誌。對於轉換,您將不得不爲兩個流設置標誌兩次。 – user568109