这个组合的语法和传统的uo::scoket::inet基本是一样的
这个实现有一点局限,就是要求echo信息必须v包含\n
因为是用getline方法读取的
#!/bin/env perl
#sever coro::socket+coro::handle来实现(ok)
use strict;
use Coro;
use AnyEvent;
#这个是ae的perl实现,要比EV慢一点点
use AnyEvent::Impl::Perl;
use Coro::Socket;
use Coro::Handle;
my $port = 11212;
#1.创建监听端口
$|++; # 因为print到终端,所以这里要打开autoflush
my $s = Coro::Socket->new(LocalAddr => 'localhost', # 创建一个侦听socket
LocalPort => $port,
Listen => 5,
Proto => 'tcp')
or die $@;
#2.处理handle
my @coro;
while(1){
my ($fh, $peername) = $s->accept;
next unless $peername;
print "accepet new sock at" . $fh->fileno . "\n";
&doit($fh);
}
sub doit($){
my ($fh)=@_;
push @coro, async {
$fh->autoflush(1);
while(my $line=$fh->readline()){
#my $line=$fh->readline();
if(length($line) >0){
print $fh->fileno, " ", $line, " ";
$fh->print($line);
}
}
print "no more data, close socket " . $fh->fileno . "\n";
$fh->close;
#关闭协程
return;
}
}