WAMP | RPC 渐进结果

有时,远程过程调用需要多个结果才能完成请求,默认情况下 WAMP 1.0 协议不允许在调用中使用部分结果,这是 sgcWebSockets 库独有的功能。

该流程与简单的 RPC 非常相似,但在 CallResult 被调用以完成流程之前,会有 1 个或多个部分结果先行返回。

基本上,客户端向服务器请求一个过程,服务器可以发送结果或错误。如果发送结果,可以是最终结果,也可以是还需发送更多结果。如果是最终结果,将调用方法 CallResult,进程随之结束。如果还有更多结果需要发送,将调用方法 CallProgressResult

 

示例:客户端请求服务器提供一个每秒返回服务器时间的方法,并在 20 条消息后停止。

 

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;

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