Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Event::Lib创建perl聊天客户端_Perl_Sockets_Event Handling_Client - Fatal编程技术网

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

使用Event::Lib创建perl聊天客户端,perl,sockets,event-handling,client,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) = @_; m

我试图学习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;
我正在尝试做一个聊天客户端。因此,每当我向终端写入数据时,它就应该转到stdinevent,每当套接字中有一条数据时,它就会打印出消息。
请告诉我这里做错了什么。

您可能希望在代码中使用更高级别的模块。当您执行
时,它将被阻止

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

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

哼,你用
阻塞了它,它一直读到遇到换行符为止。你不应该在那里使用
。您应该只读取可用的内容,将其添加到缓冲区中,并检查缓冲区中是否有换行符。AnyEvent::IO只在安全读取行时触发事件来解决这一问题。如果OP是在按键时等待的内容,但我没有使用这个oneNo,那么当有数据要读取时,它会触发事件。(“
cb
是每次文件句柄准备就绪时调用的回调。”)可能没有一行查看Event::Lib页面STDIN调用应该是Event\u new(*STDIN,EV\u READ,\&handler)->add(1.5);根据我的回答,我仍然会选择AnyEvent。我建议不要使用Event::Lib——底层的C库很好,但是模块已经损坏,不再维护(不可避免地导致随机内存损坏)。一些更好的选择是事件,油嘴滑舌,电动汽车等。
   my $w; $w = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
      chomp (my $input = <STDIN>);
      warn "read: $input\n";
      undef $w;
   });
undef $w;