服务器端要推送数据给客户端,有多种不同的方式,SSE 是其中一种实现简单易用的方式,但 Delphi 并没有内置的支持。实际上要实现这一点,并不是很复杂,我们可以直接基于 THttpClient 来实现,这里我们给出一个简单的教程。
1. 定义一个支持 SSE 的数据流对象,方便实时接收服务器端推送的数据。因为是示例,我们简化下实现:
type
TSSEStream=class(TBytesStream)
public
function Write(const Buffer; Count: Longint): Longint; override;
end;
2. 使用 THttpClient 发送请求:
procedure TfrmSSE.Button1Click(Sender: TObject);
var
AHttpClient:THttpClient;
ASource,AResp:TStream;
begin
AHttpClient:=THttpClient.Create;
ASource:=TStringStream.Create('{}');
AResp:=TSSEStream.Create;
Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz',Now)+':开始请求');
var Async:=AHttpCLient.BeginPost('http://100.64.0.12/test',ASource,AResp);
while not Async.IsCompleted do
Application.ProcessMessages;
Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz',Now)+':结束请求');
FreeAndNil(ASource);
FreeAndNil(AResp);
FreeAndNil(AHttpClient);
end;
3. 实现 TSSEStream.Write 方法,我们来处理收到的数据库:
{ TSSEStream }
function TSSEStream.Write(const Buffer; Count: Longint): Longint;
var
APos:Int64;
begin
APos:=Position;
inherited;
var S:=TEncoding.ANSI.GetString(Bytes,APos,Count);
var AOffset:Integer:=5;
var AJson:=TJsonObject.ParseJSONFragment(S,AOffset,[]);
TThread.ForceQueue(nil,
procedure
begin
TfrmSSE(Application.MainForm).Memo1.Lines.Add(FormatDateTime('hh:nn:ss.zzz',Now)+':'+AJson.ToJSON([]));
end
);
end;
实际运行效果:
