Viewing file: socket_anyevent.pl (2.17 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
=pod
=head1 NAME
examples/socket_anyevent.pl - AnyEvent version of examples/socket.pl with automatic selection of Event library
=head1 AUTHOR
Vikas N Kumar
=cut
use strict; use warnings; use Prima qw(InputLine Edit Application); use AnyEvent; use AnyEvent::Socket;
my $loop = AnyEvent->condvar; my $impl = AnyEvent::detect; print "AnyEvent implementation is $impl\n";
my $w = Prima::MainWindow-> create( size => [ $::application-> width * 0.6, $::application-> height * 0.6], text => 'AnyEvent demo', onDestroy => sub { # when the window is closed we want AnyEvent to also exit $loop->send; }, );
my $e = $w-> insert( Edit => pack => { side => 'top', expand => 1, fill => 'both'}, text => '', wordWrap => 1, );
my $il = $w-> insert( InputLine => text => 'Enter URL:', current => 1, pack => { side => 'bottom', fill => 'x'}, onKeyDown => sub { my ( $me, $code, $key, $mod) = @_; return unless $key == kb::Enter; $me-> clear_event; my $t = $me-> text;
return $e-> text( "Invalid URL") unless $t =~ m/^(?:http:\/\/)?([^\/]*)((?:\/.*$)|$)/; my ($remote, $uri, $port) = ($1,$2,80); $uri = '/' unless length $uri;
$e-> text("");
tcp_connect $remote, $port, sub { my ($fh, $host, $port) = @_;
return $e-> text("error:$!") unless $fh;
# make a GET request on the socket syswrite $fh, "GET $uri HTTP/1.1 \r\n\r\n"; shutdown $fh, 1;
# create an event watcher on the socket $fh for reading my $ev; $ev = AnyEvent->io(fh => $fh, poll => 'r', cb => sub { my $response = ''; my $len = sysread $fh, $response, 10240; if (not defined $len or $len <= 0) { undef $ev; # remove the watcher } else { $e-> text( $e->text . $response ); } }); }; 0; # keep void context of tcp_connect }, ); $il-> select_all;
# replace 'run Prima' with the below timer my $timer = AnyEvent->timer(after => 0, interval => 1/20, cb => sub { $::application->yield; }); # start the AnyEvent loop $loop->recv;
|