Net-ClientServer
view release on metacpan or search on metacpan
lib/Net/ClientServer.pm view on Meta::CPAN
$run = $_run unless $run;
push @daemon_arguments, run => sub {
if ( $pidfile ) {
write_pidfile( $pidfile );
$SIG{TERM} = $SIG{INT} = sub { Daemon::Daemonize::delete_pidfile( $pidfile ) }
}
$run->( $platform );
};
}
push @daemon_arguments, %daemon;
Daemon::Daemonize->daemonize( chdir => undef, close => 1, @daemon_arguments );
if ( $pidfile ) {
do { sleep 1 } until -s $pidfile;
}
}
sub serve {
my $self = shift;
my $platform = $self;
my %server_options = %{ $self->_server_options };
for (qw/ start stop serve run /) {
my $routine = "${_}_routine";
next unless my $code = $self->$routine;
$server_options{$_} ||= sub { $code->( @_, $platform ) };
}
Net::ClientServer::Server->serve( host => $self->host, port => $self->port, %server_options );
}
# Stoled from Net::Server
sub stdin2socket {
my $self = shift;
my $socket = shift;
my $fileno = fileno $socket;
close STDIN;
if ( defined $fileno ) {
open STDIN, "<&$fileno" or die "Unable open STDIN to socket: $!";
}
else {
*STDIN= \*{ $socket };
}
STDIN->autoflush( 1 );
}
# Stoled from Net::Server
sub stdout2socket {
my $self = shift;
my $socket = shift;
my $fileno = fileno $socket;
close STDOUT;
if ( defined $fileno ) {
open STDOUT, ">&$fileno" or die "Unable open STDOUT to socket: $!";
}
else {
*STDOUT= \*{ $socket } unless $socket->isa( 'IO::Socket::SSL' );
}
STDOUT->autoflush( 1 );
}
# Stoled from Net::Server
sub stderr2socket {
my $self = shift;
my $socket = shift;
my $fileno = fileno $socket;
close STDERR;
if ( defined $fileno ) {
open STDERR, ">&$fileno" or die "Unable open STDERR to socket: $!";
}
else {
*STDERR= \*{ $socket } unless $socket->isa( 'IO::Socket::SSL' );
}
STDERR->autoflush( 1 );
}
1;
__END__
=pod
=head1 NAME
Net::ClientServer - A client/server platform for IPC on localhost
=head1 VERSION
version 0.0007
=head1 SYNOPSIS
The minimum configuration (specify a port):
my $platform = Net::ClientServer->new( port => 8020 );
$platform->server_socket;
...
if ( $platform->started ) { # Will attempt to connect to the listening socket
$platform->client_socket;
}
Save server state to disk:
$platform = Net::ClientServer->new( port => 8020, name => 'net-client-server' );
# Server pid will be stored in $HOME/.net-client-server/pid
# On daemonization, stderr will be outputted to $HOME/.net-client-server/stderr
With a basic startup & serve/accept routine:
my $port = 8020;
$platform = Net::ClientServer->new(
port => $port,
start => sub {
print STDERR "Server listening on $port\n";
},
serve => sub {
my $client = shift; # The client socket
$client->print( "Hello, World.\n" );
},
);
$platform->start;
=head1 DESCRIPTION
Net::ClientServer is a tool for implementing a basic client/server architecture using a single platform (particularly useful when doing IPC on the localhost). It is easily configured for daemonizing and maintaining state on disk (pidfile & stderr).
The minimum configuration is very simple, requiring only a port number:
my $platform = Net::ClientServer->new( port => 8020 );
( run in 1.410 second using v1.01-cache-2.11-cpan-d7f47b0818f )