2012-01-24 67 views
1

我有兩個系統要集成,一個使用完全內部網絡堆棧,另一個使用Netty(特別是Flazr)。我想通過我們內部的HTTP棧代理基於Flazr Netty的RTMP流,以生成一個可以說RTMPT的系統。爲了實現這一點,我需要一個類似於套接字的Netty對象,但我可以自己完成所有「低級」內容 - 基本上只是將數據封裝在HTTP中並將其傳遞給我們的自定義網絡堆棧。換句話說,我不希望Netty爲我管理任何套接字 - 我想在套接字和Netty之間插入我自己的東西。自定義Netty ServerChannel實現

我懷疑正確的方法是擴展AbstractServerChannel並創建一個* Factory類,但我不確定Netty的其餘部分是如何期望數據流過ServerChannel的。

我定製ServerChannel需要能夠:

  • 通知的Netty當一個新的客戶通過我們現有的HTTP系統連接

  • 推數據高達Netty的,當它到達

  • 輪詢從Netty的新郵件,在客戶端的請求

  • 清理Netty的狀態時出HTTP會話時間(或RTMP流被完全關閉)

上ServerChannel,ServerChannelFactory如何任何指針執行?我發現javadocs在這方面相當缺乏。

一些具體問題:

  • 應該如何實施我的迴應 「InterestOps」 型的東西?

  • 是ServerChannel.write所謂的下來堆棧一路來的消息?這兩種不同的超載有什麼關係?

  • 我如何需要實現ServerChannel。(DIS)連接?

  • 如果我還是做了所有的這些東西通過ServerBootstrap,或者是過於高層次的東西?

謝謝!

之前有人問:是的,我願意代替我們用的Netty基於一個定製的網絡協議棧,但是這是我想也很難證明一個大型的工程任務。嬰兒的步驟。

回答

10

它看起來像,你試圖實現一個新的異步傳輸,所以它將是值得看看NIO TCP transport(除數據報類)。

我不知道它是多麼重要,但它有助於瞭解如何編寫一個新的運輸服務Netty的(既然你問到服務器,客戶渠道,工廠,和所有)

它將更容易如果你能理解Netty事件模型以及如何通過管道。這是我對它的工作原理的理解。

  • 上游事件(事件來自網絡)從Channel/ServerChannel,老闆/ NioWorker開始,通過管道送,直到它到達的最後一個處理。

  • 下游事件從上一個下游處理程序開始,通過流水線發送並接收,通道接收進程處理事件並採取行動或將消息放入通道的隊列中。

更詳細地說,(我假設,有人正在尋找Nio TCP傳輸類來爲Netty編寫自定義傳輸)。

NioWorker - 在用於通道選擇器事件(所有NioClientSocketChannel,NioAcceptedSocketChannel),運行NIO環 - 從網絡接收的數據:火消息中接收 - 民意調查寫隊列和不非阻塞寫 - 輪詢任務排隊感興趣的操作事件並暫停/恢復頻道?

老闆

  • 運行服務器NIO事件循環。
  • 接受客戶端的插口,創建一個NioAcceptedSocketChannel,並NioWorker

NioClientSocketPipelineSink

  • 有職工線程池執行登記選擇。
  • 將NioWorker runnables提交給構造函數的工作線程池。
  • 客戶端通道下游事件在此下沉並放入通道寫入隊列/任務隊列,攔截一些上游狀態事件並管理通道狀態。

NioServerSocketPipelineSink

  • 有老闆線程池。
  • 在創建時提交Nio工作人員可執行文件。
  • 提交老闆runnable與ServerSocketChannel執行器綁定事件。
  • 服務器通道下游事件在此下沉,攔截一些上游狀態事件並管理ServerSocketChannel狀態。

我的實現應該如何迴應「InterestOps」類型的東西?

它取決於通道的性質(阻塞/非阻塞)和約束。

是ServerChannel.write什麼是所謂的消息,一直沿着堆棧?這兩種不同的超載有什麼關係?

服務器通道已經沒有必要支持這些方法調用,我想你指的是頻道的

ChannelFuture write(Object message); 

ChannelFuture write(Object message, SocketAddress remoteAddress); 

這些方法在那裏爲連接傳輸。對於TCP,兩者實際上都在做同樣的事情。

我該如何實現ServerChannel。(dis)connect?

服務器通道不需要支持那些方法調用,但您應該在這裏實施bindunbind

我仍然應該通過ServerBootstrap做所有這些東西,還是對於這個東西來說太高級了?

服務器/客戶端bootstraps只是幫助程序類來管理管道資源並提供一個門面綁定,連接&斷開連接。你必須實現大部分的邏輯在

客戶端,服務器頻道Impls
客戶端,服務器管道下沉
老闆,工人類,

然後,你必須實現客戶端使用上述類&服務器通道工廠,如果這些事情完成,您可以使用Bootstrap類簡單地設置服務器客戶端&。

+0

我認爲這屬於netty 3.x.x,netty 4.x.x的代碼在傳輸實現時會完全改變。 –