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');