ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/eg/chat_client
(Generate patch)

Comparing AnyEvent-MP/eg/chat_client (file contents):
Revision 1.3 by elmex, Fri Aug 7 09:07:37 2009 UTC vs.
Revision 1.4 by root, Fri Aug 14 15:38:02 2009 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2 2
3use AnyEvent; 3use common::sense;
4use AnyEvent::Handle;
5use AnyEvent::MP; 4use AnyEvent::MP;
6 5
7my $server_node = "127.0.0.1:1299"; 6my ($nick, $servernode) = @ARGV;
8 7
9initialise_node "slave/", $server_node; 8initialise_node "slave/", $servernode;
10 9
11print "initialized client\n"; 10$| = 1;
12 11
13my $client_port = port; 12my $servernode = (resolve_node $servernode)->recv;
14 13
15snd $server_node, lookup => "chatter", $client_port, "resolved"; 14my $port = port;
16 15
17my $resolved_cv = AnyEvent->condvar; 16my ($client, $server);
18my $server_port;
19 17
20# setup a receiver callback for the 'resolved' message: 18sub server_connect {
21rcv $client_port, resolved => sub { 19 print "\rconnecting...\n";
22 my ($tag, $chatter_port_id) = @_;
23 20
24 print "Resolved the server port 'chatter' to $chatter_port_id\n"; 21 $client = port {
25 $server_port = $chatter_port_id; 22 print "\r \r@_\n> ";
23 0
24 };
25 mon $client, sub {
26 print "\rdisconnected @_\n";
27 &server_connect;
28 };
26 29
27 $resolved_cv->send; 30 $server = spawn $servernode, "::client_connect", $client, $nick;
28 1 31 mon $server, $client;
32}
33
34server_connect;
35
36my $w = AE::io 0, 0, sub {
37 chomp (my $line = <STDIN>);
38 print "> ";
39 snd $server, $line;
29}; 40};
30 41
31# lets block the client until we have resolved the server port. 42print "> ";
32$resolved_cv->recv; 43AE::cv->recv;
33 44
34# now setup another receiver callback for the chat messages:
35rcv $client_port, message => sub {
36 my ($tag, $msg) = @_;
37
38 print "chat> $msg\n";
39 0
40};
41
42# send a 'join' message to the server:
43snd $server_port, join => "$client_port";
44
45sub send_message {
46 my ($msg) = @_;
47
48 snd $server_port, message => $msg;
49}
50
51# make an AnyEvent condition variable for the 'quit' condition
52# (when we want to exit the client).
53my $quit_cv = AnyEvent->condvar;
54
55my $stdin_hdl = AnyEvent::Handle->new (
56 fh => *STDIN,
57 on_error => sub { $quit_cv->send },
58 on_read => sub {
59 my ($hdl) = @_;
60
61 $hdl->push_read (line => sub {
62 my ($hdl, $line) = @_;
63
64 if ($line =~ /^\/quit/) { # /quit will end the client
65 $quit_cv->send;
66 } else {
67 send_message ($line);
68 }
69 });
70 }
71);
72
73$quit_cv->recv;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines