Datasnapのコールバックブロードキャスト

7857 ワード

感覚的なdatasnap千孔百瘡は、xe 10まで何千人ものユーザーに衝撃を与える能力を備えている.安心してプロジェクトの実戦に使うべきだ.補習研究10.1 datasnap開発マニュアル.
使用する方法:
(1)TDBXCallbackメカニズム;    (2)TDServer.BroadcastMessageメソッド    (3)TDSClientCallbackChanneManager1.RegisterCallbackメソッド
一、コールバック方式1、サーバ側コールバック全て(同一チャネル)のクライアント2、クライアントコールバック(同一チャネル)の他のクライアント3、クライアントは複数のチャネルを登録することができる
server:
  • は、チャネルを定義する.通路道路を決めて、この通路を走っているcarを検索します.各顧客ID
  • を得る.
    const DEMOChannel='DemoChannel';

            2.サーバからクライアントへのコールバック:
    procedure TSMainFrm.mmMessageChange(Sender: TObject);
    var vMessage:TJSONString;
    begin
      vMessage := TJSONString.Create(mmMessage.Lines.Text);
      ServerContainer1.DSServer1.BroadcastMessage(DEMOChannel, vMessage);
    end;

           3.クライアント登録チャネルとコールバックチャネルの検索によりチャネル内のクライアントIDが得られる
    procedure TForm1.btnListAllClientIdsClick(Sender: TObject);
    var
      aIdList : TList<String>;
      sId : String;
    begin
      aIdList := ServerContainer5.DSServer1.GetAllChannelClientId(DEMOChannel);{ all ID}
      try
        for sId in aIdList do
          lbAllClientIds.Items.Add(sId);
      finally
        aIdList.Free;
      end;
    end;
    procedure TForm1.btnListAllCallbackIdsClick(Sender: TObject);
    var
      aIdList : TList<String>;
      sId : String;
    begin
      aIdList := ServerContainer5.DSServer1.GetAllChannelCallbackId(DEMOChannel);{ all ID
      try
        for sId in aIdList do
          lbAllCallbackIds.Items.Add(sId);
      finally
        aIdList.Free;
      end;
    end;

    Client:
    1.クライアント登録クライアントは、TDSClientCallbackChannelManager 1によってコールバックチャネルを登録する.RegisterCallbackメソッド実装;実行文は、TDSClientCallbackChanneManager 1.RegisterCallback(Combobox1.Text, TDemoCallback.Create);次に、クライアントがサーバ側にコールバックチャネルを登録する場合、上記のコードには、(1)コールバックチャネルID、TDSClientCallbackChanneManagerの4つの要素が含まれている.ChannelName属性値;関連文字は、サーバに登録されているコールバックチャネル文字と一致する必要があります.(2)クライアントID,TDSClientCallbackChanneManager.ManagerID属性値;各クライアントは、一意の識別コードを明確にする必要があります.(3)TDSClientCallbackChanneManager 1.RegisterCallbackメソッドの1番目のパラメータ;(4)TDSClientCallbackChanneManager 1.RegisterCallbackの2番目のパラメータが持ち込まれ、TDemoCallback継承のメソッドが作成されます.このオブジェクトはExecuteメソッドを再ロードし、コールバック識別に使用されます.
    2、クライアントとクライアント間のコールバックは、TDSAdminClientカテゴリのNotifyCallbackメソッドXEを用いてDSProxyユニットにおいて、TDSAdminClientカテゴリを追加し、コールバック機能を強化する.ここで、TDSAdminClientカテゴリのNotifyCallbackメソッドは、クライアント間のコールバックに用いられ、コールバックチャネル内の特定のクライアント(クライアントID)またはコールバック識別(コールバックID)を指定したクライアントをコールバックすることができる.次のように宣言します.
    function NotifyCallback(ChannelName:string; ClientID:string;CallbackID:string;Msg:TJSONValue; out Respones :TJSONValue):Boolean;
    NotifyCallbackメソッドのパラメータの意味:(1)ChannelName、コールバックチャネル名;(2)ClientID、クライアント識別;(3)CallbackID,コールバック識別;(4)Msg,伝達情報;(5)Respones,被呼クライアントからの返信情報
    procedure TfmMainForm.btnBroadcastToClientClick(Sender: TObject);
    var
      LClient: TDSAdminClient;
      LMessage: TJSONString;
      LResponse: TJSONValue;
      LConnection: TDBXConnection;
    begin
      LConnection := scnnCallbackServer.DBXConnection;
      LClient := TDSAdminClient.Create(LConnection, False);
      try
        LMessage := TJSONString.Create(Format(' :%s, :%s, :%s, :%s',
          [DemoChannelManager.ChannelName, cbClientIds.Text, cbCallbackIds.Text, mmChannelCallbacks.Text]));
        try
          LClient.NotifyCallback(DemoChannelManager.ChannelName, cbClientIds.Text, cbCallbackIds.Text, LMessage, LResponse);
          try
            if LResponse <> nil then
              edtResponse.Text := Format(' :%s', [LResponse.ToString])
            else
              edtResponse.Text := Format(' :%s', ['nil']);
          finally
            LResponse.Free;
          end;
        finally
          LMessage.Free;
        end;
      finally
        LClient.Free;
      end;
    end;