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