package Server;
use IO::Socket;
use IO::Select;
use strict;
sub new
{
my $class = shift;
my %args = @_;
my $self = {
parentWnd => $args{parentWnd}
};
bless $self, $class;
return $self;
}
sub initServer {
my $self = shift;
my $server = IO::Socket::INET::->new(Proto => 'tcp',
LocalPort => 55555,
Listen => 1,
Reuse => 1
) or die "Server can't start: $!"
+;
my $readable_handles = new IO::Select();
$readable_handles->add($server);
my $buf;
while (1) {
# select() blocks until a socket is ready to be read or written
my ($new_readable) = IO::Select->select($readable_handles,
undef, undef, 0);
# If it comes here, there is at least one handle
# to read from or write to. For the moment, worry only about
# the read side.
foreach my $sock (@$new_readable) {
if ($sock == $server) {
my $new_sock = $sock->accept();
# Add it to the list, and go back to select because the
# new socket may not be readable yet.
print "Adding it \n";
$readable_handles->add($new_sock);
}
#- server part
else {
#print STDERR "Reading...\n";
print "Reading...$sock \n";
# It is an ordinary client socket, ready for reading.
$buf = <$sock>;
if ($buf) {
#- print the buffer
print "Read $buf\n";
# .... Do stuff with $buf
} else {
# Client closed socket. We do the same here, and remove
# it from the readable_handles list
print "removing it \n";
$readable_handles->remove($sock);
close($sock);
}
}
}
}
}
1;
## the Client.pm ###
package Client;
use IO::Socket;
sub new
{
my $class = shift;
my %args = @_;
my $self = {
parentWnd => $args{parentWnd}
};
bless $self, $class;
return $self;
}
sub initClient {
my $self = shift;
my $client = IO::Socket::INET::->new(
Proto => 'tcp',
PeerAddr => 'localhost',
PeerPort => 55555
) or die "Client can't connect: $!";
my @msgs = 1 .. 10;
for (@msgs) {
print $client "$_\n";
sleep 1;
}
}
1;
|