使用Event :: Lib创建一个perl聊天客户端

时间:2013-11-19 18:37:49

标签: perl sockets event-handling client

我正在尝试学习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_data\r\n";
$event->add; 
}

sub do_server{
my ($ev,$type) = @_;
my $event = shift;
my $fh = $event->fh;
$sv_data = <$fh>;
chomp $sv_data;
print "$sv_data\n";
$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事件,并在套接字中有一个时打印出消息。 请告诉我这里做错了什么。

1 个答案:

答案 0 :(得分:1)

您可能希望在代码中使用更高级别的模块。当你执行<STDIN>时它会阻止

AnyEvent通过事件驱动编程提供非阻塞IO

   my $w; $w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
      chomp (my $input = <STDIN>);
      warn "read: $input\n";
      undef $w;
   });

将在STDIN上阻止,然后用

清除观察者
undef $w;