WAMP 1.0 is een open WebSocket-subprotocol dat twee asynchrone messaging-patronen biedt: RPC en PubSub.
Vanaf sgcWebSockets 4.3.8 wordt een nieuwe methode ondersteund die niet in de WAMP 1.0-specificatie is opgenomen, maar deze kan zeer nuttig zijn voor onze gebruikers. WAMP staat RPC-aanroepen toe, maar het server-antwoord kan alleen succesvol zijn of niet. Soms vereist een RPC meer dan één resultaat (streaming-nieuws, koersen, voortgang tonen...) en hier staat de specificatie dat niet toe (WAMP 2.0 staat het wel toe, maar is veel complexer).
Dus vanaf sgcWebSockets 4.3.8 is RPC met meerdere resultaten beschikbaar.
Het werkt in principe hetzelfde als de eerdere RPC, maar er is een nieuw event aan de clientzijde genaamd OnCallProgressResult dat wordt geactiveerd als de server een partieel resultaat verstuurt en er nog meer resultaten te ontvangen zijn. Tegelijkertijd heeft de server een nieuwe methode genaamd CallProgressResult, die wordt aangeroepen om een partieel resultaat naar de client te sturen.
De client kan een actieve RPC-aanroep annuleren met de nieuwe methode CancelCall en de CallId als parameter mee te geven.
Server-voorbeeld
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-voorbeeld
procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
// This is the last result
ShowMessage(Result);
end;
procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string);
begin
// Partial result, there are still more results to receive
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('GetProgressiveTime');
