You need to understand that one socket is needed to
listen for connections, and another
different socket is needed for each active client. So ultimately you will need to keep a list of what clients are connected.
I modifed your example code to spawn one thread per client.
It now has a separate listener thread also. What the code below still lacks is: tracking of client connections (a must-have for a chat program); sending output to all active clients; and many other niceities such as proper naming of clients, etc. Hopefully this will get you started though.
use strict;
use threads;
use threads::shared;
use IO::Socket;
my $keep_running : shared = 1;
my $sender_thread = threads->new(\&do_send);
my $listener_thread = threads->new(\&do_listen);
$sender_thread->detach();
$listener_thread->join();
sub do_listen {
my $listener_sock = IO::Socket::INET->new(LocalHost => "127.0.
+0.1", LocalPort => 8080, Type => SOCK_STREAM, Proto =>
'tcp', Listen => 1);
my $client_sock;
my $ClientNumber = 0;
STDOUT->autoflush(1);
print "Starting listener\n";
while ($keep_running) {
my $client_sock = $listener_sock->accept();
my $reader_thread = threads->new(\&do_read, $client_so
+ck, $ClientNumber);
last unless defined($client_sock);
$ClientNumber++;
$reader_thread->detach();
print "Accepted a connection\n";
}
print "Listener stopped\n";
}
sub do_read {
my $sock = shift;
my $ClientNumber = shift;
while (<$sock>) {
print $ClientNumber . ":" . $_;
}
print "Client " . $ClientNumber . " disconnected\n";
}
sub do_send {
# any messages that the local user types
while (my $line = <STDIN>) {
# TODO: you need to iterate through all active clients and sen
+d them
# , not just one
# $sock->print($line);
# $sock->flush();
# patch for development
sleep 1;
}
$keep_running = 0;
}
I tested it myself with two clients and got this output:
Starting listener
Accepted a connection
0:hi
Accepted a connection
1:hi
0:Yo #1
1:Whaddup #0!