【发布时间】:2015-09-24 04:11:50
【问题描述】:
出于学习目的,我正在尝试用 Perl 编写一个基本的网络聊天应用程序。我目前有一个服务器和客户端程序,几乎可以按照我的意愿运行。多个客户端可以连接到服务器并向其发送消息。但是,我不确定如何将消息从一个客户端发送到另一个客户端,并且希望在这里朝着正确的方向推动。这是我到目前为止的代码,想法?
注意:这是我第一次尝试使用网络或使用 Perl 进行适当的项目,因此任何其他关于如何编写它的指导也将不胜感激。
chat_server.pl
#!/usr/bin/perl -w
# chat_server.pl
use strict;
use IO::Socket::INET;
my $port = shift or die "Port required!\n";
my $socket = IO::Socket::INET->new(
LocalPort => $port,
Proto => 'tcp',
Listen => SOMAXCONN
) or die "Can't create socket: $!!\n";
my $child;
print "Listening for clients on $port...\n";
REQUEST:
while(my $client = $socket->accept) {
my $addr = gethostbyaddr($client->peeraddr, AF_INET);
my $port = $client->peerport;
if($child = fork) {
print "New connection from $addr:$port\n";
close $client;
next REQUEST;
} die "fork failed!\n" unless defined $child;
while (<$client>) {
print "[$addr:$port] says: $_";
print $client "[$addr:$port] says: $_";
}
}
close $socket;
chat_client.pl
#!/usr/bin/perl -w
# chat_client.pl
use strict;
use IO::Socket::INET;
my $port = shift or die "No port\n";
my $server = shift or die "No server\n";
my $client_socket = IO::Socket::INET->new(
PeerPort => $port,
PeerAddr => $server,
Proto => 'tcp'
) or die "Can't create send socket: $!!\n";
my $child;
if($child = fork) {
while(1) {
sleep(1);
print scalar <$client_socket>;
}
}
die "fork failed!\n" unless defined $child;
print "Connected to $server:$port!\n";
do {
print "> ";
print $client_socket $_ if defined $_;
} while(<STDIN>);
print "Closing connection";
close $client_socket;
【问题讨论】:
-
这实际上对您的经验水平非常有利。我要立即说的唯一一件事是,您应该确保您的学习材料是最新的。命令行或shebang线上的
-w早已被上级use warnings取代。您还应该在while内的服务器代码中声明$child,紧接在if之前