JavaScriptとjQueryを使用した単純なロングポーリングの例の記事を読みました。「ロングポーリング-効率的なサーバープッシュ技術」の段落では、次のように説明しています。
ロングポーリング手法は、ベストケースの従来のポーリングと永続的なリモートサーバー接続を組み合わせたものです。ロングポーリングという用語自体は、長時間保持されるHTTPリクエストの略です。
ロングポーリングを使用するIndyベースのHTTPサーバーを実装するにはどうすればよいですか?
JavaScriptとjQueryを使用した単純なロングポーリングの例の記事を読みました。「ロングポーリング-効率的なサーバープッシュ技術」の段落では、次のように説明しています。
ロングポーリング手法は、ベストケースの従来のポーリングと永続的なリモートサーバー接続を組み合わせたものです。ロングポーリングという用語自体は、長時間保持されるHTTPリクエストの略です。
ロングポーリングを使用するIndyベースのHTTPサーバーを実装するにはどうすればよいですか?
これは、Indy バージョン 10.5.9 および Delphi 2009 でテストされた自己完結型のサンプル プロジェクトです。
アプリケーションが実行されたら、 に移動しhttp://127.0.0.1:8080/
ます。次に、サーバーは HTML ドキュメントを提供します (OnCommandGet ハンドラーにハードコードされています)。
このドキュメントには、新しいデータのコンテナーとして使用される div 要素が含まれています。
<body>
<div>Server time is: <div class="time"></div></div>'
</body>
次に JavaScript コードは/getdata
、ループ内のリソースに要求を送信します (関数poll()
)。
<div>
サーバーは、現在のサーバー時刻を持つ新しい要素を含む HTML フラグメントで応答します。次に、JavaScript コードは古い<div>
要素を新しい要素に置き換えます。
サーバーの作業をシミュレートするために、メソッドはデータを返す前に 1 秒間待機します。
program IndyLongPollingDemo;
{$APPTYPE CONSOLE}
uses
IdHTTPServer, IdCustomHTTPServer, IdContext, IdSocketHandle, IdGlobal,
SysUtils, Classes;
type
TMyServer = class(TIdHTTPServer)
public
procedure InitComponent; override;
procedure DoCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); override;
end;
procedure Demo;
var
Server: TMyServer;
begin
Server := TMyServer.Create(nil);
try
try
Server.Active := True;
except
on E: Exception do
begin
WriteLn(E.ClassName + ' ' + E.Message);
end;
end;
WriteLn('Hit any key to terminate.');
ReadLn;
finally
Server.Free;
end;
end;
procedure TMyServer.InitComponent;
var
Binding: TIdSocketHandle;
begin
inherited;
Bindings.Clear;
Binding := Bindings.Add;
Binding.IP := '127.0.0.1';
Binding.Port := 8080;
KeepAlive := True;
end;
procedure TMyServer.DoCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
AResponseInfo.ContentType := 'text/html';
AResponseInfo.CharSet := 'UTF-8';
if ARequestInfo.Document = '/' then
begin
AResponseInfo.ContentText :=
'<html>' + #13#10
+ '<head>' + #13#10
+ '<title>Long Poll Example</title>' + #13#10
+ ' <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"> ' +
#13#10
+ ' </script> ' + #13#10
+ ' <script type="text/javascript" charset="utf-8"> ' + #13#10
+ ' $(document).ready(function(){ ' + #13#10
+ ' (function poll(){' + #13#10
+ ' $.ajax({ url: "getdata", success: function(data){' + #13#10
+ ' $("div.time").replaceWith(data);' + #13#10
+ ' }, dataType: "html", complete: poll, timeout: 30000 });' + #13#10
+ ' })();' + #13#10
+ ' });' + #13#10
+ ' </script>' + #13#10
+ '</head>' + #13#10
+ '<body> ' + #13#10
+ ' <div>Server time is: <div class="time"></div></div>' + #13#10
+ '</body>' + #13#10
+ '</html>' + #13#10;
end
else
begin
Sleep(1000);
AResponseInfo.ContentText := '<div class="time">'+DateTimeToStr(Now)+'</div>';
end;
end;
begin
Demo;
end.