2013-01-12 17 views
5

Przeczytałem artykuł Simple Long Polling Example with JavaScript and jQuery. Akapit "Długi Polling - Sprawny Server-Push Technique" wyjaśnia, że ​​Jak mogę dynamicznie aktualizować strony HTML za pomocą serwera HTTP Indy przy użyciu jQuery i "Long Polling"?

Long technika Polling łączy w najlepszym przypadku tradycyjnego odpytywania z trwałych połączeń zdalnych serwerów. Sam termin "Długie pobieranie" jest skrótem od długiego żądania HTTP.

Jak mogę wdrożyć oparty na Indy serwer HTTP, który korzysta z funkcji Long Polling?

Odpowiedz

4

Oto przykład samowystarczalny projekt, przetestowane z Indy wersji 10.5.9 i Delphi 2009.

Po uruchomieniu aplikacji, przejdź do http://127.0.0.1:8080/. Serwer następnie wyświetli dokument HTML (zakodowany na stałe w procedurze obsługi OnCommandGet).

Niniejszy dokument zawiera elementu div, który będzie używany jako kontener dla nowych danych:

<body> 
    <div>Server time is: <div class="time"></div></div>' 
</body> 

Kod JavaScript następnie wysyłać żądania do zasobu /getdata w pętli (funkcja poll()).

Serwer odpowiada fragmentem HTML, który zawiera nowy element <div> z bieżącym czasem serwera. Kod JavaScript następnie zastępuje stary element <div> nowym.

Aby zasymulować działanie serwera, metoda czeka na jedną sekundę przed zwróceniem danych.

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. 
+1

Zamiast 'TMyServer' przypisać do obsługi własnej dziedzicznej' OnCommandGet' razie mają to zastąpić wirtualnego 'TIdCustomHTTPServer.DoCommandGet()' metody zamiast. Ponadto ustaw 'Response.CharSet' po ustawieniu' Response.ContentType' zamiast wcześniej. Ustawień właściwości 'ContentType' może (i w przyszłości prawdopodobnie będzie) zmienić' CharSet' w oparciu o przypisaną wartość, tracąc w ten sposób ręczne przypisywanie. –

+0

@RemyLebeau dziękuję za wskazówki, zaktualizowałem kod – mjn