gpt4 book ai didi

perl - 我可以通过 Web 套接字动态更新 HTML 吗?

转载 作者:行者123 更新时间:2023-12-01 06:03:00 24 4
gpt4 key购买 nike

我是 Web 套接字的新手,我正在围绕与 IoT 设备对话的命令行界面构建 Web GUI。有些命令需要几秒钟才能运行,因为我将它们发送到大型设备网络。

如果我可以在响应进入时将单个设备响应传递给文本区域(类似于终端窗口),那将非常有帮助。

我在客户端和服务器之间使用 Web 套接字连接。这是我要达到的效果的简化示例。

#!/usr/bin/env perl

use strict;
use warnings;
use Mojolicious::Lite;

get '/' => 'index';

websocket '/get_loop' => sub {

my $c = shift;

$c->app->log->debug("Websocket opened");

$c->on(message => sub {

my ($c, $msg) = @_;

for (my $i = 0; $i < 10; $i++) {
$c->send("$i\n");
$c->app->log->debug("$i\n");
sleep (1);
};
});

$c->on(finish => sub {
my ($c, $code, $reason) = @_;
$c->app->log->debug("WebSocket closed with status $code");
});
};

app->start;

__DATA__

@@ index.html.ep
<html>
<head>
<title>Websocket Test</title>
<style type="text/css">
textarea {
height: 200px;
width: 100px;
}
</style>
</head>
<body>
<h1>Websocket Test</h1>
<textarea id="terminal" readonly></textarea>
<script type="text/javascript">
var ws = new WebSocket('ws://127.0.0.1:3000/get_loop');
var terminal = document.getElementById('terminal');
ws.onopen = function() {
ws.send('start');
};
ws.onmessage = function(event) {
var msg = event.data;
terminal.innerHTML += msg;
};
</script>
</body>
</html>

在此示例中,我有一个从 0 到 14 的循环计数。我试图通过 Web 套接字将每个计数发送到 textarea,以便在循环计数时显示。该循环在我的实际应用程序中模拟 CLI 响应。这甚至可以通过网络套接字完成吗?

-编辑-

修改上面的 web socket 代码并使用 Mojo::IOLoop->recurring无需借助多线程即可解决问题。
websocket '/get_loop' => sub {

my $c = shift;

$c->app->log->debug("Websocket opened");

my $id;
$c->on(message => sub {

my ($c, $msg) = @_;

my $count = 0;
$id = Mojo::IOLoop->recurring(1 => sub {
$c->send("$count\n");
$c->app->log->debug($count);
sleep (1);
$c->finish if $count++ == 10;
});
});

$c->on(finish => sub {
my ($c, $code, $reason) = @_;
Mojo::IOLoop->remove($id);
$c->app->log->debug("WebSocket closed with status $code");
});
};

最佳答案

您需要在页面上制作 javascript websocket 监听器并将传递的数据插入 DOM。

const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});

socket.addEventListener('message', function (event) {
var div = document.getElementById('divID');
div.innerHTML = event.data;
});

哦,我明白了,您的问题是关于服务器 Perl 代码的。我的建议是在 Perl 中创建一个静态连接数组,在打开事件时分配它们,在关闭事件时取消分配它们。您不需要在 on message sub 中将数据发回。您可以使用 Event::Lib $event->add( [$timeout] ) 然后枚举打开的套接字(到各种不同的 Web 客户端)调用 $c->send("$i\n");它完全是异步的,因此无需将其绑定(bind)到 on message sub。服务器可以随时执行此操作。

在 PERL 中创建静态变量:
http://www.perlmonks.org/?node_id=8299

关于perl - 我可以通过 Web 套接字动态更新 HTML 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43152590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com