2011-12-06 76 views
0

我有一個Netty應用程序,它將HTTP連接和流間歇性數據傳回,同時保持連接處於打開狀態,直到客戶端關閉它爲止。我可以讓應用程序工作,除了發送緩衝區不會足夠頻繁地推送到客戶端(並且經常跨越合併寫入事件,這會導致另一端的數據接收不完整,直到下一個緩衝區被按下,這可能會很長時間未來)。我想知道是否有辦法讓我寫入發送緩衝區,並強制刷新一個完整的數據塊到客戶端,而無需關閉套接字。在Netty中以編程方式刷新頻道

我已經看過引導程序屬性tcpNoDelay,writeBufferHighWaterMarkwriteBufferLowWaterMark(全部有和沒有「子」。)無效。

有什麼建議嗎?謝謝!

+0

我也嘗試將「sendBufferSize」選項設置爲0,而不進行更改。 –

+0

通過服務器套接字的綁定進行跟蹤,我發現bufferFactory,receiveBufferSize,reuseAddress和backlog是可以在服務器套接字端設置的唯一屬性。我想我必須看看接下來的bufferFactory。 –

回答

0

我想我回答了我自己的問題,這不是由於套接字緩衝區不發送數據。我使用「curl」來測試響應,curl有一個內部緩衝區,它阻止了數據被打印到屏幕上。這可以用「-N」來禁用。完全是我自己的錯,但仍需要花一些時間來挖掘代碼並將其追溯到我的客戶端。

2

只是萬一不清楚,Netty沒有flush()操作。它只是儘快寫入。

1

我認爲你可以添加一個BufferedWriteHandler到ChannelPipeline以模擬緩衝寫入操作。

BufferedWriteHandler web doc

只要你能保持或獲得對BufferedWriteHandler的流水線實例的引用,

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
     BufferedWriteHandler bufferedWriter 
       = e.getChannel().getPipeline().get("buffer"); 

,那麼你可以通過編程刷新,只要你喜歡:

bufferedWriter.flush();