Anyevent::socket和Coro::Handle组合,echo server(完结)

之前这个组合怎么也搞不定,主要还是对coro的概念有些不清楚.

时隔半年,重新写了一版,居然就顺利通过了.回过头看,其实和当初的错误版本几乎都看不出区别.(就是多了use Coro;一行)

可谓失败和成功只有一线之隔.再次吐槽作者,给个完整的例子不行啊.

要点,AE的事件循环仍然保留,用于监听.

每个连接起一个协程,在coro内部用无阻塞handle读取.

这个就和coro::socket+coro::handle是基本一样的,

#!/bin/env perl
#使用anyevent:socket和coro::handle改造(ok)
use warnings;
use strict;

use Time::HiRes qw(time);
use Coro;
use AnyEvent;
use AnyEvent::Impl::Perl;
use AnyEvent::Socket;
use Coro::Handle; 

my $port   = 11212;

my @coro;

my $cv = AnyEvent->condvar;

tcp_server undef, $port, sub {
   my ($s) = @_
      or die "tcp_server: $!";
   $cv->begin;
   &doit($s);   };

$cv->recv;


sub doit($){
  #my ($fh)=@_;
  my ($nh)=@_;
  my $fh = unblock + $nh;

        push @coro, async {
                $fh->autoflush(1);
       my $line="";
    my $buf="";
  	while(my $line=$fh->read($buf,32)){	
        print $fh->fileno, " ", $line, " ";
        $fh->print($line);          
        
      }    
            print "no more data, close socket " . $fh->fileno . "\n";
            $fh->close;
            #关闭协程
           #$cv->end;  #退出server
         }
         
}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值