WAMP 1.0 es un subprotocolo WebSocket abierto que proporciona dos patrones de mensajería asíncrona: RPC y PubSub.
Desde sgcWebSockets 4.3.8 se soporta un nuevo método, no incluido en la especificación WAMP 1.0, pero que puede ser muy útil para nuestros usuarios. WAMP permite llamadas RPC, pero la respuesta del servidor solo puede ser exitosa o no. A veces, un RPC requiere más de un resultado (streaming de noticias, cotizaciones, mostrar progreso...) y aquí la especificación no permite hacerlo (WAMP 2.0 sí lo permite, pero es mucho más complejo).
Por tanto, desde sgcWebSockets 4.3.8 está disponible el RPC con múltiples resultados.
Básicamente funciona igual que el RPC anterior, pero hay un nuevo evento en el lado del cliente llamado OnCallProgressResult que se dispara si el servidor envía un resultado parcial y aún quedan más resultados por recibir. Al mismo tiempo, el servidor tiene un nuevo método llamado CallProgressResult, que se llama para enviar un resultado parcial al cliente.
El cliente puede cancelar una llamada RPC activa usando el nuevo método CancelCall y pasando CallId como parámetro.
Ejemplo de servidor
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;
Ejemplo de cliente
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');
