A volte le chiamate di procedura remota richiedono più di un risultato per completare le richieste; per impostazione predefinita il protocollo WAMP 1.0 non consente risultati parziali in una chiamata, questa è una funzionalità esclusiva della libreria sgcWebSockets.
Il flusso è molto simile a un semplice RPC, ma qui ci sono 1 o più risultati parziali prima che CallResult venga chiamato per terminare il processo.
Fondamentalmente, un client richiede una procedura al server, e il server può inviare un risultato o un errore. Se invia un risultato, questo può essere il risultato finale oppure deve inviare ulteriori risultati in seguito. Se è il risultato finale, chiamerà il metodo CallResult e il processo sarà terminato. Se ci sono altri risultati da inviare, chiamerà il metodo CallProgressResult.
Esempio: il client richiede al server un metodo per ricevere ogni secondo l'orario del server e fermarsi dopo 20 messaggi.
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');