2

私は Apache Mina を使用して最初の TCP/ソケット ベースのアプリケーションを開発しています。ここでミナについて質問したいだけです。

サーバーは 5 秒のアイドル時間を課すとソケット接続が終了するため、定期的にハートビート (エコー メッセージ / キープアライブ) を送信して接続が有効であることを確認する必要があります。一種のキープアライブ メカニズム。

5 秒ごとにエコー/ハートビート メッセージを盲目的に送信する方法が 1 つあります。私は、ビジネス メッセージを送信していて、アイドル時間、つまり 5 秒に達しない場合、スマート/インテリジェントな方法「アイドル モニター」が必要であると考えています。ハートビート メッセージを発行するべきではありません。接続全体がアイドル状態の場合、ハートビート メッセージが送信されるため、帯域幅を節約し、ソケットでの読み取りと書き込みを高速に行うことができます。

4

3 に答える 3

4

これは、 Keep Alive Filter(すでにminaに存在)を使用して実現できます。

または、クライアントのセッションアイドルタイムアウトをサーバーのアイドルタイムアウトよりも少し小さく設定することで、エコー/ハートビートをよりスマートに送信する方法を実現できます。例えば:

サーバー側の場合

NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);

クライアント側の場合は

NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

これで、たとえば3秒間通信がない場合、sessionIdleがクライアント側でトリガーされ(タイムアウトが5秒あるため、サーバー側ではトリガーされません)、エコーを送信できます。これにより、セッションが存続します。エコーは、セッションがアイドル状態の場合にのみ送信されます。

注: セッションがアイドル状態のとき、サーバー側でセッションが閉じられていると想定しています。それ以外の場合は、セッションアイドルタイムアウトの値を切り替える必要があります(たとえば、サーバーの場合は3秒、クライアントの場合は5秒)。サーバーからエコーが送信されます。

于 2012-04-05T10:19:10.367 に答える
1

あなたの質問を完全に理解できるかどうかはわかりませんが、IoHandlerAdapterのオーバーライドされたsessionIdleメソッドでハートビートを送信できます。サーバー側のMinaがIdleを呼び出すからといって、必ずしもセッションを閉じる必要はありません。このタイプのハートビート通信なしでサーバーとクライアント間のアクティブな接続を維持するためのよりインテリジェントな方法に関しては、私はこれを聞いたことがありません。

これは、MicrosoftがActiveSyncでハートビートを処理する方法についての興味深い読み物です。クライアント/サーバーアプリケーションでminaを使用するときに、この方法を個人的に使用しました。これがお役に立てば幸いです。

于 2012-04-03T17:19:04.657 に答える