If the client is as simple as shown, I think the code is ok - there are a couple of chances for race conditions in regards to $TX not being in the correct state when the timer fires, but for a command-line script that may be acceptable (I'd just add some $SIG{INT} handlers to server and client). If this is part of a larger app, here's how I would have coded it:
my $ua = Mojo::UserAgent->new; my $conn = $ua->websocket("ws://localhost:8080/" => sub { my ($ua, $tx) = @_; say "WebSocket handshake failed!" and return unless $tx->is_websocket; my $id = Mojo::IOLoop->recurring(5 => sub { my @command = qw/ RUN STOP /; my $command = $command[rand @command]; say "Client > $command"; $tx->send($command); }); $tx->on(finish => sub { my ($tx, $code, $reason) = @_; say "WebSocket closed with status $code."; Mojo::IOLoop->remove($id); Mojo::IOLoop->stop_gracefully; }); $tx->on(text => sub { my ($tx, $bytes) = @_; say "Server > ", $bytes; }); }); Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
In reply to Re: Mixing asynchronous data feed with synchronous program flow control
by haukex
in thread Mixing asynchronous data feed with synchronous program flow control
by Your Mother
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |