2012-11-28 17 views
6

NettyでHTTPサーバーを作成しています。私はサーバブートストラップを作成するときにキープアライブオプションを設定します。 bootstrap.setOption("child.keepAlive", true); HTTP応答を書くたびに、私はキープアライブヘッダーを設定し、応答を書き込んだ後にチャネルを閉じます。Netty:「キープアライブ」接続の場合、チャンネルを閉じる必要がありますか?

rep.setHeader("Connection", "keep-alive"); 
channel.write(rep).addListener(ChannelFutureListener.CLOSE); 

私はチャネルを閉鎖するはずです。

+0

謎がここにあるのが分かりません。チャンネルを閉じることが生き続けることを真剣に考えることはできません。 – EJP

答えて

7

HTTP 1.1サーバーを作成していると仮定すると、応答を送信した後に接続を開いたままにしておく必要があります。いずれにしても何らかの理由で閉じてしまう場合は、

Connection: close 

を回答に含める必要があります。

bootstrap.setOption("child.keepAlive", true); 

は、ソケットのキープアライブオプションをオンにし、HTTPとは何の関係もないことを

注意。むしろ、「本当の」トラフィックがない場合に壊れた接続を検出するために監視機構の一種です。

+1

ありがとう@フォーティー・ツー!私の意図は、接続を生かし続けることでした。これを確認するだけです:レスポンスを書き終えたら、この部分の '.addListener(ChannelFutureListener.CLOSE);'が必要ですか? – woodings

+0

ほとんどのオペレーティングシステムでは、デフォルトの 'SO_KEEPALIVE'タイムアウトは非常に長く(例えば、Linuxでは7200秒です)、それほど多くは期待しません。クライアントから一定の時間だけ要求が送信されなかった場合は、接続を閉じる必要があります。 – trustin

3

あなたはまた、コンテンツの長さを指定する必要があります。注:

response.headers().set(CONTENT_LENGTH, response.content().readableBytes()); 

にメッセージが終了したところ、受信機が把握できるようにします。そうでなければ、受信はメッセージを待つだけです。

そして、明らかに、 ".addListener(ChannelFutureListener.CLOSE);"と書くべきではありません。あなたの接続を開いたままにしたい場合。

関連する問題