AnyEventサンプルその4

いろいろと書き方がある?ので苦労する。$handle->destroyするということはソケット接続を切るということでもあるので、どの時点できるのかをきちんと通信を頭の中に思い浮かべないといけない。

サーバ側

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

$|++;
tcp_server '127.0.0.1', 8888, sub {    my ($fh) = @_;
    my $handle = AnyEvent::Handle->new(
        fh       => $fh,
        on_error => sub { shift->destroy; warn "ON_ERROR $!" },
        on_eof   => sub { shift->destroy; warn "ON_EOF $!"; },
    );

    $handle->on_read(
        sub {
            warn "ON_READ";
            $handle->unshift_read(
                json => sub {
                    warn "READ2!";
                    my ( $handle, $data ) = @_;
                    warn Dumper $data;
                    $handle->push_write(
                        json => { foo => $data->{foo} . " echo!!" } );
                    $handle->destroy;
                }
            );
        }
    );   
};

sub _time {
    warn AnyEvent->now;
}
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) = @_;
    my $handle = AnyEvent::Handle->new(
        fh       => $fh,
        on_error => sub { shift->destroy; warn "ON_ERROR"; },
        on_eof   => sub { shift->destroy; warn "ON_EOF"; },
    );

    $handle->push_write( json => { foo => 'bar' } );
    $handle->push_read(
        json => sub {
            my ( $handle, $data ) = @_;
            $handle->destroy;
            $cv->send( $data->{foo} );
        }
    );
};

sub _time {
    warn AnyEvent->now;
}
print $cv->recv;