网箱和Mojolicious冲洗?

时间:2012-03-24 17:11:26

标签: perl html5 websocket

我使用Mojolicious :: Lite模块运行websockets服务器来处理协议。这是我目前用于客户端的测试代码:

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;

无论如何我认为这显然会避免需要刷新输出,因为最初我实际上只做一个发送客户端,然后在服务器端的循环中发送返回消息;这不起作用,因为我无法刷新输出,必须等待循环完成。然而,改变它并没有帮助,因为我仍然必须等到最后一次服务器端发送完成,然后才将数据发送到客户端。 您是否知道如何在处理中获得实时“更新”,即在发送时输出服务器响应?

编辑: 我与setTimout(socket.send(this),1000)的结果好坏参半。我的想法是,为了获得数据刷新,只有在先前的数据处理完毕并在服务器端完全写入后才能发送新数据。如果事实证明这是正确的,那么应该可以编写客户端,以便它在收到先前发送的数据的结果后才发送新数据;这将达到获得所需“实时”更新的效果。

干杯

1 个答案:

答案 0 :(得分:1)

确定将其排序,如上所述,只有在收到回复响应后才能发送新数据(下面的代码)。还有一点需要注意,这种方式实际上比使用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);
}