ESFramework開発マニュアル(08)-再登録モードとオフライン再接続


ESPlusが提供するRapidエンジンは、クライアントとサーバがTCP接続を正常に確立した後、送信された最初のメッセージがログインメッセージであり、ログインメッセージのアカウントパスワードがサービス側の検証を経た後、サービス側はメッセージからUserIDの値を取り出し、対応するTCP接続にバインドするというルールを採用している.これにより、サービス側は、各TCP接続に対応するユーザUserIDを知ることができ、サービス側がクライアントにメッセージを送信するように要求すると、どのTCP接続によって送信されたかを知ることができる.同じサービス側にとって、TCP接続はUserIDに1つ1つ対応し、1つのTCP接続は1つのUserIDにしか対応できない.同様に、1つのUserIDには最大1つのTCP接続が存在する.
 
1.二種類の再登録モード
现実の中で、よくこのような情况が现れます:例えば私达が使うQQ、私达が1つのアカウントでA地に登录した时、まだラインオフしていませんが、私はまたこのアカウントでB地に登录して、どんな情况が発生しますか?QQは、古い接続の代わりに新しい接続を採用する戦略を採用している.すなわち、A地のクライアントに「同名のユーザーが他の場所にログインした」と通知するなど、後続の通信については、サーバはB地のクライアントと行う.
QQで採用されているこのモードはESFrameworkではReplaceOldモードと呼ばれている.しかし、一部のアプリケーションでは、新しいBの接続を無視してAの接続を保持する必要がある場合があります.この場合、IgnoreNewという別のモードを採用することができます.ESFrameworkは、RelogonMode列挙によってこの2つのパターンを定義します.
    public
 
enum
 
RelogonMode        
    {
       ///
 

        
///
新しい接続を無視します.        
///
 

        IgnoreNew 
=
 
0
,        
///
 

        
///
古い接続の代わりに新しい接続を使用します.        
///
 

        ReplaceOld    }   
ユーザーマネージャIUserManagerのRelogonModeプロパティを設定して、ESFrameworkがどの再ログインモードを使用するかを制御できます.例:
  rapidServerEngine.UserManager.RelogonMode = RelogonMode.ReplaceOld;

RapidServer Engineのデフォルトの再登録モードはReplaceOldです.
2.ESFrameworkの再登録モードに対する反応
IgnoreNewモード
IgnoreNewモードを使用している場合、ESFrameworkは、別の新しい接続から同じ名前のユーザーからメッセージを受信すると、IUserManagerのNewConnectionIgnoredイベントをトリガーして、サービス側アプリケーションに通知します.
  ///<summary>
/// RelogonMode IgnoreNew, ID 。
/// , , 。 , 。
///</summary>
event CbGeneric<string, UserAddress> NewConnectionIgnored;

イベントの最初のパラメータstringは同名ユーザのIDであり、2番目のパラメータは新しく接続されたクライアントアドレスである.ESFramework/ESPlusがこのイベントをトリガーする前後に行うアクションは、次のとおりです.
  • は、新しい接続に対応するクライアントに、同じ名前のユーザーがオンラインになっていることを通知し、新しい接続が閉じられます.対応するクライアントRapidエンジンを新たに接続するIntelizeメソッドはLogonResultに戻る.HadLoggedOn.
  • 新しい接続を閉じます.

  • Rapidエンジンを使用する場合、上記の処理を繰り返す必要はありません.もちろん、新しい接続が無視されたという通知をサービス側で取得するために、イベントを予約することもできます.
    ReplaceOldモード
    ReplaceOldモードを使用している場合、ESFrameworkは、別の新しい接続から同じ名前のユーザーからメッセージを受信すると、IUserManagerのSomeOneBeingPushedOutイベントをトリガーして、サービス側アプリケーションに通知します.
      ///<summary>
    /// RelogonMode ReplaceOld, ID 。
    /// , , 。 , 。
    ///</summary>
    event CbGeneric<UserData> SomeOneBeingPushedOut;

     
    すなわち,同名の古い接続に対応するクライアントが絞り出され,イベントのパラメータには古い接続に対応する関連情報が含まれている.
    同様に、ESFramework/ESPlusがこのイベントをトリガーする前後に行う動作は、次のとおりです.
  • は、古い接続に対応するクライアントに、同名のユーザが接続され、古い接続が閉じられることを通知する.クライアントはIBasicOutterのBeingPushedOutイベントをトリガーします.
  • 古い接続を閉じます.

  • Rapidエンジンを使用する場合も、上記の処理を繰り返す必要はありません.このイベントを予約して、古いユーザーが押し出された通知をサービス側で取得することもできます.
    3.オフライン再接続
    Rapidクライアントエンジンは、サービス側のTCP接続が切断されると、再接続が成功するまでサービス側を自動的に再接続しようとします. 
    しかし、2つの場合のオフラインは、自動的に再接続されません.
  • クライアントはオフラインにされます.この場合、自動的に再接続されると、新しく登録された同名のクライアントがオフラインになり、新しいクライアントが自動的に再接続される......、「押し出し線-再接続-押し出し線-......」に陥るの死のサイクル.
  • クライアントハートビートタイムアウト.心拍タイムアウトは通常、現在のネットワークの遅延が非常に大きいことを示しており、この場合、自動再接続に成功しても、再び心拍タイムアウトがオフラインになる可能性が高い.したがって,この場合の自動再接続の意味も大きくない.

  • どちらの場合もオフラインでアプリケーションが再びサービス・エンドに接続する場合は、Rapidクライアント・エンジンの初期化方法を手動で呼び出すことができます.
    もう一つ注意しなければならないことがあります.クライアントエンジンは、サーバに初めて接続してログインに成功すると、現在ログインしているユーザーのアカウントとパスワードが記録され、その後、オフラインで再接続されると、再び自動的に記録されたアカウントパスワードでログインします.したがって,中間過程でユーザのパスワードが変更されると,再接続ログインに失敗する.IrapidPassiveEngineの再接続完了イベントRelogonCompletedのパラメータLogonResponseの値はLogonResultになります.Failed.RelogonCompletedイベントを予約して、再接続失敗の通知を取得できます.
    サービス側にとって、「再接続」とは無関係であり、クライアント再接続上のサービス側とクライアント初回接続上のサービス側は同じ処理モードを採用している.クライアントがオフラインになると,サービス側はそのクライアントに対応するセッションおよび関連する状態データを消去する.
    サービス側が再接続モデルをサポートする必要があるアプリケーションもあります.我々のサービス側は,ユーザがオフラインになったという通知を受信した場合,そのユーザに関する業務状態データを消去せずに,それを使用不可に変更し,クライアントが再接続されてから,そのユーザに対応する業務データをアクティブにすればよい.     
     
    ESFramework開発マニュアルの詳細を読みます.
    ----------------------------------------------------------------------------------------------------------------------------------------------- 
      無料バージョンのESFrameworkとdemoソースをダウンロード  
     
    ESFrameworkの問題については、お問い合わせください.
    電話番号:027-87638960
    Q Q:372841921
    メール:[email protected]