我正在使用Mojolicus::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)
的结果喜忧参半。我认为,可能为了刷新数据,必须在服务器端处理并完全写入之前的数据后才能发送新数据。如果事实证明这是正确的,那么应该可以编写客户端,使其仅在收到以前发送的数据的结果后发送新数据;这将达到获得所需"实时"更新的效果。
干杯
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);
}