En ocasiones, las llamadas a procedimientos remotos requieren más de un resultado para completar las solicitudes; por defecto, el protocolo WAMP 1.0 no permite resultados parciales en una llamada, esto es una característica exclusiva de la biblioteca sgcWebSockets.
El flujo es muy similar a un RPC simple, pero aquí hay 1 o más resultados parciales antes de que se llame a CallResult para finalizar el proceso.
Básicamente, un cliente solicita un procedimiento al servidor, y el servidor puede enviar un resultado o un error. Si envía un resultado, este puede ser el resultado final o debe enviar más resultados posteriormente. Si es el resultado final, llamará al método CallResult y el proceso habrá concluido. Si hay más resultados por enviar, llamará al método CallProgressResult.
Ejemplo: el cliente solicita al servidor un método para recibir cada segundo la hora del servidor y detenerse después de 20 mensajes.
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;
Cliente WAMP
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');