服务端:
while (my $client = $server->accept())
{
$client->autoflush(1);
print "Welcome " . $client->peerhost . "/n";
my $pid = open(my $fh_read, "-|") or warn $!;
if ($pid)
{ # parent
while (<$fh_read>)
{
print $client $_ or die $!;
}
#close($fh_read) || warn "kid exited $?";
}
else
{ # child
exec("date")
|| die "can't exec program: $!";
}
print $client "Goodbye./n";
#$client->close();
}
$server->close();
1.在while循环条件中,将$client定义为私有my,可以防止最后忘记close($client);,从而导致客户端阻塞。
注意要在while循环条件中定义成my,如果在外面定义成私有,最后还是需要调用close($client)。
open也有这样的用法,将文件描述符$fh定义为私有my,最后程序也会自动close($fh)。
以上程序的close(),我都屏蔽了,程序正常运行。
2.不知道为什么,我在open一个管道时,会报Illegal seek,至今原因不明。
打开一个管道也可以用pipe,不过我习惯open这种方式,“-|”表示打开读的管道,“|-”表示打开写的管道。
3.向客户端发送数据时,记得最后一定要有回车分隔。
print $client $_中的$_是由exec结果所得,该字符串默认有/n结尾。
客户端:
客户端比较简单,接受服务端的消息方法有
1.单条消息用 my $message = <$server>;
2.多条消息用 my @message = <$server>;