WAMP | Résultats de progression RPC

Parfois, les appels de procédure distante nécessitent plus d'un résultat pour terminer les requêtes. Par défaut, le protocole WAMP 1.0 ne permet pas les résultats partiels dans un appel ; il s'agit d'une fonctionnalité exclusivement disponible dans la bibliothèque sgcWebSockets.

Le flux est très similaire à un RPC simple, mais ici il y a 1 ou plusieurs résultats partiels avant que CallResult soit appelé pour terminer le processus.

En gros, un client demande une procédure au serveur, et le serveur peut envoyer un résultat ou une erreur. S'il envoie un résultat, celui-ci peut être le résultat final ou il doit envoyer d'autres résultats plus tard. Si c'est le résultat final, il appellera la méthode CallResult et le processus sera terminé. S'il y a d'autres résultats à envoyer, il appellera la méthode CallProgressResult.

 

Exemple : le client demande au serveur une méthode pour recevoir l'heure du serveur chaque seconde et s'arrêter après 20 messages.

 

Serveur WAMP

 


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;

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