WAMP 1.0 est un sous-protocole WebSocket ouvert qui propose deux modèles de messagerie asynchrone : RPC et PubSub.
À partir de sgcWebSockets 4.3.8, une nouvelle méthode est prise en charge ; elle n'est pas incluse dans la spécification WAMP 1.0, mais peut être très utile pour nos utilisateurs. WAMP autorise les appels RPC, mais la réponse du serveur ne peut être que réussie ou échouée. Parfois, un RPC nécessite plus d'un résultat (streaming de news, cotations, affichage de progression...) et la spécification ne le permet pas (WAMP 2.0 le permet, mais c'est beaucoup plus complexe).
Donc, à partir de sgcWebSockets 4.3.8, le RPC avec plusieurs résultats est disponible.
Le fonctionnement est identique à un RPC classique, mais il existe désormais un nouvel événement côté client appelé OnCallProgressResult qui est déclenché lorsque le serveur envoie un résultat partiel et qu'il reste encore d'autres résultats à recevoir. Côté serveur, une nouvelle méthode appelée CallProgressResult est appelée pour envoyer un résultat partiel au client.
Le client peut annuler un appel RPC actif via la nouvelle méthode CancelCall en passant CallId en paramètre.
Exemple côté serveur
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;
Exemple côté client
procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
// C'est le dernier résultat
ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
// Résultat partiel, il reste encore des résultats à recevoir
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;
// Après la connexion du client, demande GetTime au serveur
oClientWAMP.Call('GetProgressiveTime');
