netty tcp クライアント サービスを開発しています。
私の質問
サービスが channel.close() を呼び出した後、サーバーも channel.close() を呼び出したかどうかを知る方法はありますか? つまり、4ウェイクローズハンドシェイクが完了したかどうかを知る方法はありますか?
バックグラウンド
私のサービスは、以下のようないくつかの制約がある1つのターゲットデバイス(サーバー側)と通信します
- 1 つのクライアント接続のみが許可されます。
- 既に接続がある場合は、すぐに新しい接続を閉じます。
- 接続が半分閉じられていても、以前の接続はアクティブな接続と見なされます。
私のコードはおおよそ次のように実行されます。
while(...) {
channel = bootstrap.connect(...).sync().channel(); // 1 line
channel.writeAndFlush(command); // 2 line
answer = waitForAnswer(); // 3 line
channel.close().sync(); // 4 line
}
2 番目のループで新しい接続が確立されると、最初のループで使用された接続がまだハーフクローズ状態であるため、サーバーは新しい接続を閉じます。
以下のパケット キャプチャを見ると、(1) Half Closed 状態で、(2) 新しい接続が確立され、(3) サーバーが悪い接続状態を通知し、新しい接続を強制的に閉じていることがわかります。
したがって、以下に示すようにスリープを追加することで、4 ウェイ ハンドシェイクが終了するまで待つことができます。
while(...) {
channel = bootstrap.connect(...).sync().channel(); // 1 line
channel.writeAndFlush(command); // 2 line
answer = waitForAnswer(); // 3 line
channel.close().sync(); // 4 line
Thread.sleep(100); // 5 line
}
しかし、私はより良い方法が欲しいです。