2012-03-24 2 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; 

Во всяком случае я думал, что это будет явно избежать необходимости вымывать выход, так как изначально я был на самом деле делает только одна сторона отправки клиента, а затем имеет сообщение возврата, отправленное в цикле на стороне сервера; это не сработало, потому что я не смог бы отключить вывод и должен был дождаться завершения цикла. Однако его изменение не помогло, так как мне еще нужно подождать, пока не будет отправлена ​​последняя отправка на сервер, и только тогда данные будут отправлены клиенту. Есть ли у вас какие-либо идеи, как я могу получить живые «обновления» в обработке, то есть вывести ответ сервера по мере его отправки?

EDIT: Я получаю смешанные результаты с setTimout(socket.send(this),1000). Я понял, что, вероятно, для того, чтобы сбросить данные, новые данные должны отправляться только после того, как предыдущие данные были обработаны и полностью записаны на стороне сервера. Если это доказывает на самом деле правильно, должно быть возможно написать клиентскую сторону, чтобы он только отправлял новые данные после того, как получил результаты от предыдущих отправленных данных; это обеспечит эффект получения желаемых «живых» обновлений.

Приветствия

+0

Извините за резкий комментарий и извините за прослушивание вас снова, но всего несколько объяснений, которые я чувствую себя обязанными. Зачем создавать глобальные переменные из POST? Вы им действительно не нужны, а скорее строка SQL. Таким образом, вы можете напрямую создать SQL-запрос. Также есть ловушка, имена полей должны быть включены в белый список (или в POST может быть что-то вроде user_role = admin), но если у вас есть массив имен полей (соответствующие полям формы HTML), вы можете перебирать его и создавать запрос, экранирование и * цитирование * полей. Последнее - вещь очень важная - побега сама по себе ничего не помогает. –

+0

Не беспокойтесь, у него была причина. Я удалил сообщение, потому что да, вы были правы в вещах и честно сказали, что я не хотел спорить об этом. Я использовал этот подход в очень больших приложениях: а) потому что он был легко масштабируемым, и б) он помог мне обеспечить правильные соглашения об именах имен (обычно цикл включал бы переключатель для обработки различных типов данных определенным образом, добавления префиксов, фильтрации и сортировки и т.д). Что касается SQL, то использование хранимых процедур всегда предпочтительнее, поэтому эти соображения не очень актуальны. –

+0

Но для обеспечения соблюдения любого соглашения об именовании вам нужен массив со всеми именами разрешенных переменных в любом случае, не так ли? Но в опубликованном фрагменте вы использовали только $ _POST, поэтому не было возможности контролировать имена, поступающие с клиентской стороны. –

ответ

1

OK разобрались, это было, как сказано выше, новые данные должны быть отправлены только после получения ответа обратно (код ниже). Также одно замечание, на удивление, на самом деле происходит быстрее, чем при использовании jquery loop.

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); 
} 
Смежные вопросы