Le 26 mai 2009 16:46, Mark Morgan <[email protected]> a écrit : > From the P:C:S:TCP docs, it looks like you should be able to do this > by passing a reference to it via ClientArgs constructor argument. > You may need to end up weakening it in client, to allow the server > sessions and anything else the client heap is referring to to be > reaped. > > Mark. >
I have found a solution using ClientArgs. However it is currently broken, at least it doesn't work as the documentation says. See my code below. I've shown with JSON what I get in ClientConnected args : - socket is missing - ARG0 is the given ClientArgs. It would me more useful to get Args flattened in ARG0..$#_ The documentation for this code has still many TODOs and no one is complaining on RT so probably not many use it. http://search.cpan.org/~rcaputo/POE-1.005/lib/POE/Component/Server/TCP.pm#Default_Child_Connection_Sessions<http://search.cpan.org/%7Ercaputo/POE-1.005/lib/POE/Component/Server/TCP.pm#Default_Child_Connection_Sessions> Olivier http://search.cpan.org/~dolmen/ <http://search.cpan.org/%7Edolmen/> #!/usr/bin/perl use strict; use warnings; use Test::More tests => 8; use JSON 'to_json'; use POE qw(Component::Server::TCP Component::Client::TCP); my $host = 'localhost'; my $port = 12344; POE::Component::Server::TCP->new( Alias => "server", Address => $host, Port => $port, ClientArgs => [ {} ], Started => sub { pass "[Server] Started #".$_[SESSION]->ID; my $server_data = $_[HEAP]->{server_data} = $_[ARG0]; # The hash given in Args $server_data->{test} = 42; }, ClientConnected => sub { # According to the documentation ARG0 is the socket, ARG1 is ClientArgs # But the doc doesn't match the code :( # We get ClientArgs in ARG0, but it would be more consistent to get it flattened diag(to_json([ @_[ARG0..$#_] ])); my $server_data = $_[HEAP]->{server_data} = $_[ARG0]->[0]; # The hash given in Args pass "[Server] ClientConnected #".$_[SESSION]->ID; is($server_data->{test}, 42, "Server HEAP access"); }, ClientInput => sub { pass "[Server] ClientInput #".$_[SESSION]->ID; diag($_[ARG0]); my $server_data = $_[HEAP]->{server_data}; is($server_data->{test}, 42, "Server HEAP access"); }, ClientDisconnected => sub { pass "[Server] ClientDisconnected #".$_[SESSION]->ID; $poe_kernel->post('server', 'shutdown'); }, ); POE::Component::Client::TCP->new( Alias => "client", RemoteAddress => $host, RemotePort => $port, Started => sub { pass "[Client] Started"; }, Connected => sub { pass "[Client] Connected"; $_[HEAP]{server}->put("Hello"); $poe_kernel->yield('shutdown'); }, ServerInput => sub { }, Disconnected => sub { pass "[Client] Disconnected"; }, ); $poe_kernel->run; pass 'Stopped';
