2012-03-24 17 views
4

Ich benutze das Mojolicious :: Lite-Modul, um einen Websockets-Server zu betreiben, um das Protokoll zu handhaben. Dies ist der Testcode ich zur Zeit für Client bin mit:Websockets und Spülen mit Mojolicious?

socket.onopen = function(){$.each(proxies, function(){socket.send(this);});} 
socket.onmessage = function(response){alert(response);} 

Und der Server

websocket '/' => sub { 
    my $self = shift; 
    $self->on(message => sub { 
     my ($self, $message) = @_; 
     my @info = split /-/,$message; 

     $mech_proxy = WWW::Mechanize->new(timeout=>$info[1], autocheck=>0); 
     $self->send(test_proxy($info[0]) => sub{sleep(int(rand(10)))}); 
    }); 
}; 
app->start; 

Jedenfalls dachte ich, dass dies deutlich die Notwendigkeit vermeiden würde die Ausgabe zu spülen, wie es ursprünglich war ich eigentlich tun nur eine Clientseite senden und dann die Rückmeldung in einer Schleife auf der Serverseite senden; Das hat nicht funktioniert, weil ich die Ausgabe nicht löschen konnte und auf den Abschluss der Schleife warten musste. Es hat jedoch nicht geholfen, es zu ändern, da ich immer noch warten muss, bis der letzte serverseitige Versand erfolgt ist und erst dann werden die Daten an den Client gesendet. Haben Sie eine Idee, wie ich Live-Updates über die Verarbeitung erhalten kann, d. H. Die Serverantwort ausgeben, während sie gesendet wird?

EDIT: Ich bekomme gemischte Ergebnisse mit setTimout(socket.send(this),1000). Was ich gedacht habe, ist, dass wahrscheinlich, um die Daten zu löschen, neue Daten erst gesendet werden müssen, nachdem die vorherigen Daten verarbeitet und vollständig auf der Serverseite geschrieben wurden. Wenn dies tatsächlich richtig ist, sollte es möglich sein, die Client-Seite zu schreiben, so dass sie nur neue Daten sendet, nachdem sie Ergebnisse von den vorherigen gesendeten Daten erhalten hat; Dies wird den Effekt erreichen, die gewünschten Live-Updates zu erhalten.

Prost

+0

Entschuldigung für die harten Kommentar und Entschuldigung für das Abhören Sie wieder, aber nur ein paar Erklärungen fühle ich mich verpflichtet. Warum globale Variablen aus POST erstellen? Sie brauchen sie eigentlich nicht, sondern schon eine SQL-Zeichenfolge. So können Sie die SQL-Abfrage direkt erstellen. Es gibt auch einen Fallstrick, Feldnamen müssen auf die Whitelist gesetzt werden (oder es kann etwas wie user_role = admin im POST geben), aber wenn Sie ein Array von Feldnamen (passende HTML-Formularfelder) haben, können Sie darüber iterieren und ein Query, Escaping und * quoting * Felder. Letzteres ist eine Sache von großer Bedeutung - alleine zu entkommen hilft nichts. –

+0

Keine Sorge, es hatte einen Grund dazu. Ich habe den Beitrag gelöscht, weil du ja Recht auf die Sachen geschrieben und ehrlich gesagt hast, dass ich nicht darüber streiten wollte. Ich habe den Ansatz in sehr großen Anwendungen verwendet, a) weil er leicht skalierbar war und b) er hat mir geholfen, korrekte Namenskonventionen für Variablen durchzusetzen (normalerweise würde die Schleife Schalter enthalten, um verschiedene Datentypen in bestimmter Weise zu behandeln, Präfixe hinzuzufügen, zu filtern und zu sortieren etc). Da für SQL die Verwendung von gespeicherten Prozeduren immer bevorzugt wird, sind diese Überlegungen nicht wirklich relevant. –

+0

Aber um die Namenskonvention zu erzwingen, brauchen Sie ein Array mit allen erlaubten Variablennamen auf der weißen Liste, oder? Aber in dem Snippet, das Sie gepostet haben, benutzen Sie nur $ _POST, also gab es keine Möglichkeit, die Namen von der Client-Seite zu kontrollieren. –

Antwort

1

OK sortiert es aus, es wie gesagt über neue Daten nur Antwort gesendet werden müssen, nach dem Empfang zurück (Code unten). Auch eine Anmerkung, überraschenderweise ist dieser Weg tatsächlich schneller als mit der JQuery-Schleife.

socket.onopen = function(){ 
    socket.send(proxies[0]+'-'+timeout); 
    proxies.splice(0,1); 
} 

socket.onmessage = function(response){ 
    if (proxies.length > 0) { 
     socket.send(proxies[0]+'-'+timeout); 
     proxies.splice(0,1); 
    } 
document.write(response.data); 
}