7

JavaScriptとjQueryを使用した単純なロングポーリングの例の記事を読みました。「ロングポーリング-効率的なサーバープッシュ技術」の段落では、次のように説明しています。

ロングポーリング手法は、ベストケースの従来のポーリングと永続的なリモートサーバー接続を組み合わせたものです。ロングポーリングという用語自体は、長時間保持されるHTTPリクエストの略です。

ロングポーリングを使用するIndyベースのHTTPサーバーを実装するにはどうすればよいですか?

4

1 に答える 1

6

これは、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.
于 2013-01-12T10:38:10.123 に答える