AnyEventサンプルその3

AnyEvent::HandleやAnyEvent::Socketを使う。今回はtelnetを使わないでtcp_connectを使ってみた。
サーバ側がエコーバックする時に改行文字を入れないとデッドロックしてしまう部分ではまった。line形式のデータのやり取りでは改行が必須なのかな。

サーバ側

use warnings;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;
use Data::Dumper;

tcp_server '127.0.0.1', 8888, sub {
    my ($fh) = @_ or die;
    my $handle = AnyEvent::Handle->new(
        fh       => $fh,
        on_error => sub { shift->destroy; warn "ON ERROR $!" },
        on_eof   => sub { shift->destroy; warn "ON EOF $!" },
    );

    my $read_w;
    $read_w = AnyEvent->io(
        fh   => $fh,
        poll => 'r',
        cb   => sub {
            warn AnyEvent->now . " READ EVENT";
            undef $read_w;
            $handle->on_read(
                sub {
                    warn AnyEvent->now . " ON READ";
                    my $write_w;
                    $write_w = AnyEvent->io(
                        fh   => $fh,
                        poll => 'w',
                        cb   => sub {
                            warn AnyEvent->now . " NOW WRITING";
                            undef $write_w;
                            $handle->push_write(
                                $handle->{rbuf} . " echo !!\n" );
                            $handle->destroy;
                        }
                    );
                }
            );
        }
    );

};
AE::cv->recv;

クライアント側

use strict;
use warnings;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;
use Data::Dumper;

my $cv = AE::cv;
tcp_connect '127.0.0.1', 8888, sub {    my ($fh) = @_ or die;
    my $handle = AnyEvent::Handle->new(
        fh       => $fh,
        on_error => sub { shift->destroy; warn "ON_ERROR $!"; },
        on_eof   => sub { shift->destroy; warn "ON_EOF $!"; },
    );
    my $write_w;
    $write_w = AnyEvent->io(
        fh   => $fh,
        poll => 'w',
        cb   => sub {
            warn AnyEvent->now . " WRITE EVENT!!";
            undef $write_w;
            $handle->push_write('test');
            my $read_w;
            $read_w = AnyEvent->io(
                fh   => $fh,
                poll => 'r',
                cb   => sub {
                    warn AnyEvent->now . " READ EVENT";
                    undef $read_w;
                    $handle->unshift_read(
                        line => sub {
                            $cv->send( $_[1] );
                            $handle->destroy;
                        }
                    );
                }
            );
        }
    );   

};
print $cv->recv;
print "\n";