note
simonz
<p>
Hi,
I have made the following modifications in the server code for asynchronous communication, but the server gui hangs as I start the client.
</p>
<code>
use strict;
use warnings;
use Tk;
use IO::Socket;
use IO::Select;
my $status = '';
my $mw = MainWindow->new;
$mw->geometry("200x200");
my $buttonFrame = $mw->Frame()->pack(-side => 'bottom');
$buttonFrame->Button(-text => 'Start',
-command => sub { init_server(\$mw, \$status) }
)->pack(-side => 'left');
my $displayFrame = $mw->Frame()->pack(-side => 'top');
$displayFrame->Label(-text => 'Status:')->pack(-side => 'left');
$displayFrame->Label(-textvariable => \$status)->pack(-side => 'left');
my $server;
MainLoop;
sub init_server {
my ($mw_ref, $status_ref) = @_;
$server = IO::Socket::INET::->new(
Proto => 'tcp',
LocalPort => 55555,
Listen => 1,
Reuse => 1
) or die "Server can't start: $!";
=cut
my $client = $server->accept();
$client->autoflush;
$$mw_ref->fileevent($client, 'readable', sub {
if (defined(my $read = <$client>)) {
chomp $read;
$$status_ref = $read;
}
});
=cut
#my $client = $server->accept();
$$mw_ref->fileevent($server, 'readable', sub {
my $readable_handles = new IO::Select();
$readable_handles->add($server);
my $buf;
while (1) { #Infinite loop
# select() blocks until a socket is ready to be read or written
my ($new_readable) = IO::Select->select($readable_handles,
undef, undef, 0);
print "Inside while \n";
# 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) {
print "Inside foreach $sock \n";
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.
$readable_handles->add($new_sock);
} else {
# It is an ordinary client socket, ready for reading.
$buf = <$sock>;
if ($buf) {
# .... Do stuff with $buf
$$status_ref = $buf;
} else {
# Client closed socket. We do the same here, and remove
# it from the readable_handles list
$readable_handles->remove($sock);
close($sock);
}
}
}
}
}
);
}
</code>
1055676
1055682