809 Stimmen

Wie führe ich ein einfaches "Long Polling" durch?

Ich kann viele Informationen darüber finden, wie Long Polling funktioniert (zum Beispiel, este y este ), aber keine einfach Beispiele, wie dies in Code umgesetzt werden kann.

Alles, was ich finden kann, ist cometd die auf dem Dojo JS-Framework und einem ziemlich komplexen Serversystem basiert.

Wie würde ich Apache verwenden, um die Anfragen zu bedienen, und wie würde ich ein einfaches Skript (z. B. in PHP) schreiben, das den Server nach neuen Nachrichten "abfragt"?

Das Beispiel muss nicht skalierbar, sicher oder vollständig sein, es muss nur funktionieren!

2voto

makerofthings7 Punkte 57238

Für eine ASP.NET MVC-Implementierung, schauen Sie sich SignalR an die auf NuGet verfügbar ist beachten Sie, dass die NuGet ist oft veraltet von der Git-Quelle die sehr häufig übertragen wird.

Lesen Sie mehr über SignalR auf einer Blog von Scott Hanselman

0voto

sp3c1 Punkte 1102

Einfachstes NodeJS

const http = require('http');

const server = http.createServer((req, res) => {
  SomeVeryLongAction(res);
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

server.listen(8000);

// the long running task - simplified to setTimeout here
// but can be async, wait from websocket service - whatever really
function SomeVeryLongAction(response) {
  setTimeout(response.end, 10000);
}

Ein produktionsbezogenes Szenario in Express würde z. B. Folgendes ergeben response in der Middleware. Tun Sie, was Sie tun müssen, können alle der langen abgefragten Methoden zu Map oder etwas (das sichtbar für andere Flows ist), und rufen Sie <Response> response.end() wann immer Sie bereit sind. Es gibt nichts Besonderes an langen abgefragten Verbindungen. Der Rest ist einfach so, wie Sie Ihre Anwendung normalerweise strukturieren.

Wenn Sie nicht wissen, was ich mit "scoping out" meine, sollte Ihnen dies eine Idee geben

const http = require('http');
var responsesArray = [];

const server = http.createServer((req, res) => {
  // not dealing with connection
  // put it on stack (array in this case)
  responsesArray.push(res);
  // end this is where normal api flow ends
});

server.on('clientError', (err, socket) => {
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});

// and eventually when we are ready to resolve
// that if is there just to ensure you actually 
// called endpoint before the timeout kicks in
function SomeVeryLongAction() {
  if ( responsesArray.length ) {
    let localResponse = responsesArray.shift();
    localResponse.end();
  }
}

// simulate some action out of endpoint flow
setTimeout(SomeVeryLongAction, 10000);
server.listen(8000);

Wie Sie sehen, könnten Sie wirklich auf alle Verbindungen reagieren, eine, tun, was Sie wollen. Es gibt id für jede Anfrage, so dass Sie in der Lage sein sollten, die Karte zu verwenden und den Zugriff auf spezifische aus api Aufruf.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X