2011-12-06 8 views
0

私は、HTTP接続を行い、クライアントがそれを閉じるまで接続を開いたままにして間欠的なデータをストリームするNettyアプリケーションを持っています。私は、送信バッファが頻繁にクライアントに十分にプッシュしないことを除いて、アプリケーションを動作させることができます(そして、しばしば、次のバッファがプッシュされるまで不完全なデータ受信を引き起こす、到来)。私は送信バッファに書き込む方法があるかどうかを知りたいと思います。ソケットを閉じることなくクライアントにデータの完全な断片を送るように強制します。Nettyでチャンネルをプログラムでフラッシングする

ブートストラップのプロパティtcpNoDelaywriteBufferHighWaterMark、およびwriteBufferLowWaterMark(すべて「子供」の有無を問わず)は無効です。

提案がありますか?ありがとう!

+0

私は変更せずに0に設定された "sendBufferSize"オプションも試みました。 –

+0

サーバソケットのバインドをたどると、bufferFactory、receiveBufferSize、reuseAddress、およびbacklogが、サーバソケット側で設定できる唯一のプロパティであることがわかります。私は、次にbufferFactoryを見なければならないと思います。 –

答えて

0

私は自分自身の質問に答えたと思うし、それはソケットバッファがデータを送信しないためではありませんでした。私は "curl"を使ってレスポンスをテストし、カールにはデータがスクリーンに印刷されないようにする内部バッファがあります。これは "-N"で無効にすることができます。私自身の過ちですが、コードを掘り下げてクライアントに戻すまでにはまだ時間がかかりました。

2

Nettyには、flush()操作がありません。できるだけ早く書きます。

1

バッファリングされた書き込み操作をエミュレートするために、ChannelPipelineにBufferedWriteHandlerを追加できると思います。

BufferedWriteHandler web doc

限り、あなたがBufferedWriteHandlerのパイプライン化されたインスタンスへの参照を維持または取得できるよう、

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

好きなように、あなたができるプログラムでフラッシュ:

bufferedWriter.flush(); 
関連する問題