gpt4 book ai didi

perl - 使用 AnyEvent (Perl) 创建单线程服务器

转载 作者:行者123 更新时间:2023-12-04 23:58:54 26 4
gpt4 key购买 nike

我正在创建一个本地服务来监听 localhost 并提供一个基本的调用和响应类型接口(interface)。我想开始的是一个婴儿服务器,您可以通过 telnet 连接到它并回显它接收到的内容。

我听说 AnyEvent 对此非常有用,但是 AnyEvent::Socket 的文档并没有给出如何做到这一点的很好的例子。我想用 AnyEvent、AnyEvent::Socket 和 AnyEvent::Handle 来构建它。

现在,小服务器代码如下所示:

#!/usr/bin/env perl

use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;

my $cv = AnyEvent->condvar;

my $host = '127.0.0.1';
my $port = 44244;

tcp_server($host, $port, sub {
my($fh) = @_;

my $cv = AnyEvent->condvar;

my $handle;
$handle = AnyEvent::Handle->new(
fh => $fh,
poll => "r",
on_read => sub {
my($self) = @_;
print "Received: " . $self->rbuf . "\n";
$cv->send;
}
);

$cv->recv;
});

print "Listening on $host\n";

$cv->wait;

这不起作用,如果我 telnet 到 localhost:44244 我得到这个:
EV: error in callback (ignoring): AnyEvent::CondVar: 
recursive blocking wait attempted at server.pl line 29.

我想如果我了解如何制作一个小型单线程服务器,我可以通过 telnet 连接到它并打印出它给定的任何内容,然后等待更多输入,我可以从那里走得更远。有任何想法吗?

最佳答案

您在回调中阻塞。这是不允许的。有几种方法可以处理这个问题。我的偏好是启动 Coro tcp_server 回调中的线程。但如果没有 Coro,您可能正在寻找这样的东西:

#!/usr/bin/env perl5.16.2

use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;

my $cv = AE::cv;

my $host = '127.0.0.1';
my $port = 44244;

my %connections;
tcp_server(
$host, $port, sub {
my ($fh) = @_;

print "Connected...\n";

my $handle;
$handle = AnyEvent::Handle->new(
fh => $fh,
poll => 'r',
on_read => sub {
my ($self) = @_;
print "Received: " . $self->rbuf . "\n";
},
on_eof => sub {
my ($hdl) = @_;
$hdl->destroy();
},
);
$connections{$handle} = $handle; # keep it alive.

return;
});

print "Listening on $host\n";

$cv->recv;

请注意,我只在等待一个 condvar。我正在存储句柄以使 AnyEvent::Handle 对象保持更长时间。清理 $self->rbuf 的工作留给读者作为练习:-)

问题交叉发布, answer, too :-)

关于perl - 使用 AnyEvent (Perl) 创建单线程服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13260802/

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