Websockets 和 Mojolicious 冲洗?

Posted

技术标签:

【中文标题】Websockets 和 Mojolicious 冲洗?【英文标题】:Websockets and flushing with Mojolicious? 【发布时间】:2012-03-24 17:11:25 【问题描述】:

我正在使用 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]) => subsleep(int(rand(10))));
    );
;
app->start;

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

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

干杯

【问题讨论】:

抱歉评论过于苛刻,也很抱歉再次打扰您,但我觉得有必要做一些解释。为什么要从 POST 中创建全局变量?您实际上并不需要它们,而是已经是一个 SQL 字符串。因此,您可以直接创建 SQL 查询。也有一个陷阱,必须将字段名列入白名单(或者在 POST 中可能有类似 user_role=admin 的内容),但如果您有一个字段名数组(匹配 html 表单字段),您可以对其进行迭代并创建一个查询、转义和引用字段。后者是非常重要的事情 - 单独逃避无济于事。 不用担心,这是有原因的。我删除了该帖子,因为是的,您在发布的内容上是对的,并且诚实地说我不想为此争论。我在非常大的应用程序中使用了这种方法 a) 因为它易于扩展 b) 它帮助我强制执行正确的变量命名约定(通常循环将包括切换以某种方式处理不同的数据类型、添加前缀、过滤和排序ETC)。至于存储过程的 SQL 用法始终是首选,因此这些考虑因素并不真正相关。 但是要强制执行任何命名约定,您需要一个数组,其中所有允许的变量名都被列入白名单,不是吗?但是在您发布的 sn-p 中,您仅使用 $_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);

【讨论】:

以上是关于Websockets 和 Mojolicious 冲洗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 nginx 设置 Mojolicious?

lighttpd + perl + mojolicious =?

Perl的web框架Mojolicious与异步数据库操作

如何在 Mojolicious 中查找给定路径的路径名称?

关闭连接到 Mojo websocket 的 Mojo::IOLoop 重复事件

如何从 mysql DB 中搜索与 mojolicious perl 中选定的下拉列表相关的内容