WAMP | RPC Progress Results

Manchmal erfordern Remote Procedure Calls mehr als ein Ergebnis, um Anfragen abzuschließen. Standardmäßig erlaubt das WAMP-1.0-Protokoll keine Teilergebnisse in einem Aufruf; dies ist eine Funktion, die nur für die sgcWebSockets-Bibliothek verfügbar ist.

Der Ablauf ist einem einfachen RPC sehr ähnlich, aber hier gibt es 1 oder mehr Teilergebnisse, bevor CallResult aufgerufen wird, um den Prozess abzuschließen.

Im Grunde fordert ein Client eine Prozedur vom Server an, und der Server kann ein Ergebnis oder einen Fehler senden. Wenn er ein Ergebnis sendet, kann dies das endgültige Ergebnis sein, oder er muss später weitere Ergebnisse senden. Wenn es das endgültige Ergebnis ist, wird die Methode CallResult aufgerufen, und der Prozess wird beendet. Wenn weitere Ergebnisse zu senden sind, wird die Methode CallProgressResult aufgerufen.

 

Beispiel: Der Client fordert vom Server eine Methode an, um jede Sekunde die Serverzeit zu empfangen und nach 20 Nachrichten zu stoppen.

 

WAMP Server

 


procedure OnServerCall(Connection: TsgcWSConnection; const CallId, ProcUri, Arguments: string);
var
  vNum: Integer;
begin
  if ProcUri = 'GetProgressiveTime' then
  begin
    vNum := StrToInt(Arguments);
    for i := 1 to vNum do
	begin
	  if i = 20 then
        oServerWAMP.CallResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now))
	  else
	    oServerWAMP.CallProgressiveResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now));
	end
  end
  else
    oServer.WAMP.CallError(CallId, 'Unknown method');
end;
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
oServerWAMP := TsgcWSPServer_WAMP.Create(nil);
oServerWAMP.OnCall := OnServerCallEvent;
oServerWAMP.Server := oServer;
oServer.Active := True;

WAMP Client

 


procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
  ShowMessage(Result);
end;
procedure OnCallErrorClient(Connection: TsgcWSConnection; const Error: string);
begin
  ShowMessage(Error);
end;
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 80;
oClientWAMP := TsgcWSPClient_WAMP.Create(nil);
oClientWAMP.OnCallResult := OnCallResultClient;
oClientWAMP.OnCallProgressResult := OnCallProgressResultClient;
oClientWAMP.OnCallError := OnCallErrorClient;
oClientWAMP.Client := oClient;
oClient.Active := True;
// After client has connected, request GetTime from server
oClientWAMP.Call('GetProgressTime');