2014-10-17 104 views
4

最近我在用netty進行實驗。我遇到以下問題:寫作和寫作之間的衝突有什麼區別?

ctx.channel().write(new TextWebSocketFrame("hello")) didnot return hello在客戶端,但ctx.channel().writeAndFlush(new TextWebSocketFrame("hello"))沒有。

two有什麼區別? ctxChannelHandlerContext

+0

通常,在刷新之前,寫入可能會緩衝某些數據。寫入和刷新意味着將數據放入流中而不緩衝它。發送大量數據時,緩衝通常更快。 – abc 2014-10-17 12:56:21

+0

好吧,只有「寫」從未幫助我發送數據。 – 2014-10-17 12:59:50

+0

即使您使用write(),您也需要始終刷新數據,然後在編寫之後應該執行ctx.channel()。flush()。無論留在緩衝區中的是什麼都將被刷新(發送)。 – brso05 2014-10-17 13:02:09

回答

3

根據DOC

http://netty.io/4.0/api/io/netty/channel/Channel.html

channel.writeAndFlush(msg); 

channel.write(msg); 
    channel.flush(); 

而且flush()刷新寫下)所有懸而未決的緩衝區的快捷方式。

+0

因此如果我不刷新,懸而未決的緩衝區總是保持掛起狀態? – 2014-10-17 13:04:25

+1

@Md。阿拉法特·馬哈茂德:不,不。但是它是* system *來決定緩衝區何時應該被寫下來。 – 2014-10-17 13:08:44

+0

我明白了。但我不確定netty本身是否會覆蓋一般的緩衝機制。 – 2014-10-17 13:11:48

1

我認爲它的工作方式是,如果您使用寫入,並且您發送的數據超過了緩衝區的容量,它將在緩衝區滿時自動刷新以騰出更多數據進行緩衝。最後,當沒有其他數據通過緩衝區推送其他數據時,必須調用flush()來刷新緩衝區中剩下的任何數據。在你的情況下,你發送的內容不會超過緩衝區的大小,因此它位於緩衝區中,並且沒有任何東西將其通過,這就是爲什麼在寫入後必須調用flush()來推送緩衝區中剩下的內容。 writeAndFlush方法會自動爲您執行此操作,我認爲當它到達結尾時,它會自動刷新緩衝區。

+0

這是有道理的。 – 2014-10-17 13:09:03

0

那麼,顯然在Netty write()緩衝區和flush()沖洗。事實上,正如在BufferedOutputStream中那樣。

所以問題出現了:什麼時候到flush()?答案是,在發送請求或響應結束時,除非您要關閉頻道。例如,在一個客戶端,優點是所有的請求卡丁車,刷新,然後讀取響應。在服務器中,發送所有響應部分,然後刷新。

相關問題