0

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 
}

しかし、私はより良い方法が欲しいです。

4

0 に答える 0