我正在尝试学习perl以及事件驱动编程。我制作了一个客户端,它连接到特定的IP和端口号,并通过套接字侦听消息。
my $socket = new IO::Socket::INET (
PeerHost => $server,
PeerPort => '5000',
Proto => 'tcp',
);
然后我监听服务器消息,还想从STDIN中读取。为此,我尝试使用CPAN 中的库Event::Lib
实现事件编程
sub do_client{
my ($ev,$type) = @_;
my $event = shift;
my $fh = $event->fh;
$cl_data = <$fh>;
chomp $cl_data;
print $socket "$cl_datarn";
$event->add;
}
sub do_server{
my ($ev,$type) = @_;
my $event = shift;
my $fh = $event->fh;
$sv_data = <$fh>;
chomp $sv_data;
print "$sv_datan";
$event->add;
}
event_new($socket, EV_WRITE, &do_server)->add;
event_new(STDIN, EV_WRITE, &do_client)->add;
event_mainloop;
现在的问题是。在从套接字读取每一行之后,我认为处理程序都会进入STDIN事件,等待我的返回。如果我不按键盘上的返回,处理程序永远不会从套接字读取并打印它。(它无法同步客户端和服务器通信)
这就是我获得输出的方式。
Connection established
[Server]
**** waits here for me to enter return ***
Whats your name?
我正在尝试创建一个聊天客户端。因此,每当我向终端写入时,它都应该转到STDIN事件,每当套接字中有消息时,它就会打印出消息。请告诉我我在这里做错了什么。
您可能希望在代码中使用更高级别的模块。当你做<STDIN>
时,它会阻止
AnyEvent通过事件驱动编程提供非阻塞IO
my $w; $w = AnyEvent->io (fh => *STDIN, poll => 'r', cb => sub {
chomp (my $input = <STDIN>);
warn "read: $inputn";
undef $w;
});
它将在STDIN上不阻塞,然后用清除观察者
undef $w;