WAMP 1.0 是一种开放的 WebSocket 子协议,提供两种异步消息模式:RPC 和 PubSub。
从 sgcWebSockets 4.3.8 起,支持一种未包含在 WAMP 1.0 规范中的新方法,但对用户非常有用。WAMP 支持 RPC 调用,但服务器响应只能是成功或失败。有时 RPC 需要返回多个结果(流式新闻、报价、显示进度等),而规范不允许这样做(WAMP 2.0 允许,但复杂得多)。
因此,从 sgcWebSockets 4.3.8 起,支持多结果 RPC。
基本工作方式与之前的 RPC 相同,但客户端新增了 OnCallProgressResult 事件,当服务器发送部分结果且仍有更多结果待接收时触发。同时,服务器新增了 CallProgressResult 方法,用于向客户端发送部分结果。
客户端可使用新方法 CancelCall 并传入 CallId 参数来取消活跃的 RPC 调用。
服务器示例
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;
客户端示例
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');
