Às vezes, as Chamadas de Procedimento Remoto exigem mais de um resultado para finalizar as requisições; por padrão, o protocolo WAMP 1.0 não permite resultados parciais em uma chamada, este é um recurso exclusivo da biblioteca sgcWebSockets.
O fluxo é muito semelhante a um RPC simples, mas aqui há 1 ou mais resultados parciais antes de CallResult ser chamado para finalizar o processo.
Basicamente, um cliente solicita um procedimento ao servidor, e o servidor pode enviar um resultado ou um erro. Se ele enviar um resultado, este pode ser o resultado final ou ele deve enviar mais resultados posteriormente. Se for o resultado final, chamará o método CallResult e o processo será finalizado. Se houver mais resultados a enviar, chamará o método CallProgressResult.
Exemplo: o cliente requisita ao servidor um método para receber a cada segundo o horário do servidor e parar após 20 mensagens.
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');