2012-03-24 13 views
4

Mojolicious :: Liteモジュールを使用して、プロトコルを処理するWebsocketsサーバーを実行しています。これは私が現在、クライアントのために使用していますテストコードです:ウェブソケットとMojoliciousでフラッシュ?

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

そして、もともと私が実際にやっていたように、サーバー

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; 

はとにかく私は、これは明らかに出力をフラッシュする必要性を避けるだろうと思いましたただ1つはクライアント側に送信し、次にサーバ側でループで返送メッセージを送信することです。私は出力をフラッシュすることができず、ループが終了するのを待たなければならないので、これは機能しませんでした。しかし、それを変更することは、最後のサーバー側の送信が完了し、その後にデータがクライアントに送信されるまで待たなければならないため、役に立たなかった。 処理中にライブ更新を取得する方法、つまり送信時にサーバーの応答を出力する方法はありますか?

編集: setTimout(socket.send(this),1000)と混在しています。私が思ったのは、おそらくデータをフラッシュするためには、以前のデータが処理され、サーバー側で完全に書き込まれた後に新しいデータが送信されなければならないということです。これが実際に正しいと証明された場合、送信された前のデータからの結果を受け取った後にのみ新しいデータを送信するようにクライアント側を書き込むことが可能でなければなりません。これは、所望の「ライブ」更新を得る効果を達成する。

+0

厳しいコメントを申し訳ありませんし、もう一度あなたを悩ませて申し訳ありませんが、私は義務を感じるわずか数説明。なぜPOSTからグローバル変数を作成するのですか?あなたは実際にそれらを必要としませんが、むしろすでにSQL文字列です。したがって、SQLクエリを直接作成することができます。落とし穴もあります。フィールド名はホワイトリストにする必要があります(または、POSTにuser_role = adminのようなものがあるかもしれませんが)フィールド名の配列(一致するHTMLフォームフィールド)を持っているなら、それを反復してクエスチョン、エスケープ、*引用フィールド。後者は非常に重要なことです。エスケープするだけでは何の助けにもなりません。 –

+0

心配しなくても、それには理由がありました。はい、私はそれについて議論したくないと言って正直言って、あなたが正しかったので、投稿を削除しました。私は非常に大規模なアプリケーションでこのアプローチを使いました。それは容易にスケーラブルであり、b)正しい変数命名規則を適用するのに役立ちました(通常、ループには異なるデータ型を特定の方法で扱い、接頭辞を追加し、等)。ストアドプロシージャのSQL使用は常に優先されるため、これらの考慮事項は実際には関係ありません。 –

+0

しかし、どのような命名規則を適用するにしても、許可されているすべての変数名をホワイトリストに入れた配列が必要です。しかし、スニペットでは$ _POSTのみを使用しているので、クライアント側から来る名前を制御する方法はありませんでした。 –

答えて

1

OK

乾杯は、新しいデータが(下記のコード)バック応答を受信した後にのみ送信されなければならない上に、それは次のように言われた、それを整理しました。また、驚いたことに、この方法は実際にはjqueryループで行うよりも高速です。

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); 
} 
関連する問題