3

Nettyで実装されたHTTPサーバーがあります。ブラウザにメッセージをプッシュするには、長い接続が必要です。ほとんどの場合、サーバーは接続を閉じようとしません。

TCPセッションでは、一方の側が接続を閉じたい場合、もう一方の側にFINパケットを送信します。サーバーがクライアントからFINを受信しない場合、1)ユーザーにハードネットワーク障害がある場合、または2)誰かがサーバーを攻撃しようとした場合、Nettyサーバーがタイムアウト(またはその他ある種の)一定時間後の例外?

trueの場合、タイマーがタイムアウトをトリガーしたときにチャネルを閉じるRead/WriteTimeoutHandlerをチャネルパイプラインに追加する必要はありません。どちらの方法でもチャネルを閉じる必要があります。そうしないと、リソースがリークします。

4

2 に答える 2

2

Netty サーバーが一定時間後にタイムアウト (または他の種類の) 例外を受け取ることは保証されていますか?

いいえSocketTimeoutException。ソケットがブロッキング モードで、読み取りタイムアウトが設定されている場合にスローされる があります。TCP キープアライブが有効になっていて、接続が実際に 2 時間切断されたままになっている場合に発生する可能性がありますIOException: connection reset。これには、接続が動作している状態でピアが単にサイレントである場合は含まれません。そうでなければいいえ。

于 2012-11-29T09:43:31.713 に答える
0

TCP ステート ダイアグラムによると、両側の接続を閉じるには、両側に FIN を送信する必要があります。ただし、シナリオのようにFINが失われた場合、TCPは適切なタイムアウト値で克服します。

于 2012-11-30T06:59:37.140 に答える